2010-12-16 6 views
2

Ich habe eine C# -Anwendung, die eine DLL verwendet, wie ich C++ für einige nicht verwaltete Funktionen der user32-API benötigen (ich kann PInvoke nicht für verwenden Das). Ich kompiliere sowohl die Anwendung als auch die DLL für x86-Architekturen, und alles funktioniert gut unter Windows 7 32 Bit. Jetzt ist das Problem, unter Windows 7 64 Bit, stürzt die Anwendung ab, wenn ich versuche, die Funktion zu verwenden, die auf der DLL beruht (aber der ganze Rest funktioniert gut).C# -Programm und C++ DLL kompiliert für 32-Bit-Systemabsturz auf 64-Bit-System

Ich vermute, dass dies ein 32/64 Bit-Problem ist, also habe ich versucht, die DLL für x64-Architekturen neu zu kompilieren, und jetzt kann ich zur Laufzeit auswählen, welche DLL zwischen x86 und x64 geladen werden soll. Aber es stürzt immer noch ab, wenn ich versuche, die Funktion zu verwenden, die auf der DLL beruht (was sinnvoll ist, wenn ich versuche, eine 64-Bit-DLL in ein 32-Bit-Programm zu laden). Ich habe noch nicht versucht, sowohl die Anwendung als auch die DLL für x64 zu kompilieren. Ich vermute, es würde funktionieren, aber ich würde zwei verschiedene Installateure brauchen, und ich möchte nicht dorthin gehen. Irgendeine Ahnung?

+0

Wenn beide für x86 kompiliert werden, sollte es funktionieren. Kannst du es auf einem 64bit System debuggen und mehr Details geben? – Henrik

+0

Das 64-Bit-System, das ich für den Test verwendet habe, war der Computer eines Freundes. Um es zu debuggen, muss ich Windows 7 64 Bit in vmware oder vbox installieren, was ich tun kann, aber es wird einige Zeit dauern, es einzurichten. – Manu

+0

Haben Sie die 32-Bit-CRT-DLLs auf dem 64-Bit-System? –

Antwort

2

Bei der Verwendung von nicht verwaltetem Code müssen Sie sicherstellen, dass Ihre .Net-App auf demselben Subsystem (32-Bit oder 64-Bit) ausgeführt wird. Da Sie angegeben haben, dass die DLL, die Sie laden, für x86 gedacht ist, erzwingen Sie, dass das .Net nur für die x86-Plattform erstellt. Diese Einstellung finden Sie in den Eigenschaften Ihres Projekts auf der Registerkarte "Erstellen". Der Standardwert ist eine beliebige CPU. Ändern Sie die Einstellung in x86, damit sie mit Ihrer nicht verwalteten DLL übereinstimmt, und Sie sollten in Ordnung sein, unabhängig davon, ob Sie auf einem 64-Bit- oder 32-Bit-Betriebssystem ausgeführt werden.

+0

Ich werde dieses Wochenende versuchen, und ich werde auf einem 64-Bit-System testen. Danke :) – Manu

+0

Ok, das hat den Trick gemacht. Ich dachte, dass die ausführbare Datei als x86 kompiliert wurde, aber es wurde tatsächlich als "Any CPU" kompiliert, wie Sie vermutet haben, und das war die einzige Wahl, die ich in der Liste aus dem Konfigurationsbereich erhielt. Ich musste tief in die Einstellungen gehen, um eine Wahl zwischen x86 und x64 zu finden. Also habe ich x86 statt Any CPU ausgewählt, und beim Testen unter Windows 7 64-bit hat das Programm funktioniert! Nun, das Feature innerhalb der DLL funktioniert nicht richtig, aber zumindest startet das Programm und gibt keine Fehlermeldung mehr. Also werde ich diese Antwort nehmen :) Danke Nathan! – Manu