无法加载文件或程序集…试图加载格式不正确的程序(System.BadImageFormatException)


408

我有两个项目,ProjectAProjectBProjectB是一个控制台应用程序,取决于ProjectA。昨天,一切正常,但是今天突然我跑步时,ProjectB我得到了:

BadImageFormatException未处理
无法加载文件或程序集'ProjectA,版本= 1.0.0.0,区域性=中性,PublicKeyToken =空'或其依赖项之一。试图加载格式错误的程序。

两者都是常规项目,不依赖于任何其他非.Net项目。两者都是完全.Net-没有本机代码,也没有P / Invoke。我还有其他项目依赖ProjectA并且仍然可以正常工作。

我尝试过的事情:

  • 确保两个项目都设置为“ Any CPU”,并且选中了构建复选框。他们是。
  • 确保两个项目都针对相同的目标框架(.Net 4.0客户端配置文件)
  • 在ProjectB->引用-> ProjectA->属性下,确保将“ Copy Local”设置为“ True” _ (我已验证ProjectA.dll是否已正确复制)
  • 清洁/重建解决方案。我什至尝试在两个项目中手动删除/ bin和/ obj文件夹。
  • 重新启动Visual Studio。重新启动我的电脑。
  • 签出存储库的全新副本。

但是我仍然遇到同样的错误。我不知道该怎么做,也不知道如何解决。有任何想法吗?


1
如果存储库中有版本历史记录,是否可以检查csproj文件中是否存在某些差异?
2012年

@Steve:据Mercurial称,除了将引用添加到新的.cs文件之外,没有其他更改
BlueRaja-Danny Pflughoeft 2012年

您在另一台计算机上是否得到相同的行为?机器上是否还有其他更改(例如Windows更新,依赖项更新等)?
Mike Parkhill

您是否尝试过还原那些新的.cs文件?
Mike Parkhill 2012年

2
这对我有用......... stackoverflow.com/a/9419522/191403
Som

Answers:


647

我很确定您遇到32位/ 64位冲突。听起来您的主项目可能设置为32位,而其引用的类设置为64位。尝试看这个问题也是。在这两者之间,您应该能够找出问题所在。


71
嗯 我完全以某种方式完全缺少“平台目标”下拉菜单project-->properties-->build-它是为x86设置的;将其设置为“任何CPU”可解决此问题。我一直以为该设置与配置管理器中的“平台目标”下拉菜单相同,但显然不是(实际上,配置管理器中的“平台目标”似乎根本不做任何事情!)
BlueRaja -Danny Pflughoeft 2012年

10
还要验证该项目不是选中“首选32位”的任何CPU。项目->属性->构建
Reid Evans

26
PS:另一个原因是应用程序池设置中的“启用32位应用程序”为“假”。将其设置为true后,需要重新启动IIS。
dvdmn

3
发生此错误的最糟糕情况是VS决定<PlatformTarget>x86</PlatformTarget>无缘无故地追加一个依赖项目。如果我没有研究SVN,那么我永远也不会弄清楚为什么我们的MVC应用无法启动。
jahu

1
请在IIS中设置DefaultAppPool->启用32位应用程序= True
Shantu

195

在服务器上部署后,您可能会遇到网站问题。

然后,您需要调整应用程序池以启用32位应用程序

脚步

  1. 打开IIS管理器
  2. 单击应用程序池
  3. 选择您正在使用的任何应用程序池
  4. 在右窗格中,单击“高级设置...”。

  5. 将启用32位应用程序设置为True

    高级设置 启用32位


1
我错过了什么?OP谈论的是控制台应用程序而不是IIS部署:“ ProjectB是一个控制台应用程序,取决于ProjectA”
MickyD

129

我只是在Visual Studio 2015中运行IIS Express时收到此错误消息。就我而言,我需要运行IIS Express的64位版本:

工具→选项→项目和解决方案→Web项目
选中“将IIS Express的64位版本用于网站和项目”复选框。

屏幕截图:

Web项目的VS选项的屏幕快照。


2
相反,我勾选了“使用64位”并需要取消选中它...
cjb110

32

我有同样的问题。我已经将项目A的“平台目标”(“项目A”(右键单击)->“属性”->“构建”->“平台目标”)设置为x86,但将项目B的目标保持在“任何CPU”。将项目B设置为“ x86”可解决此问题。


15

我在Visual Studio 2015中运行单元测试(xunit)时遇到此问题,并遇到以下修复问题:

Menu Bar -> Test -> Test Settings -> Default Processor Architecture -> X64

7

如果您的项目中至少有1个32bit dll \ exe,则可能需要在IIS7中将“应用程序池”设置“启用32位应用程序”更改为TRUE。


OP谈论的是不是IIS的控制台应用程序
MickyD,2016年

5

首先,我在VS2017中通过一个旧项目获得了这个功能,我需要对它进行微小的更改并将所有项目提升到4.7框架。


其他几个人提到选择 Any CPU可以解决此问题。

您需要在几个地方进行操作,它可能不只是从下拉菜单中选择那样简单。这为我解决了:

1)您需要在此处同时进行以下操作:

在此处输入图片说明

2)并且也在Configuration Manager(右键单击解决方案)

