2009-04-16 10 views
3

Ich habe eine C# (.NET 3.5, VS2005 Professional) -Anwendung, die nicht verwaltete 32-Bit-Bibliothek in C/C++ geschrieben verwendet. API, die ich verwende, ist wie folgt:unmanaged DLL-Code

void * Initialize (int x);

voic GetData (void *);

Und das funktioniert, wenn ich es auf Windows XP 32-Bit laufen, aber auf Windows XP64bit es wirft Ausnahme:

Unbehandelte Ausnahme: System.Reflection.TargetInvocationException: Ausnahme wurde durch das Ziel für einen Aufruf ausgelöst wurde. ---> System.BadImageFormatException: Es wurde versucht, ein Programm mit einem falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B) bei Aktuelizator.CommonLibrary.InitializeRingBuffer (Int32 dim) bei Aktuelizator.AktuelizatorWService.AktuelizatorWS..ctor()

Diese nicht verwalteten DLL Arbeit unter 64-Bit-XP, wenn sie von 32-Bit genannt unmanages Anwendung writetn in C/C++.

Hat jemand eine Idee?

Antwort

2

Ihre Build-Konfiguration Platform ist auf 'Any CPU' gesetzt, dh auf einem 64-Bit-Betriebssystem läuft es als 64 Bit und Sie können die DLL nicht laden. Setzen Sie es stattdessen auf x86, dies zwingt es, unabhängig vom Betriebssystem als 32 Bit zu laufen, und Ihre DLL wird geladen.

+0

Das hat das Problem gelöst! Danke! – Mita

1

Es klingt wie Ihre DLL nur 32 Bit kompiliert wird, aber Sie versuchen, es aus einem 32-Bit- und 64-Bit-Prozess aufzurufen. Ersteres wird natürlich funktionieren. Das später wird jedoch nicht. 32-Bit-DLLs können nur in 32-Bit-Prozessen verwendet werden. Versuchen Sie, die DLL auf ein 64-Bit-Ziel zu kompilieren, und lassen Sie die C# -App diese verwenden.

+1

Ja ist es, aber es funktioniert, wenn es von 32bit kompilierte Anwendung auf XP64bit aufgerufen wird. Kann es getan werden, ohne dll neu zu kompilieren? – Mita

+0

Eine 32-Bit-ausführbare Datei, die auf einem 64-Bit-Betriebssystem läuft, denkt, dass sie in der 32-Bit-Welt läuft - Google "WOW64" für mehr. Versuchen Sie, die App über eine 32-Bit-Umgebung wie C: \ Windows \ SysWOW64 \ cmd.exe zu starten. Der Prozess wird also wie die DLL 32 Bit sein. – eran

+0

BTW, mein Vorschlag gilt für den Fall, dass Sie mit der App und DLL, die Sie haben, auskommen müssen, benötigen daher eine Problemumgehung. Wenn Sie die App neu erstellen können, löst die Lösung von Stephen Martin das Problem, anstatt es zu umgehen. – eran

0

Überprüfen Sie alle Parameter, die als Int32 definiert sind, die eigentlich IntPtr sein sollten.

+0

Ich habe es zweimal überprüft, es hat nicht geholfen – Mita

Verwandte Themen