2010-04-28 78 views
27

我有一個DLL(FreeType),它當然是32位(標題:IMAGE_FILE_MACHINE_I386)。BadImageFormatException加載32位DLL時,目標是x86

我想使用它從C#代碼,使用DllImport。

我的應用程序的目標是x86,IntPtr.Size是4,進程是32位。

但我得到BadImageFormatException(異常來自HRESULT:0x8007000B)。什麼可能是錯誤的?

當然,我用64位Windows 7

+3

投票結束爲「不是真正的問題」 - 這個問題的基礎是一個誤解; OP發現有問題的DLL加載正確 – STW 2010-06-30 18:19:05

回答

34

從我的理解,特別是專爲x86和在64位操作系統上運行的程序集只能加載庫專爲x86或一個BadImageFormatException會拋出。在64位操作系統中,爲任何CPU或x64構建的程序集在嘗試加載x86庫時會引發相同的異常。

因此,假設沒有什麼令人難以置信的奇怪是怎麼回事,我會確保你設置你的應用程序打開項目屬性,單擊生成選項卡上打造爲86。確保'平臺目標'設置爲'x86',而不是任何CPU。

或者,你可以嘗試尋找該DLL的64位版本,用於測試目的。

+0

我100%確定我的C#應用​​程序是32位的。我甚至使用CORFLAGS檢查它: 版本:V2.0.50727 CLR部首:2.5 PE:PE32 CorFlags:3 ILONLY:1 32BIT:1 簽名:0 – Coder 2010-04-28 10:48:35

+3

@Eric史密斯我有同樣的問題...這固定它。非常感謝! – bsara 2012-06-04 16:39:10

+2

+1。有同樣的問題,併成功修復它。 – 2013-04-16 02:23:11

5

OK,似乎是一個假警報。它與bitness沒有關係,只有freetype所依賴的其他DLL丟失。但是,錯誤消息可能會更有幫助。

+0

這一半解決了我與BadImageFormatException的問題 - 我忘了複製依賴的DLL。不幸的是,現在我得到原DLL上的DllNotFoundException ... – jarmond 2012-07-06 15:20:31

+2

請將此問題標記爲已回答 – 2013-08-28 11:02:42

+0

@jarmond確保您構建了發行版(不是調試版) – 2017-11-05 14:07:21

-1

我有同樣的異常在微軟的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; )

6

重新編譯選項中構建 「任何CPU」 的dll - >平臺。

enter image description here

+1

這解決了我的問題!謝謝 – 2014-01-22 19:42:26

+0

任何CPU不在我的列表中。 – ShadowMan 2017-07-28 14:17:59

0

您可以嘗試勾選 「屬性」 - > 「生成」 - > 「允許不安全的代碼」。

2

我有一個類似的錯誤。 我可以通過添加用於調試的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

4

從C#調用64位的C DLL時,得到了同樣的錯誤。我不得不手動將C#Properties->Build->Platform targetAny Cpu更改爲x64。顯然Any Cpu有時是NoCpu。

0

當您使用Visual Studio構建本機應用程序/ DLL時,它會獲得該版本Visual Studio的「可再發行」包的依賴關係。它包含的DLL如msvcr100.dllmsvcp100.dll(各種值爲100)。

在我的情況下,我看到目標機器的Windows/system32目錄中的那些DLL,所以我認爲一切都很好。事實證明,這些DLL是x64!我不知道爲什麼名爲system32的目錄包含64位DLL。所以我搜索了我的Visual Studio 2010目錄中的所有名爲msvc*.dll的文件,並找到msvcr100.dllmsvcp100.dll的x86版本。我將它們複製到目標機器上(在我的程序路徑中可以訪問的地方),一切正常。

我希望這可以幫助別人面對微軟的瘋狂。

0

我懷疑這個例外的常見原因在問題第一次提出後的8年中有所變化。在使用VS 2017年我的設置我發現,取消選中「首選32位」解決了這個問題:

Uncheck "Prefer 32-bit" in the Build options

這使我從C++負載正確內置64位的DLL。相反,檢查這個選項應該使32位DLL正確加載。

相關問題