2011-04-08 199 views
2

我正在使用Visual Studio 2008 Express。我有一個解決方案,用於在Vista 32位上正常工作。我最近切換到Windows 7,其中一部分停止工作。這是我的設置: - 非託管C++靜態庫,「庫」 - 包裝用於C#的「庫」功能的託管C++ DLL,「DLL」 - 引用「DLL」的託管C++控制檯應用程序引用「DLL」的C#應用​​程序在Windows 7上構建Visual Studio 2008 Express C++ 32位64位

運行C#應用程序時,我收到了DLL引發的異常,我通常會通過託管C++控制檯應用程序調試類似這樣的問題,因爲我可以接着進入非託管庫代碼。

的問題是,我現在得到了一些奇怪的符號的彈出式對話框和路徑「C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ dw20.exe」,然後我的應用程序捕獲例外當我嘗試運行託管C++控制檯應用程序時,「System.BadImageFormatException:不是有效的Win32應用程序」。我花了很多時間研究這個問題,任何甚至類似於有用建議的東西都指的是在C#中構建X86項目,但與C++無關。我嘗試將/MACHINE:X86添加到庫的Librarian選項中,但似乎不起作用。

我想簡而言之,我的問題是,我如何才能確保我的非託管C++靜態庫的構建,以便它可以在32位系統上運行?

回答

0

更改從任何CPU構建到32或86,你應該沒有問題。你可能在C++代碼中使用了一個windows 32 dll,這就是爲什麼它不能在其他平臺上工作。 任何CPU->配置管理器,然後更改爲32或86

+0

在C++中沒有類似的選項,只能在C#中使用。唯一可用的構建是Win32。 – Hazerider 2011-04-08 13:27:11

4

dw20.exe程序是「Doctor Watson」,該程序報告未處理的運行時異常和崩潰。不是問題的根源,僅僅是信使。雖然在這個問題中沒有提到,但我必須假設你的Windows 7版本是64位的,這是System.BadImageFormatException的常見來源。

異常是由64位進程嘗試加載爲32位構建的DLL而引起的。或者相反,32位進程無法加載64位DLL。這個過程的尷尬程度取決於您的案例中的EXE,一個C++/CLI應用程序。它沒有選擇使用簡單的項目設置來更改它,就像C#項目一樣。您可以通過添加平臺來實現,「x64」使用64位編譯器並生成64位可執行文件。我敢肯定,在C++ Express版中沒有提供,但沒有64位編譯器,因此必須始終生成32位可執行文件。

這對於解釋異常沒有多大餘地。如果您更改了C#類庫項目中的平臺目標設置,它只會出錯。從x86或AnyCPU到x64。將其更改回AnyCPU。項目+屬性,生成選項卡。如果您已經做了任何事情來解決Express版本的限制,比如從SDK版本中添加64位編譯器,那麼這也將成爲問題源頭的主要紅旗。

+0

確實,我在Windows 7 64位。我沒有意識到有一個32位版本。所以奇怪的是,我的C#應用​​程序正在工作,它是給我這個C++/CLI控制檯應用程序。它被設置爲以MachineX86爲目標。我想我應該提及它正在工作一段時間,然後在我不得不卸載Windows 7 Service Pack 1(與ADO類型庫混淆)時下地獄。 – Hazerider 2011-04-08 14:25:19

+0

那麼,你有一個因果關係。如何影響你的代碼是完全無法從你的問題中推測出來的。 – 2011-04-08 14:30:53

相關問題