“试图加载格式不正确的程序”;即使平台是一样的

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

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

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

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

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

607844 次浏览

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

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

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

enter image description here

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

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

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

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

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

还可以查看这个答案,它为我解决了同样的问题。

我发现了同样的问题,只是在64位机器上编译一个特定的项目。一个似乎有效的修复方法是每次在设计器中编辑用户控件或表单时手动更改图像流中的一个字符

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

改变

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

这是一行末尾的00 ljaumc4w回到0 yljaumc4w(00回到0y)

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

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

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

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

如果你正在使用任何CPU,你可能会遇到这个问题,如果选择32位选项被选中:

< img src = " https://i.imgur.com/d6lCOlP.png " >

确保你取消这个选项在项目的属性构建标签!

enter image description here

Visual Studio中,右键单击项目 ->,在左侧窗格中单击构建选项卡,

项目属性,构建标签

平台目标下选择x86(或者更一般的体系结构来匹配你要链接到的库)

项目属性,平台目标

我希望这能帮助到一些人!:)

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

确保只将32位dll部署到测试中。

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

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

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

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

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

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

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

或者你可以在项目属性>做每个项目;网络比;位数 # EYZ0 < / p >

基于@paibamboo的回答

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

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

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

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

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

csproj文件中添加

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


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

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

我们也遇到过类似的问题,我们通过将平台目标设置为x86来解决它。# EYZ0

如果您正在导入非托管DLL,则使用

CallingConvention = CallingConvention.Cdecl

在DLL导入方法中。

  1. 进入:工具→选项→项目和解决方案→Web项目→使用64位版本的IIS Express。
  2. 更改以下web服务项目的设置:

enter image description here

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

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

它说

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

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

Set processor architecture explicit to x64

在我的例子中,我没有将正确的项目设置为启动项目。我进入解决方案设置,选择了正确的启动项目,它工作了

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

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

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

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

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

请注意使用的dll文件(在我的例子中是“WebView2Loader.dll"”)的版本是非常重要的。我在“Microsoft.WebView2.FixedVersionRuntime.101.0.1210.39.x64"当我尝试使用MMC Snap-Ins中的WebView2组件时,类型为&;HTMLView"或“;FormView"。

我只是将引用的dll文件复制到项目可访问的适当路径(您可以先将其放在项目输出文件旁边进行测试),然后WebView2浏览器开始按预期运行。微软的错误消息有时(至少在我的情况下)有点误导,没有传达足够的信息。

我收到了“badimageformatexception”;这通常发生在你混合平台目标(例如在一个针对x86的应用程序中使用X64编译的dll文件,反之亦然)或混合本地代码和。net时,但这根本不是我的问题。我希望这能帮助那些可能陷入困境的人。

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