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

528
我有两个项目,分别为ProjectAProjectB。其中,ProjectB是一个控制台应用程序,依赖于ProjectA。昨天所有一切都还好好的,但今天当我运行ProjectB时,出现了以下错误信息:BadImageFormatException was unhandled:
Could not load file or assembly 'ProjectA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format。

这两个项目都是普通的.NET项目,没有依赖于任何非.NET项目。它们都是纯粹的.NET项目,没有本地代码或P/Invoke调用。我还有其他依赖于ProjectA的项目,它们仍然能够正常工作。
我已经尝试过以下几种方法:
- 确保两个项目都设置为“Any CPU”,并且勾选了构建复选框。 - 确保两个项目均针对相同的目标框架(.NET 4.0 Client Profile)。 - 在ProjectB --> References --> ProjectA --> Properties中,确保“Copy Local”设置为“True”_(我验证了ProjectA.dll被正确地复制)_ - 清理/重新生成解决方案。我甚至尝试手动删除两个项目中的/bin和/obj文件夹。 - 重启Visual Studio。重启我的电脑。 - 检出存储库的全新副本。
但我仍然收到相同的错误消息。我不知道我做了什么导致了这个问题,也不知道该如何修复。有什么建议吗?

4
如果您在代码库中有版本历史记录,可以检查一下csproj文件是否有差异。 - Steve
1
@Steve:根据Mercurial的记录,除了添加新的.cs文件的引用之外,没有其他更改。 - BlueRaja - Danny Pflughoeft
1
你在另一台机器上是否遇到了相同的问题?机器上是否有其他变化(例如Windows更新、依赖项更新等)? - Mike Parkhill
1
你试过还原那些新的.cs文件了吗? - Mike Parkhill
3
这对我有用…… https://dev59.com/PGox5IYBdhLWcg3wIQ1o#9419522 - Som
显示剩余3条评论
32个回答

4

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


1
在发布版中工作正常,但在调试时失败了。将所有内容设置为 .Net Framework 4(而非更新1),现在调试可以运行了。 - DCastenholz

4
我也遇到过这个问题。如之前所述,问题与Azure中的32位/64位冲突有关。要在Azure应用服务中更改平台,请转到“配置” -> “常规设置”。 输入图像描述

4

对我来说,这些解决方案都没有起作用 - 但通过删除bin和obj文件夹中的内容,一切恢复正常了。


3

当我使用Visual Studio Online (VSTS) Build和Visual Studio Build步骤构建项目时,出现了这个问题。

解决方案是:

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

VSO Screenshot


3
Chilkat .NET 4.5程序集需要在应用程序运行的计算机上安装VC++2012或2013运行时。由于大多数计算机已经安装了这个运行时,所以您的开发计算机也应该安装了Visual Studio。但是,如果部署到没有所需VC++ 运行时的计算机上,将会出现上述错误。
请安装以下所有包:
- Visual C++ Redistributable Packages for Visual Studio 2013 - vcredist_x64 - Visual C++ Redistributable Packages for Visual Studio 2013 - vcredist_x86 - Visual C++ Redistributable Packages for Visual Studio 2012 - vcredist_x64 - Visual C++ Redistributable Packages for Visual Studio 2012 - vcredist_x86

2

1
考虑为未来读者总结链接文章的内容,以防链接失效。 - Bond - Java Bond

2
在我的C#项目中,项目属性->[生成]->平台目标: 任何 CPU, 并取消选中“优先使用32位”,让编译器自动选择。

1
这也可能是由于在app.config文件中定义了多个受支持的框架,且强制应用程序在与第一个在app.config文件中提到的框架不同的.NET框架中运行所致。
当您的系统中同时存在这两个框架时,也会发生这种情况。
作为解决方法,将您要用于调试的目标框架放在app.config中。
例如:如果您要尝试在.NET 4中运行,则配置文件应类似于此。
<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>

1
我在一个项目中也遇到了这个问题,几分钟后我找到了解决方法,这个问题是由于CPU配置引起的,如果你正在使用Visual Studio 2010或VS 2013,则只需转到项目的属性,然后从侧边栏选择编译,会有5个下拉菜单,第5个下拉菜单将是目标CPU:,你应该根据需要将其设置为x86或x64而不是任何CPU。将其更改为x86后,我的问题得到了解决。

1
我遇到了相同的问题。它突然出现,这对我来说很奇怪。
在异常快照中,对于FusionLog,我在其消息中看到了以下内容:
... C:\Windows\Microsoft.NET\Framework64 ...
有关融合日志的更多信息:http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx 所有项目的目标CPU均为AnyCPU。我将应用程序项目(引用所有其他项目的项目)更改为x86目标CPU。现在它可以工作了。
不确定如何出现目标CPU混淆,但它确实发生了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接