加载32位DLL时BadImageFormatException,目标是x86

时间:2010-04-28 10:20:19

标签: c# dll dllimport 32bit-64bit badimageformatexception

我有一个DLL(FreeType),肯定是32位(标题:IMAGE_FILE_MACHINE_I386)。

我想使用DllImport从C#代码中使用它。

我的应用程序的目标是x86,IntPtr.Size是4,进程是32位。

但是我得到BadImageFormatException(HRESULT的异常:0x8007000B)。有什么不对?

当然我使用的是64位Windows 7。

11 个答案:

答案 0 :(得分:41)

据我所知,专门为x86构建并在64位操作系统中运行的程序集只能加载为x86构建的库,否则将抛出BadImageFormatException。在64位操作系统中,为Any CPU或x64构建的程序集在尝试加载x86库时会抛出相同的异常。

因此,假设没有什么令人难以置信的奇怪的事情,我会确保您通过打开项目属性并单击Build选项卡将应用程序设置为x86。确保'Platform Target'设置为'x86'而不是任何CPU。

或者,您可以尝试查找64位版本的DLL以进行测试。

答案 1 :(得分:7)

使用Build中的“Any CPU”选项重新编译dll - >平台。

enter image description here

答案 2 :(得分:6)

好吧,好像是虚假警报。它与bitness无关,只有其他DLL缺少freetype所依赖的。但是,错误消息可能更有帮助。

答案 3 :(得分:4)

此外,对于Web应用程序需要解析在IIS 7中运行32位应用程序。请参阅http://www.fishofprey.com/2009/04/badimageformatexception-in-iis-70-on-64.html

答案 4 :(得分:4)

从C#调用64位C Dll时出现相同的错误。我必须手动将C#Properties->Build->Platform targetAny Cpu更改为x64。显然Any Cpu有时候是NoCpu。

答案 5 :(得分: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

答案 6 :(得分:2)

我怀疑这个例外的常见原因在问题首次提出后的8年内发生了变化。在我使用VS 2017的设置中,我发现取消选中"首选32位"解决了这个问题:

Uncheck "Prefer 32-bit" in the Build options

这使我从C ++构建的64位DLL正确加载。相反,选中此选项应该可以正确加载32位DLL。

答案 7 :(得分:1)

当您使用Visual Studio构建本机应用程序/ DLL时,它会依赖于"可再发行的"该版本的Visual Studio的包。它包含msvcr100.dllmsvcp100.dll等DLL(对于100的各种值)。

在我的情况下,我在目标机器的Windows/system32目录中看到了这些DLL,所以我觉得一切都很顺利。事实证明那些DLL是x64!我不知道为什么名为system32的目录包含64位DLL。因此,我在Visual Studio 2010目录中搜索了名为msvc*.dll的所有内容,并找到了msvcr100.dllmsvcp100.dll的x86版本。我把它们复制到目标机器上(在我的程序路径可以访问的地方),一切都很顺利。

我希望这有助于其他人面对微软的疯狂。

答案 8 :(得分:1)

您在C#项目中使用“属性”,然后将“平台目标”更改为x64。 enter image description here

答案 9 :(得分:0)

您可以尝试选中“属性”选项 - > “构建” - > “允许不安全的代码”。

答案 10 :(得分:-1)

我在MS Visual C#Express 2010中有相同的异常。我使用Dependency Walker和MiTeC EXE Explorer检查了所有构建.dll和.exe文件,所有内容都是为32位构建的!

最后,我的.csproj文件中缺少以下行:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'MY_CONFIG|x86'">
    ...
    <PlatformTarget>x86</PlatformTarget>
    ...
</PropertyGroup>

我不知道它为什么会丢失......我猜MS Visual C#Express 2010并非无错误;)