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

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

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

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

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


当前回答

如果您在单击绿色箭头按钮运行应用程序时遇到此错误,但仍然希望以64位运行应用程序。你可以在VS 2013、2015、2017和2019中这样做

转到:工具>选项>项目和解决方案> Web项目>使用64位版本的IIS Express

或者你可以在项目属性> Web > Bitness中做每个项目

其他回答

对于。net core,确保Ijwhost.dll在输出目录中,有时它没有被复制,这将导致错误。参见https://github.com/dotnet/runtime/issues/38231和https://stackoverflow.com/a/58773266/9665729

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

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

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

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

当我想从c# /WPA调用本机DLL时,我也遇到了这个问题。下面的步骤适用于我的项目。属性->构建->平台目标x64/x86(更改此选项,然后工作)。

在我的例子中,我使用了一个小的.exe,它通过反射重新加载引用的dll。所以我只需要做这些步骤就可以了:

从解决方案资源管理器上的项目属性,在构建选项卡,我从x86选择目标平台

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

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

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