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

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

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

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

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


当前回答

在我的情况下,这是错误的文件内容。DLL是从网上下载的,但是DLL的内容是HTML页面:D 尝试检查它是否是二进制文件,如果它看起来像正确的DLL:)

其他回答

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

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

不知何故,配置管理器中的Build复选框没有选中我的可执行文件,所以它仍然运行旧的Any CPU构建。在我修复了这个问题之后,Visual Studio抱怨它无法调试程序集,但重启后就修复了这个问题。

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

在csproj文件中添加

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

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

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

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