我有一个 DLL (FreeType),它肯定是 32 位的(头文件:IMAGE_FILE_MACHINE_I386)。
我想使用 DllImport 从 C# 代码中使用它。
我的应用程序的目标是 x86,IntPtr.Size 是 4,进程是 32 位。
但是我得到了 BadImageFormatException(来自 HRESULT 的异常:0x8007000B)。有什么问题?
当然,我使用的是 64 位 Windows 7。
我有一个 DLL (FreeType),它肯定是 32 位的(头文件:IMAGE_FILE_MACHINE_I386)。
我想使用 DllImport 从 C# 代码中使用它。
我的应用程序的目标是 x86,IntPtr.Size 是 4,进程是 32 位。
但是我得到了 BadImageFormatException(来自 HRESULT 的异常:0x8007000B)。有什么问题?
当然,我使用的是 64 位 Windows 7。
据我了解,专门为 x86 构建并在 64 位操作系统中运行的程序集只能加载为 x86 构建的库,否则将引发 BadImageFormatException。在 64 位操作系统中,为 Any CPU 或 x64 构建的程序集在尝试加载 x86 库时将引发相同的异常。
因此,假设没有发生任何令人难以置信的奇怪事情,我会确保您已通过打开项目属性并单击“构建”选项卡将应用程序设置为构建为 x86。确保“平台目标”设置为“x86”而不是任何 CPU。
或者,您可以尝试查找 64 位版本的 DLL 用于测试目的。
使用 Build -> Platform 中的“Any CPU”选项重新编译 dll。
好吧,好像是个误报。它与位数无关,只是缺少freetype所依赖的其他DLL。但是,错误消息可能更有帮助。
从 C# 调用 64 位 C Dll 时出现相同的错误。我不得不手动将 C#Properties->Build->Platform target
从更改Any Cpu
为x64
. 显然Any Cpu
有时是NoCpu。
此外,对于 web 应用程序需要解决在 IIS 7 中运行 32 位应用程序。请参阅http://www.fishofprey.com/2009/04/badimageformatexception-in-iis-70-on-64.html
我有一个类似的错误。我可以通过将用于调试的 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
我怀疑自从第一次提出这个问题以来的 8 年里,这个例外的共同原因已经发生了变化。在我使用 VS 2017 的设置中,我发现取消选中“首选 32 位”解决了这个问题:
这使我从 C++ 构建的 64 位 DLL 正确加载。相反,选中此选项应该可以正确加载 32 位 DLL。
您在 C# 项目中使用属性,并将“平台目标”更改为 x64。 在此处输入图像描述
当您使用 Visual Studio 构建本机应用程序/DLL 时,它会依赖于该版本 Visual Studio 的“可再发行”包。它包含 DLLmsvcr100.dll
和msvcp100.dll
(对于 100 的各种值)。
就我而言,我在目标机器的Windows/system32
目录中看到了这些 DLL,所以我认为一切都很好。原来那些 DLL 是 x64 的!我不知道为什么一个名为的目录system32
包含 64 位 DLL。所以我在我的 Visual Studio 2010 目录中搜索了所有名为 的内容msvc*.dll
,并找到了 x86 版本的msvcr100.dll
和msvcp100.dll
。我将它们复制到目标机器(在从我的程序路径可访问的地方),一切都很好。
我希望这可以帮助其他人面对微软的疯狂。
您可以尝试检查选项“属性”->“构建”->“允许不安全代码”。
我在 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 不是没有错误的;)