即使平台相同,也“尝试加载格式错误的程序”


461

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

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

最初,我将项目设置为Any CPU平台,因此将它们都更改为x86,但是此错误仍在发生。这确实是我所知道的唯一解决方法。

DLL没有损坏或任何东西,因为我可以将它们与其他程序一起使用(我没有源程序)。我以为也许没有找到依赖性,但是我检查了一下,发现它们都在那里。另外,DllNotFoundException在这种情况下,它不会抛出吗?

我还可以做些什么?在您说“改用64位非托管DLL”之前,让我指出,没有一个。;)


1
您将哪些项目更改为x86?以及在获得异常时如何通过调试器或手动执行它们?如果是后者,您是否注意到更改为x86时,您的bin \目录中有一个新文件夹?现在基本上是bin \ x86 \ Debug文件了。
Lasse V. Karlsen

您是否可以验证可执行文件是否以32位模式运行(进程管理器中为* 32)?
JP Alioto

@Lasse V. Karlsen:是的,当我更改每个项目中的平台时,我从输出路径中删除了x86位。我的第一个项目是一个DLL,它将功能包装在非托管DLL中。第二个项目是在第一个DLL中使用包装器的可执行文件。两者都设置为x86。
大卫·布朗

@JP:实际上,进程管理器没有显示它正在作为32位进程运行。这是为什么?
大卫·布朗

Answers:


531

如果尝试在IIS 7(和/或64位OS计算机)上运行32位应用程序,则将出现相同的错误。因此,从IIS 7中,右键单击应用程序的应用程序池,然后转到“高级设置”,然后将“启用32位应用程序”更改为“ TRUE”。

重新启动您的网站,它应该可以工作。

在此处输入图片说明


1
哦,我的日子里,我一直在寻找额外的IIS组件,而这正是答案。...有人可以建议选择此选项吗?
notidaho 2012年

2
这是有关此性能问题的精彩讨论:stackoverflow.com/questions/507820/…–
Ben Power

我对SharpSvn有问题,这无济于事。:(我告诉你这个程序,这是非常错误的……
user2173353

4
这个答案对我来说是个wtf,因为这个问题根本没有提到IIS!
kristianp

129

不知何故,Configuration Manager中的“ 生成”复选框未选中我的可执行文件,因此它仍与旧的“ Any CPU”构建一起运行。修复此问题后,Visual Studio抱怨无法调试该程序集,但此问题已通过重新启动得到解决。


非常感谢。这也给我。在Configuration Manager中检查了构建,现在可以正常使用(WPF桌面应用程序)。
danglund

1
如果已完成上述所有操作,并检查了平台设置,构建配置设置,清理了解决方案,但该解决方案仍无法正常工作-搜索DLL的所有实例并将其删除。
Will Calderwood

与VS 2015仍然有效-尽管我不需要重新启动:)
Increddibelly 2015年

而已!重新访问您的Configuration Manager设置就是答案。
AndyUK '17

74

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

项目属性,“构建”选项卡

在“ 平台目标”下,选择“ x86”(或更一般地说,是要与要链接的库匹配的体系结构

项目属性,平台目标

我希望这可以帮助别人!:)


2
这解决了我在VS2013中的问题,我发现另一种解决方法是将“平台目标”保留为“任何CPU”,但选中“首选32位”复选框。
user1069816 2015年

2
尽管您需要使用.NET 4.5或更高版本才能选中“首选32位”复选框
-user1069816

1
是的,但是我将“任何CPU”中的项目转换为“ x64”。我的32位项目可以正常工作,但我将相同的代码转换为64位,但该项目无法正常工作到32位。您能给我适当的64位转换过程吗?
Ismayil S

@IsmayilS确保您使用的是链接到的库的64位版本
Marvin Thobejane

53

我也有这个问题。在这里尝试了所有建议,但没有帮助。

我发现另一件事要检查,以解决它对我来说。在Visual Studio中,右键单击该项目,然后打开“属性”。单击“编译”(或“构建”)选项卡,然后单击底部的“高级编译选项”。

检查下拉菜单“目标CPU”。它应与您正在构建的“平台”匹配。也就是说,如果要构建“任何CPU”,则“目标CPU”应显示为“任何CPU”。激活所有平台,然后检查此设置。


2
对于只使用编译器的人,我的解决方法是在编译器标志中添加“ / platform:x86”。
Urchin

这也为我解决了。我必须在“构建”选项卡上调整“平台目标”。
Jowen

如果您使用的是64位,请同时选中“首选32位”标志。我不得不为我禁用它。
N4ppeL

