2009-04-16 234 views
3

我有一個使用C/C++編寫的非託管32位庫的C#(.NET 3.5,VS2005專業版)應用程序。我使用的API是這樣的:非託管dll代碼

void * Initialize(int x);

voic GetData(void *);

而這作品時,我的Windows XP 32位運行,但在Windows XP64bit它拋出異常:

未處理的異常:System.Reflection.TargetInvocationException:異常已通過調用的目標引發異常。 ---> System.BadImageFormatException:試圖加載格式不正確的程序。 (異常來自HRESULT:0x8007000B) 在Aktuelizator.CommonLibrary.InitializeRingBuffer(的Int32暗) 在Aktuelizator.AktuelizatorWService.AktuelizatorWS..ctor()

這些非託管的DLL的下64位XP的工作從32位調用時取消管理在C應用程序writetn/C++。

有沒有人有任何想法?

回答

2

您的構建配置平臺設置爲'任何CPU',這意味着在64位操作系統上它運行64位,並且您無法加載dll。將它設爲x86,這將強制它運行爲32位而不管操作系統和您的DLL將加載罰款。

1

它聽起來像你的DLL只編譯爲32位,但你試圖從32位和64位進程調用它。當然,前者會起作用。但後者不會。 32位DLL只能用於32位進程。嘗試將DLL編譯爲64位目標,並讓C#應用程序使用該目標。

+1

是的,但它在從XP64bit上運行的32位編譯應用程序中調用時起作用。可以不用重新編譯dll來完成? – Mita 2009-04-16 10:24:02

+0

在64位操作系統上運行的32位可執行文件認爲它運行在32位的世界 - 谷歌「WOW64」的更多。嘗試從32位環境(例如C:\ Windows \ SysWOW64 \ cmd.exe)啓動應用程序,因此該過程將是32位的,如DLL。 – eran 2009-04-16 11:06:43

+0

順便說一句,我的建議適用於你必須做的應用程序和DLL你有,因此需要一個解決方法。如果您可以重建應用程序,Stephen Martin的解決方案將解決問題而不是繞過它。 – eran 2009-04-16 11:17:21

0

檢查所有定義爲Int32的參數,實際上應該是IntPtr。