无法加载文件或程序集...尝试加载格式不正确的程序(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个回答

823

我很确定你正在遇到32位/64位冲突的问题。看起来你的主项目可能设置为32位,而它引用的类则设置为64位。尝试查看这个SO问题这个问题。通过它们两个,你应该能够找出问题所在。

这个应用程序被设置为在64位上运行,但DLL在32位上运行,为了解决这个问题,请进入IIS >> 应用程序池 >> 高级设置 >> 启用32位应用程序,然后将其设置为true。


86
哦。我在“项目-->属性-->生成”中完全错过了“平台目标”下拉菜单 - 它被设置为x86;将其设置为“任何CPU”解决了此问题。我一直以为这个设置与配置管理器中的“平台目标”下拉菜单是相同的,但显然不是(实际上,配置管理器中的“平台目标”似乎根本没有起作用!)。 - BlueRaja - Danny Pflughoeft
12
请确认项目未勾选“优先使用 32 位”且架构不是“Any CPU”。具体操作为:进入项目 -> 属性 -> 构建。 - Reid Evans
35
另一个原因是应用程序池设置中的“启用 32 位应用程序”为“false”。将其设置为“true”后,您需要重新启动 IIS。 - dvdmn
4
这个错误给我带来的最糟糕的后果就是,VS无缘无故地在其中一个依赖项目中添加了 <PlatformTarget>x86</PlatformTarget>。如果我没有查看SVN,我永远不会知道为什么我们的MVC应用程序无法启动。 - jahu
3
请在IIS的DefaultAppPool中设置“启用32位应用程序=True”。 - Shantu
显示剩余6条评论

245

可能您在将网站部署到服务器后遇到了问题。

那么您需要调整应用程序池以启用 32位应用程序

步骤

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

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

    Advanced Settings Enable 32-Bit


2
我有没有漏掉什么?OP正在谈论一个控制台应用程序,而不是IIS部署:“ProjectB是一个控制台应用程序,它依赖于ProjectA”。 - user585968
2
@AliAdravi,回答得非常好! - Stamatis Tiniakos
在我的情况下,它被设置为true,在将其设置为false后工作了。相同的错误消息。 - planetregin

191

我在使用Visual Studio 2015中的IIS Express时遇到了这个错误消息。在我的情况下,我需要运行64位版本的IIS Express:

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

截图:

展示VS Web项目的选项的截图


4
相反的情况发生了,我曾经勾选了“使用 64 位”选项,现在需要取消勾选。 - cjb110
1
是的,我把我的 web 应用程序转换为 64 位,以确保我有内存开销,然后我需要勾选这个选项才能使它在此之后加载。谢谢! - John
1
一个词,美丽!! - Jamshaid K.
1
这就是我的全部内容了。一旦你进入一个新的环境,很容易忘记这个设置,它真的感觉应该默认开启或绑定到项目目标平台。如果你没有使用完整的IIS,也很容易忘记实际上有一些需要配置的东西。 - mikus
1
谢谢,我差点就要放弃了。这是在我从VS 2019升级到2022时发生的。 - undefined

40
我曾经遇到过同样的问题。我在项目A的"平台目标"("项目A"(右键)->属性->生成->"平台目标")设置为x86,但是将项目B的保持为"Any CPU"。将项目B的设置为"x86"解决了这个问题。

23

我在Visual Studio 2015中运行单元测试(xunit)时遇到了问题,并找到了以下解决方法:

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

1
同样也适用于VS 2019,非常好用 :) - el_nektarin

10

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


OP在谈论控制台应用程序而不是IIS。 - user585968

10

首先,我在VS2017中得到了一个旧项目,需要进行微小的更改,并将所有项目升级到框架4.7。


有几个人提到选择Any CPU可以解决这个问题。

你需要在几个地方进行设置,可能不仅仅是从下拉列表中选择。对我来说,这种方法解决了问题:

1)你需要在这两个地方都进行设置:

enter image description here

2)还要在Configuration Manager(右键单击解决方案)中进行设置

enter image description here

但如果那里没有呢?

然后点击New并选择这些设置:(感谢@RckLN)

enter image description here


6
以下方法解决了我的问题,取消选中“偏好32位”: 在此输入图片描述

6

在我的情况下,将IIS Express的位数从“默认”更改为“x86”有所帮助。

我所有的项目都将平台目标设置为“x86”。

VS 2022:项目属性> Web


5
对于较新版本的Visual Studio(此答案为v16.10),可以通过手动更改解决方案平台来修复。对我而言,在从“任何CPU”更改为“x86”后,它起作用了。
  1. 单击解决方案平台下拉菜单,其中任何CPU都显示在下面的图像中。 enter image description here
  2. 进入配置管理器。
  3. enter image description here

  4. 单击“新建”,并根据您正在使用的情况添加平台x86或x64(32位或64位)。 enter image description here
  5. 重新启动项目。

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