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

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

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

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

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


当前回答

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

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

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

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

其他回答

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

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

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

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

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

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

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

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

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

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

在我的案例中,同样的错误发生在出版之后。我以前用另一个平台配置发布过。

解决方案是首先清理发布文件夹,然后才能工作。

(或者将“删除现有文件”选项设置为true)