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

时间:2012-07-06 22:14:38

标签: c# exception console-application badimageformatexception

我有两个项目ProjectAProjectBProjectB是一个控制台应用程序,它依赖于ProjectA。昨天,一切都运转良好,但今天我突然跑ProjectB时得到了这个:

  

BadImageFormatException未处理
  无法加载文件或程序集“ProjectA,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”或其依赖项之一。试图加载格式不正确的程序。

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

我尝试过的事情:

  • 选中 build 复选框,确保两个项目都设置为“Any CPU”。他们是。
  • 确保两个项目都针对相同的目标框架(。Net 4.0 Client Profile)
  • 在ProjectB下 - >参考文献 - > ProjectA - >属性,确保“Copy Local”设置为“True” _ (我确认正在正确复制ProjectA.dll)
  • 清理/重建解决方案。我甚至尝试手动删除两个项目中的/ bin和/ obj文件夹。
  • 重新启动Visual Studio。重启我的电脑。
  • 查看存储库的全新副本。

但我仍然得到同样的错误。我不知道我做了什么导致这个,也不知道如何解决它。有什么想法吗?

28 个答案:

答案 0 :(得分:546)

我很确定你有32位/ 64位冲突。听起来您的主项目可能设置为32位,而其引用的类设置为64位。尝试查看this SO questionthis one too。在他们两个之间,你应该能够找出你的问题。

答案 1 :(得分:170)

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

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

步骤:

  1. 打开IIS管理器
  2. 点击“应用程序池”
  3. 选择您正在使用的任何应用程序池
  4. 在右侧窗格中,单击“高级设置...”
  5. 将启用32位应用程序设置为True
  6. enter image description here

答案 2 :(得分:102)

我刚刚在Visual Studio 2015中运行此IIS错误消息。在我的情况下,我需要运行64位版本的IIS Express:

  

工具 - >选项 - >项目和解决方案 - >网络项目
  选中复选框   说“使用64位版本的IIS Express用于网站和   项目”。

截图:

Screenshot of VS options for Web Project.

答案 3 :(得分:24)

我有同样的问题。我设置了项目A"平台目标" ("项目A"(右键单击) - >属性 - >构建 - >"平台目标")到x86但保持项目B在"任何CPU"。将项目B设置为" x86"修好了。

答案 4 :(得分:13)

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

[Serializable]
class C
{
  String str { get; set; }
  int num { get; set; }
}

答案 5 :(得分:6)

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

答案 6 :(得分:3)

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

其他几位提及选择Any CPU可以解决此问题。

您需要完成几个地方,它可能不仅仅是从下拉列表中选择。这为我解决了这个问题:

1)你需要在这里做到这一点:

enter image description here

2)以及Configuration Manager(右键点击解决方案)

enter image description here

但如果它不存在怎么办?

然后点击New并选择以下设置:(thanks @RckLN

enter image description here

答案 7 :(得分:2)

这些解决方案都不适用于我 - 但是通过删除bin和obj文件夹的内容,一切都很酷了。

答案 8 :(得分:2)

以下内容为我解决了此问题,请取消选中“首选 32位”: enter image description here

答案 9 :(得分:2)

我在使用Visual Studio Build步骤通过Visual Studio Online(VSTS)Build构建项目时得到了这个。

解决方案是:

  • 删除现有的源文件夹
  • 在平台中为所有Visual Studio Builds显式设置'Any CPU',包括依赖项(见下面的截图)。
  • 重新运行构建

VSO Screenshot

答案 10 :(得分:2)

如果您尝试在VS中使用MSI安装程序打包64位项目,也可能会看到此问题。 (“原因是因为.msi文件打包的本机填充程序是32位可执行文件。”)

请点击此处了解详情:http://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx

答案 11 :(得分:2)

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

答案 12 :(得分:1)

在我的C#项目中,项目属性 - > [Build] - >平台目标:任何CPU, 并取消选中Prefer 32-bit,让编译器自动选择。

答案 13 :(得分:1)

这也可以通过在 app.config 文件中定义多个支持的框架来实现,并强制应用程序在不同的.NET框架中运行一个首先在app.config文件中提到

如果你的系统中有两个提到的框架,那么这也会激发。

作为一种解决方法,在app.config中调出您将用于调试的目标框架

例如:如果你试图在.NET 4中运行,配置文件应该有类似的东西,

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

答案 14 :(得分:1)

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

将问题更改为x86后,问题解决了。

答案 15 :(得分: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

答案 16 :(得分:1)

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

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

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

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

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

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

答案 17 :(得分:1)

如果您像我一样通过cli .net integration 从您的程序中使用LibreOffice,我也会遇到同样的错误。我在PC上的生产环境中使用旧版本的LibreOffice我安装了一个冲突的新版本。 只需卸载LibreOffice。我在此处找到了解决方案.NET CLI: Could not load file or assembly 'cli_cppuhelper'

答案 18 :(得分:0)

对于较新版本的visual studio(此答案为v16.10),可以通过手动更改解决方案平台来修复。对我来说,它在从“任何 CPU”更改为“x86”后起作用了。

  1. 点击解决方案平台下拉菜单,下图中出现任何 CPU 的下拉菜单。 enter image description here

  2. 转到配置管理器。

    enter image description here

  3. 点击新建并根据适合您的方式添加平台 x86 或 x64(32 位或 64 位)。 enter image description here

  4. 重新启动项目。

答案 19 :(得分:0)

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

答案 20 :(得分:0)

我发现与其他答案有所不同。在我的项目中达到此异常是编译损坏的结果。无需进行任何更改,只需强制重建,它便已修复。

答案 21 :(得分:0)

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

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

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

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

enter image description here

答案 22 :(得分:0)

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

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

答案 23 :(得分:0)

我在Visual Studio 2017上使用ReSharper运行单元测试也遇到了这个问题,并使用以下配置修复它:

enter image description here

您还可以更改ReSharper的运行测试设置: https://resharper-support.jetbrains.com/hc/en-us/articles/207242715-How-to-run-MSTest-tests-using-x64-configuration

答案 24 :(得分:0)

这可能有点滑稽,但我对正常工作代码有同样的问题。我添加了StreamWriter和StreamReader,它给出了错误。 解决方案是我将代码放入注释括号然后进行调试,它又开始工作了

答案 25 :(得分:-1)

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

答案 26 :(得分:-1)

我的机器向我显示了BIOS更新,我想知道这是否与此错误的突然弹出有关。在我完成更新后,错误得到解决,解决方案构建正常。

答案 27 :(得分:-1)

在我的情况下,错误是 System.BadImageFormatException:无法加载文件或程序集'vjslib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。 < / p>

通过从here安装vjredist 64来解决。