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

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

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

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

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


当前回答

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

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

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

其他回答

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

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

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

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

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

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

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

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

在csproj文件中添加

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

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

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

还有这个答案,它为我解决了同样的问题。

Posted by Luis Mack on 5/12/2010 at 8:50 AM I've found the same problem, only for a specific project when compiling on a 64-bit machine. A fix that SEEMS to work is to manually alter one character in the image stream EVERY TIME the usercontrol or form is edited in the designer AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w Change to AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w That is 00LjAuMC4w back to 0yLjAuMC4w at the end of the line (00 back to 0y)