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

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

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

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

我还能做什么?在您说“改用64位非托管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

其他回答

我用Windows的方式解决了这个问题。在检查所有设置、清理解决方案并重新构建之后,我简单地关闭解决方案并重新打开它。然后它工作了,所以VS可能没有在清洁过程中处理掉一些东西。 当合乎逻辑的解决方案不起作用时,我通常会求助于不合逻辑(或看似不合逻辑)的解决方案。Windows没有让我失望。:)

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

基于@paibamboo的回答

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

我的同事选中了这个框(他明确地查找了它),但出现了错误消息。几个小时后,他打开箱子,又检查了一遍。你瞧,代码现在成功运行了。

似乎,有两个地方,这个盒子的状态被保存,变得不同步。重新检查后又同步了一次。

问更有知识的用户:上周(VS 2015)有没有更新或者什么东西去同步状态?

如果您尝试在iis7(和/或64位操作系统机器)上运行32位应用程序,将会得到相同的错误。因此,在iis7中,右键单击应用程序的应用程序池,进入“高级设置”,将“启用32位应用程序”更改为“TRUE”。

重新启动你的网站,它应该工作。

在我的例子中,我正在通过MSTest运行测试,并发现我正在将32位和64位DLL部署到测试目录。该程序倾向于64位DLL,导致其失败。

请确保仅将32位dll部署到测试。