37

我有一个 DLL (FreeType),它肯定是 32 位的(头文件:IMAGE_FILE_MACHINE_I386)。

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

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

但是我得到了 BadImageFormatException(来自 HRESULT 的异常:0x8007000B)。有什么问题?

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

4

11 回答 11

44

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

因此,假设没有发生任何令人难以置信的奇怪事情,我会确保您已通过打开项目属性并单击“构建”选项卡将应用程序设置为构建为 x86。确保“平台目标”设置为“x86”而不是任何 CPU。

或者,您可以尝试查找 64 位版本的 DLL 用于测试目的。

于 2010-04-28T10:39:41.940 回答
8

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

在此处输入图像描述

于 2013-06-24T22:09:28.540 回答
7

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

于 2010-04-28T11:08:34.767 回答
5

从 C# 调用 64 位 C Dll 时出现相同的错误。我不得不手动将 C#Properties->Build->Platform target从更改Any Cpux64. 显然Any Cpu有时是NoCpu。

于 2016-05-14T17:12:35.930 回答
4

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

于 2012-10-17T05:57:57.453 回答
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

于 2016-01-21T10:50:57.727 回答
2

我怀疑自从第一次提出这个问题以来的 8 年里,这个例外的共同原因已经发生了变化。在我使用 VS 2017 的设置中,我发现取消选中“首选 32 位”解决了这个问题:

在构建选项中取消选中“首选 32 位”

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

于 2018-02-26T04:25:05.363 回答
1

您在 C# 项目中使用属性,并将“平台目标”更改为 x64。 在此处输入图像描述

于 2018-06-20T02:52:47.717 回答
1

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

就我而言,我在目标机器的Windows/system32目录中看到了这些 DLL,所以我认为一切都很好。原来那些 DLL 是 x64 的!我不知道为什么一个名为的目录system32包含 64 位 DLL。所以我在我的 Visual Studio 2010 目录中搜索了所有名为 的内容msvc*.dll,并找到了 x86 版本的msvcr100.dllmsvcp100.dll。我将它们复制到目标机器(在从我的程序路径可访问的地方),一切都很好。

我希望这可以帮助其他人面对微软的疯狂。

于 2017-05-05T17:46:15.357 回答
0

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

于 2013-12-13T17:56:45.900 回答
-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 不是没有错误的;)

于 2013-05-06T08:57:18.487 回答