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

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

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

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

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


当前回答

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

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

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

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

其他回答

在我的例子中,我使用的是c#中的原生DLL。这个DLL依赖于其他几个缺失的DLL。一旦添加了其他dll,一切就正常了。

我们在。net核心中也遇到了同样的问题。解决方案是下载32位的。netcore运行时,让你的项目目标是x86

在csproj文件中添加

  <PropertyGroup>
    <PlatformTarget>x86</PlatformTarget>  
  </PropertyGroup>

  <PropertyGroup>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>    
  </PropertyGroup>

这是用于Windows机器,你必须调整路径,如Linux/OSX

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

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

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

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

使用Visual Studio 2019,当我想要运行测试(直接从VS运行MSTest)时,我遇到了类似的问题。在我的情况下,我只有一个x64本机DLL,我收到了这个错误消息。首先,我认为这是因为Visual Studio运行在x86上,但这个页面帮助我解决了这个问题:

将单元测试作为64位进程运行

它说

将项目设置为任意CPU 显式定义处理器体系结构

我做了这两件事(我显式地设置了x64),然后我的测试开始工作。