我从64位系统上的32位非托管DLL调用函数。我得到的是:

BadImageFormatException:试图加载格式不正确的程序。(异常来自HRESULT: 0x8007000B)

首先,我把我的项目设置为任何CPU平台,所以我把它们都改为x86,但这个错误仍然发生。这是我知道的唯一解决办法。

dll没有损坏,因为我可以将它们与其他程序一起使用(我没有源代码)。我想也许它没有找到一个依赖,但我检查了一下,它们都在那里。另外,它不会在这种情况下抛出DllNotFoundException吗?

我还能做什么?在您说“改用64位非托管DLL”之前,请允许我指出没有一个DLL。;)


当前回答

如果你使用的是任意CPU,如果选择了32位选项,你可能会遇到这个问题:

确保在项目属性的Build选项卡中取消选中此选项!

其他回答

这篇文章有点偏离主题,但是搜索这个错误消息把我带到了这里。

如果您正在通过团队系统进行构建并得到此错误,则构建定义流程选项卡具有“MSBuild Platform”设置。如果设置为“自动”,您可能会遇到此问题。将其更改为“X86”也可以解决该错误。

我也遇到过这个问题。这里所有的建议都试过了,但都没用。

我找到了另一个东西来检查,它帮我解决了这个问题。在Visual Studio中,右键单击项目并打开“属性”。点击“编译”(或“构建”)选项卡,然后点击底部的“高级编译选项”。

检查下拉菜单“Target CPU”。它应该与您正在构建的“平台”相匹配。也就是说,如果你正在构建“任何CPU”,那么“目标CPU”应该是“任何CPU”。通过激活所有的平台,检查这个设置。

可能导致此异常的另一个原因是Dll的目标平台缺少c++可重分发文件。在虚拟机上测试时,我很难找到答案。

还请注意使用的dll文件(在我的情况下是“WebView2Loader.dll”)的版本是非常重要的。我遇到了几乎相同的问题“Microsoft.WebView2.FixedVersionRuntime.101.0.1210.39。当我试图使用MMC管理单元中的WebView2组件与“HTMLView”或“FormView”类型时。

我只是将引用的dll文件复制到项目可访问的适当路径(您可以先将其放在项目输出文件旁边进行测试),然后WebView2浏览器开始按预期运行。微软的错误消息有时(至少在我的情况下)有点误导,没有传达足够的信息。

我收到了“BadImageFormatException”,通常发生在你混合平台目标(例如,在一个针对x86的应用程序中使用X64编译的dll文件,反之亦然)或混合本机代码和. net时,但这根本不是我的问题。我希望这能帮助那些可能陷入困境的人。

我能够通过将我的构建版本与服务器上的. net版本匹配来解决这个问题。

我双击。exe只是为了看看会发生什么,它告诉我安装4.5....

所以我把它降级到4.0,它起作用了!

所以确保你的版本匹配。它在我的开发盒上运行良好,但服务器有较旧的。net版本。