我有一個DLL(FreeType),它當然是32位(標題:IMAGE_FILE_MACHINE_I386)。BadImageFormatException加載32位DLL時,目標是x86
我想使用它從C#代碼,使用DllImport。
我的應用程序的目標是x86,IntPtr.Size是4,進程是32位。
但我得到BadImageFormatException(異常來自HRESULT:0x8007000B)。什麼可能是錯誤的?
當然,我用64位Windows 7
我有一個DLL(FreeType),它當然是32位(標題:IMAGE_FILE_MACHINE_I386)。BadImageFormatException加載32位DLL時,目標是x86
我想使用它從C#代碼,使用DllImport。
我的應用程序的目標是x86,IntPtr.Size是4,進程是32位。
但我得到BadImageFormatException(異常來自HRESULT:0x8007000B)。什麼可能是錯誤的?
當然,我用64位Windows 7
從我的理解,特別是專爲x86和在64位操作系統上運行的程序集只能加載庫專爲x86或一個BadImageFormatException會拋出。在64位操作系統中,爲任何CPU或x64構建的程序集在嘗試加載x86庫時會引發相同的異常。
因此,假設沒有什麼令人難以置信的奇怪是怎麼回事,我會確保你設置你的應用程序打開項目屬性,單擊生成選項卡上打造爲86。確保'平臺目標'設置爲'x86',而不是任何CPU。
或者,你可以嘗試尋找該DLL的64位版本,用於測試目的。
OK,似乎是一個假警報。它與bitness沒有關係,只有freetype所依賴的其他DLL丟失。但是,錯誤消息可能會更有幫助。
這一半解決了我與BadImageFormatException的問題 - 我忘了複製依賴的DLL。不幸的是,現在我得到原DLL上的DllNotFoundException ... – jarmond 2012-07-06 15:20:31
請將此問題標記爲已回答 – 2013-08-28 11:02:42
@jarmond確保您構建了發行版(不是調試版) – 2017-11-05 14:07:21
此外,對於網絡的應用需求解決運行在IIS 7的32位應用程序請參閱http://www.fishofprey.com/2009/04/badimageformatexception-in-iis-70-on-64.html
我有同樣的異常在微軟的Visual C#2010年快遞我檢查了所有建立.dll和.exe文件與Dependency Walker和MiTeC EXE Explorer一起構建了32位!
在最後,這是下面一行在我的.csproj文件丟失:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'MY_CONFIG|x86'">
...
<PlatformTarget>x86</PlatformTarget>
...
</PropertyGroup>
我不知道爲什麼它缺少...我想微軟的Visual C#快訊2010年不bugfree; )
重新編譯選項中構建 「任何CPU」 的dll - >平臺。
這解決了我的問題!謝謝 – 2014-01-22 19:42:26
任何CPU不在我的列表中。 – ShadowMan 2017-07-28 14:17:59
您可以嘗試勾選 「屬性」 - > 「生成」 - > 「允許不安全的代碼」。
我有一個類似的錯誤。 我可以通過添加用於調試的ucrtbase.dll或ucrtbased.dll以及用於調試的vcruntime140.dll或vcruntime140d.dll到可執行文件的目錄中來解決此問題。 我認爲140取決於您使用的Visual Studio的版本號。
ucrtbase.dll通常在於C:\Windows\System32
。 vcruntime140.dll在於C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\x86\vcruntime140.dll
您可以在這裏找到更多的信息:http://blogs.msdn.com/b/vcblog/archive/2015/03/03/introducing-the-universal-crt.aspx
從C#調用64位的C DLL時,得到了同樣的錯誤。我不得不手動將C#Properties->Build->Platform target
從Any Cpu
更改爲x64
。顯然Any Cpu
有時是NoCpu。
當您使用Visual Studio構建本機應用程序/ DLL時,它會獲得該版本Visual Studio的「可再發行」包的依賴關係。它包含的DLL如msvcr100.dll
和msvcp100.dll
(各種值爲100)。
在我的情況下,我看到目標機器的Windows/system32
目錄中的那些DLL,所以我認爲一切都很好。事實證明,這些DLL是x64!我不知道爲什麼名爲system32
的目錄包含64位DLL。所以我搜索了我的Visual Studio 2010目錄中的所有名爲msvc*.dll
的文件,並找到msvcr100.dll
和msvcp100.dll
的x86版本。我將它們複製到目標機器上(在我的程序路徑中可以訪問的地方),一切正常。
我希望這可以幫助別人面對微軟的瘋狂。
我懷疑這個例外的常見原因在問題第一次提出後的8年中有所變化。在使用VS 2017年我的設置我發現,取消選中「首選32位」解決了這個問題:
Uncheck "Prefer 32-bit" in the Build options
這使我從C++負載正確內置64位的DLL。相反,檢查這個選項應該使32位DLL正確加載。
投票結束爲「不是真正的問題」 - 這個問題的基礎是一個誤解; OP發現有問題的DLL加載正確 – STW 2010-06-30 18:19:05