51

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

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


3
谢谢。我尝试了很多,没有任何帮助。你是我的救星。我有64位操作系统,安装了64位Visual Studio(由于未知原因,它仍以32位运行)。当我将我的Pl​​atform Target放到x64时,它抛出错误BadImageFormatException。使用您的修复程序,它可以正常工作。我给你投票了。您摇滚
SKCS卡马尔(Kamal)

我很高兴能为您提供帮助:)
paibamboo

这是我需要的答案。非常感谢!
yushulx

非常感谢,这解决了问题。它与Visual Studio 2017 32位进程很好地配合使用。
samir105 '18

1
仍然可以在VS 2019上使用,谢谢
Jake Gaston

36

如果您使用的是Any CPU,则如果选中“ 首选32位”选项,则可能会遇到此问题:

确保在项目属性的“ 构建”选项卡中取消选中此选项!

在此处输入图片说明


3
如果您可以指示在Visual Studio中的何处可以找到此选项,将很有帮助。
trysis

@trysis,此选项位于项目设置窗格的“ 构建”页面中。
Drew Noakes 2014年

1
我说的是放入它会有所帮助。按照这个答案,没有上下文可以告诉不幸的,可能是StackOverflow的新用户在哪里找到它。
trysis

获取此表格的途径是什么?我找不到它
Adolfo Correa

在Visual Studio中,右键单击该项目,然后选择“属性”。
Drew Noakes

8

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

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


这是我所经历的最接近的答案。我有一个必须为x86的dll。我在另一个项目中使用了它,默认情况下是AnyCPU。他们只需要匹配。在这种情况下,它并没有太大的区别,所以我将新项目更改为x86。
greg 2014年


4

以@paibamboo的答案为基础

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

我的同事选中了此框(他明确地查找了此框),但遇到了错误消息。几个小时后,他取消选中该框,然后再次选中它。瞧,代码现在成功运行了。

似乎有两个地方保存了此Box ist的状态,这些状态变得不同步。取消并重新检查它会再次同步。

面向更多知识渊博的用户的问题:上周(对于VS 2015)是否存在不同步状态的更新或某些内容?


3

另请参阅此答案,它为我解决了相同的问题。

Luis Mack发表于2010年5月12日,上午8:50,我发现相同的问题,仅对于在64位计算机上编译的特定项目而言。SEEMS可以解决的一个问题是,每次在设计器中编辑用户控件或表单时,都要手动更改图像流中的一个字符

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

改成

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

那就是在行尾将00LjAuMC4w返回到0yLjAuMC4w(00返回到0y)


1
链接的简短摘要将对@Shaul有所帮助:)
Marvin Thobejane 2013年

华丽的。谢谢,简报为您的评论添加了内容
Marvin Thobejane 2013年

2

就我而言,我使用的是一个微型.exe文件,该文件通过Reflection重新加载引用的DLL。因此,我只需执行以下步骤即可节省时间:

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


2

就我而言,我通过MSTest运行测试,发现我正在将32位和64位DLL都部署到测试目录中。该程序偏爱64位DLL并导致其失败。

TL; DR确保仅将32位DLL部署到测试中。


2

我们有一个类似的问题,我们设法通过将Platform目标设置为x86来解决它。 项目属性->构建


那么x86 dll与x64不同吗?有没有一种方法可以在引用的dll文件上检测到此错误?
NoBugs

@NoBugs看起来可以。看看这个话题

1

我以“ Windows”方式解决了此问题。在检查完所有设置,清洗解决方案并重新构建之后,我只需关闭解决方案并重新打开即可。然后它起作用了,所以VS可能在清理过程中没有清除一些东西。当逻辑解决方案不起作用时,我通常会转向不合逻辑(或看似不合逻辑)的解决方案。Windows不会让我失望。:)


1

通过将构建版本与服务器上的.NET版本进行匹配,我能够解决此问题。

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

所以我降级到4.0并成功了!

因此,请确保您的版本匹配。它可以在我的开发箱上正常运行,但是服务器具有旧的.NET版本。


1

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


1

.NET核心中存在相同的问题。解决方案是下载32位.netcore运行时,并指定项目目标x86

csproj文件中添加

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

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

这是用于Windows计算机的,您必须调整路径,例如Linux / OSX


0

如果要导入非托管DLL,请使用

CallingConvention = CallingConvention.Cdecl 

在您的DLL导入方法中。


0

1:转到:工具>选项>项目和解决方案> Web项目>使用IIS Express 2的64位版本2:更改Web服务项目的以下设置。 在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.