在此处输入图片说明

但是,如果不存在怎么办???

然后单击New并选择以下设置:(感谢@RckLN

在此处输入图片说明


2

我在同一解决方案中的多个项目遇到相同的问题,最终我将所有目标框架都设置为目标CPU的.NET Framework 4和x86,并最终成功编译。


1
在Release中工作,但在Debug中失败。全部设置为.Net Framework 4(不更新1),并且Debug现在运行。
DCastenholz


2

这些解决方案都不适合我-但通过删除bin和obj文件夹的内容,一切再次变得很酷。


2

通过使用“ Visual Studio Build步骤”的Visual Studio Online(VSTS)构建构建项目时,出现了此错误。

解决方案是:

  • 删除现有的源文件夹
  • 在平台上为所有Visual Studio Build(包括依赖项)明确设置“任何CPU”(请参见下面的屏幕截图)。
  • 重新运行构建

VSO屏幕截图


2

以下为我解决了这个问题,取消选中“首选32位”: 在此处输入图片说明


1

我遇到了同样的问题。它突然冒出来,对我来说似乎很奇怪。

在Exception快照中,对于FusionLog,我在其消息中看到以下内容:

... C:\ Windows \ Microsoft.NET \ Framework64 ...

有关融合日志的更多信息:http : //msdn.microsoft.com/zh-cn/library/e74a18c4(v=vs.110).aspx

所有项目的目标CPU均为AnyCPU。我将应用程序项目(引用所有其他项目的项目)更改为x86的目标CPU。现在可以使用了。

不确定目标CPU是如何混合的,没有明显原因,但是确实如此。


1

我在项目中也遇到了这个问题,几分钟后我找到了解决方案,这个问题是由于CPU配置引起的,如果您使用的是Visual Studio 2010或VS 2013,则只需转到项目的属性,然后从边栏中选择编译并将有5个下拉列表,第5个下拉列表将是Target CPU:,您应根据需要将其设置为x86或x64,而不是Any CPU。

将其更改为x86后,我的问题已解决。


1

仅在app.config文件中定义了多个受支持的框架,并迫使该应用程序在不同于app.config文件中首先提到的 .NET框架中运行,这也可能发生。

当您在系统中拥有上述两个可用框架时,也会触发此事件。

解决方法是,在app.config中调出要用于调试的目标框架。

例如:如果您尝试在.NET 4中运行,则配置文件应与此类似,

<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>

1

在我的C#项目中,项目属性-> [Build]-> Platform target:任何CPU,然后取消选中Prefer 32-bit,以使编译器自动选择。


1

Chilkat .NET 4.5程序集要求将VC ++ 2012或2013运行时安装在运行应用程序的任何计算机上。大多数计算机已经安装了它。您的开发计算机将拥有它,因为已经安装了Visual Studio。但是,如果部署到没有所需的VC ++运行时的计算机,则会发生上述错误:

安装所有波纹管软件包

适用于Visual Studio 2013的Visual C ++可再发行组件包-vcredist_x64

适用于Visual Studio 2013的Visual C ++可再发行组件包-vcredist_x86

适用于Visual Studio 2012的Visual C ++可再发行组件包-vcredist_x64

适用于Visual Studio 2012的Visual C ++可再发行组件包-vcredist_x86



0

可能有点有趣,但是我在正常工作代码中遇到了同样的问题。我添加了StreamWriter和StreamReader,它给出了该错误。解决的办法是我将代码放在注释括号中,然后进行调试,然后又开始工作



0

在我的情况下,引发此异常的dll中缺少依赖项。我与Dependency Walker进行了检查,添加了缺少的dll,问题得以解决。

更具体地说,我无意中通过添加SVN关键字破坏了opencv_core340.dll,因此我的dll无法再使用它。但是,我不认为该问题的解决方案取决于dll是否损坏或丢失。我只是为了提供完整的信息而添加此内容。


0

射击!我知道这个问题。我以为我做的一切正确,直到我在VS输出窗口中意外看到“ x86”,这就是我掌握原因的时候。今天浪费了几分钟。

“发布”窗口下的配置设置为“ x86”;而在其他任何地方,它都是“ x64”。

请确保它在配置管理器之间是同步的,发布设置,解决方案配置和IIS设置(如果这是您的Web服务器)。

另外,请记住-VS是32位应用程序,IIS是64位。默认情况下,IIS中禁用32位应用程序。

在此处输入图片说明


0

我发现了与其他答案不同的东西。在我的项目中达到此异常是编译损坏的结果。无需进行任何更改,只需强制rebuild即可


0

我遇到过同样的问题。在我的案例中,项目B是.Net核心类库,其中安装了Nuget“ Microsoft.Management.Infrastructure”。错误是我将项目B称为“ MI”。我将项目名称更改为其他名称,然后突然一切恢复正常。


-1

我的机器向我显示了BIOS更新,我想知道是否与突然出现此错误有关。在执行更新后,错误得以解决,并且解决方案构建良好。


-1

您是否正在尝试从cmd运行.exe文件?这是我的错 只需双击该.exe文件即可。如果是Windows 8.1 / Windows Server 2012 R2 x64的.NET Core SCD。

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.