我从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

其他回答

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

基于@paibamboo的回答

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

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

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

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

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

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

它说

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

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

我也遇到过这个问题。这里所有的建议都试过了,但都没用。

我找到了另一个东西来检查,它帮我解决了这个问题。在Visual Studio中,右键单击项目并打开“属性”。点击“编译”(或“构建”)选项卡,然后点击底部的“高级编译选项”。

检查下拉菜单“Target CPU”。它应该与您正在构建的“平台”相匹配。也就是说,如果你正在构建“任何CPU”,那么“目标CPU”应该是“任何CPU”。通过激活所有的平台,检查这个设置。

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

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

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