无法加载文件或程序集...尝试加载格式不正确的程序 (System.BadImageFormatException)
Posted
技术标签:
【中文标题】无法加载文件或程序集...尝试加载格式不正确的程序 (System.BadImageFormatException)【英文标题】:Could not load file or assembly ... An attempt was made to load a program with an incorrect format (System.BadImageFormatException) 【发布时间】:2012-07-07 09:26:02 【问题描述】:我有两个项目,ProjectA
和 ProjectB
。 ProjectB
是一个控制台应用程序,它依赖于ProjectA
。昨天,一切正常,但今天当我运行ProjectB
时突然发现:
BadImageFormatException 未处理: 无法加载文件或程序集“ProjectA,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。试图加载格式不正确的程序。
两者都只是常规项目,不依赖于任何其他非 .Net 项目。两者都是完全的 .Net - 没有本机代码,也没有 P/Invoke。我还有其他依赖于ProjectA
的项目,并且仍然可以正常工作。
我尝试过的事情:
确保两个项目都设置为“任何 CPU”,并选中 build 复选框。他们是。 确保两个项目都用于相同的目标框架(.Net 4.0 客户端配置文件)。 在 ProjectB --> References --> ProjectA --> Properties 下,确保 "Copy Local" 设置为 "True" _ (I验证 ProjectA.dll 是否被正确复制) 清理/重建解决方案。我什至尝试手动删除两个项目中的 /bin 和 /obj 文件夹。 重新启动 Visual Studio。重新启动我的计算机。 查看存储库的全新副本。但我仍然遇到同样的错误。我不知道我做了什么导致这个,也不知道如何解决它。有什么想法吗?
【问题讨论】:
如果您在存储库中有版本历史记录,您能否检查一下 csproj 文件中是否存在一些差异? @Steve:根据 Mercurial 的说法,除了添加对新 .cs 文件的引用之外没有任何变化 你在另一台机器上得到同样的行为吗?机器上是否还有其他变化(例如 Windows 更新、依赖项更新等)? 您是否尝试过还原那些新的 .cs 文件? 这对我有用............ ***.com/a/9419522/191403 【参考方案1】:我很确定您遇到了 32 位/64 位冲突。听起来您的主项目可能设置为 32 位,而其引用的类设置为 64 位。尝试查看this SO question 和this one too。在他们两个之间,你应该能够找出你的问题。
【讨论】:
请。我不知何故完全错过了project-->properties-->build
中的“平台目标”下拉菜单——它是为 x86 设置的;将其设置为“任何 CPU”可解决此问题。我一直以为这个设置和配置管理器中的“平台目标”下拉菜单是一样的,但显然不是(事实上,配置管理器中的“平台目标”似乎根本没有做任何事情! )
还要验证项目是否没有任何 CPU 并选中了 Prefer 32 位。项目 -> 属性 -> 构建
PS:另一个原因是“启用 32 位应用程序”在应用程序池设置中为“假”。设置为true后需要重启IIS。
这个错误发生在我身上的最糟糕的事情是当 VS 决定无缘无故地在依赖项目之一中附加 <PlatformTarget>x86</PlatformTarget>
时。如果我没有研究过 SVN,我永远不会明白为什么我们的 MVC 应用程序无法启动。
请在 IIS DefaultAppPool 中设置-> Enable 32-Bit Applications = True【参考方案2】:
可能是您在服务器上部署后遇到了网站问题。
然后您需要调整您的应用程序池以启用 32 位应用程序。
步骤
-
打开 IIS 管理器
点击应用程序池
选择您正在使用的任何应用程序池
在右窗格中,单击高级设置...
将启用 32 位应用程序设置为 True
【讨论】:
我错过了什么吗? OP 谈论的是一个控制台应用程序而不是 IIS 部署:“ProjectB 是一个控制台应用程序,它依赖于 ProjectA” 很好的答案@AliAdravi 在我的例子中,它被设置为 true 并在设置为 false 后工作。同样的错误信息。【参考方案3】:我刚刚在 Visual Studio 2015 中运行 IIS Express 时收到此错误消息。在我的情况下,我需要运行 64 位版本的 IIS Express:
工具 → 选项 → 项目和解决方案 → Web 项目 选中该框 上面写着“为网站使用 64 位版本的 IIS Express,并且 项目”。
截图:
【讨论】:
反之亦然,我勾选了“使用 64 位”,需要取消勾选... 是的,我将我的 Web 应用程序切换到 64 位以确保我有内存开销,然后我需要勾选此选项以使其在此之后加载。谢谢! 一句话,美女!! 对我来说就是这样,很容易忘记这个设置,一旦你进入一个新的环境,真的感觉它应该默认开启或绑定到项目目标平台.也很容易忘记,如果您没有使用完整的 IIS,实际上需要配置一些东西。【参考方案4】:我遇到了同样的问题。我已将项目 A 的“平台目标”(“项目 A”(右键单击)-> 属性-> 构建->“平台目标”)设置为 x86,但将项目 B 保持在“任何 CPU”。将项目 B 设置为“x86”解决了这个问题。
【讨论】:
【参考方案5】:我在 Visual Studio 2015 中运行单元测试 (xunit) 时遇到了这个问题,并遇到了以下修复:
Menu Bar -> Test -> Test Settings -> Default Processor Architecture -> X64
【讨论】:
同样适用于 VS 2019 :)【参考方案6】:如果您的项目中至少有 1 个 32 位 dll\exe,您可能需要在 IIS7 中将 应用程序池 设置“启用 32 位应用程序”更改为 TRUE。
【讨论】:
OP 说的是控制台应用程序而不是 IIS【参考方案7】:首先,我在 VS2017 中使用了一个旧项目,我需要对其进行微小更改并将所有项目升级到框架 4.7。
其他几个人提到选择 Any CPU
可以解决此问题。
您需要在几个地方执行此操作,而且可能不仅仅是从下拉列表中选择那么简单。这为我解决了问题:
1) 你需要在这里做这两个:
2) 还有Configuration Manager
(右击解决方案)
但是如果它不存在呢???
然后点击New
并选择这些设置:(thanks @RckLN)
【讨论】:
【参考方案8】:以下解决了我的问题,取消选中“首选” 32位':
【讨论】:
【参考方案9】:我在同一个解决方案中的多个项目中遇到了同样的问题,我最终将所有目标框架设置为目标 CPU 的 .NET Framework 4 和 x86,并最终成功编译。
【讨论】:
在发布中工作但在调试中失败。全部设置为 .Net Framework 4(不是更新 1),Debug 现在运行。【参考方案10】:这些解决方案都不适合我 - 但是通过删除 bin 和 obj 文件夹的内容,一切都变得很酷了。
【讨论】:
【参考方案11】:我在通过 Visual Studio Online (VSTS) Build using Visual Studio Build
Steps 构建项目时得到了这个。
解决办法是:
删除现有的源文件夹 在平台中为所有 Visual Studio 构建(包括依赖项)显式设置“任何 CPU”(参见下面的屏幕截图)。 重新运行构建【讨论】:
【参考方案12】:Chilkat .NET 4.5 程序集要求在运行您的应用程序的任何计算机上安装 VC++ 2012 或 2013 运行时。大多数计算机已经安装了它。您的开发计算机将拥有它,因为已经安装了 Visual Studio。但是,如果部署到所需的 VC++ 运行时不可用的计算机上,则会出现上述错误:
安装所有的波纹管包
适用于 Visual Studio 2013 的 Visual C++ Redistributable Packages - vcredist_x64
适用于 Visual Studio 2013 的 Visual C++ Redistributable Packages - vcredist_x86
适用于 Visual Studio 2012 的 Visual C++ Redistributable Packages - vcredist_x64
适用于 Visual Studio 2012 的 Visual C++ Redistributable Packages - vcredist_x86
【讨论】:
【参考方案13】:如果您尝试在 VS 中使用 MSI 安装程序打包 64 位项目,您也可能会看到此问题。 (“原因是与 .msi 文件一起打包的本机 shim 是 32 位可执行文件。”)
更多详情请看这里:http://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx
【讨论】:
考虑对链接的文章进行总结,以使未来的读者受益;以防链接失效。【参考方案14】:我也有这个问题。如前所述,该问题与 32 位/64 位冲突有关,但与托管在 Azure 中的站点有关。若要更改 Azure 应用服务中的平台,请转到配置 -> 常规设置。
【讨论】:
【参考方案15】:我遇到了同样的问题。它突然出现,我觉得这很奇怪。
在异常快照中,对于 FusionLog,我在其消息中看到以下内容:
... C:\Windows\Microsoft.NET\Framework64 ...
更多关于融合日志:http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx
所有项目的目标 CPU 为 AnyCPU。我将应用程序项目(引用所有其他项目的项目)更改为 x86 的目标 CPU。现在可以了。
不确定目标 CPU 是如何无缘无故发生混淆的,但确实发生了。
【讨论】:
【参考方案16】:我在一个项目中也遇到过这个问题,几分钟后我找到了解决方案, 这个问题是由于CPU配置, 如果您使用的是 Visual Studio 2010 或 VS 2013,只需转到 project 的 properties ,然后从侧边栏中选择 Compile 就会有 5 drop-down,第 5 个 Drop-down 将是 Target CPU:,您应该根据您的要求将其设置为 x86 或 x64,而不是 Any CPU。
改成x86后我的问题就解决了。
【讨论】:
【参考方案17】:这也可以通过在 app.config 文件中定义多个受支持的框架 并强制应用在不同的 .NET 框架中运行而不是在 app.config 文件中首先提及。
当您的系统中同时拥有上述两个框架时,这也会触发。
作为一种解决方法,在 app.config 中调出您要用于调试的目标框架
例如:如果您尝试在 .NET 4 中运行,配置文件应该有类似的内容,
<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>
【讨论】:
【参考方案18】:在我的 C# 项目中,项目属性->[构建]->平台目标:任何 CPU, 并取消选中 Prefer 32-bit 让编译器自动选择。
【讨论】:
【参考方案19】:我在 Visual Studio 2017 上使用 ReSharper 运行单元测试时也遇到了这个问题,并使用以下配置修复了它:
您还可以更改 ReSharper 的运行测试设置: https://resharper-support.jetbrains.com/hc/en-us/articles/207242715-How-to-run-MSTest-tests-using-x64-configuration
【讨论】:
【参考方案20】:射击!我知道这个问题。我以为我做的一切都是正确的,直到我不小心在 VS 输出窗口中看到了“x86”,这就是我明白原因的时候。今天浪费了几分钟。
“发布”窗口下的配置设置为“x86”;而在其他任何地方,它都是“x64”。
请确保它在配置管理器、发布设置、解决方案配置和 IIS 设置(如果那是您的 Web 服务器)之间保持同步。
另外,请记住 - VS 是 32 位应用程序,而 IIS 是 64 位。 IIS 中默认禁用 32 位应用程序。
【讨论】:
【参考方案21】:对于较新版本的visual studio(此答案为v16.10),可以通过手动更改解决方案平台来修复它。对我来说,从“任何 CPU”更改为“x86”后它就可以工作了。
单击解决方案平台下拉菜单,其中任何 CPU 都出现在下图中。
转到配置管理器。
单击新建并根据适合您的方式添加平台 x86 或 x64(32 或 64 位)。
重新启动项目。
【讨论】:
【参考方案22】:这可能有点好笑,但我在正常工作代码中遇到了同样的问题。我添加了 StreamWriter 和 StreamReader,它给出了那个错误。 解决方案是我将该代码放入注释括号中,然后进行调试,它又开始工作了
【讨论】:
【参考方案23】:如果您像我一样通过 cli .net 集成从您的程序中使用 LibreOffice,我会遇到同样的错误。我在 PC 上的生产环境中使用旧版本的 LibreOffice 我安装了一个有冲突的新版本。 只需卸载 LibreOffice。 我在这里找到了解决方案 .NET CLI: Could not load file or assembly 'cli_cppuhelper'
【讨论】:
【参考方案24】:在我的情况下,引发此异常的 dll 中缺少依赖项。我检查了 Dependency Walker,添加了丢失的 dll 并解决了问题。
更具体地说,我不小心添加了 SVN 关键字,以某种方式损坏了我的 opencv_core340.dll,因此我的 dll 无法再使用它。但是我不相信这个问题的解决方案取决于 dll 是否损坏或丢失。我只是为了提供完整的信息而添加它。
【讨论】:
【参考方案25】:我检测到与其他答案不同的东西。在我的项目中遇到此异常是编译损坏的结果。没有做任何更改,只是强制重建,它已被修复。
【讨论】:
【参考方案26】:我有同样的问题。就我而言,项目 B 是一个 .Net Core 类库,它安装了 Nuget“Microsoft.Management.Infrastructure”。错误是我将我的项目 B 称为“MI”。我将项目名称更改为其他名称,突然一切都恢复了。
【讨论】:
【参考方案27】:您是否尝试从 cmd 运行 .exe 文件?这是我的错误。只需双击运行 .exe 文件即可。如果是适用于 Windows 8.1/Windows Server 2012 R2 x64 的 .NET Core SCD。
【讨论】:
【参考方案28】:在我的情况下,错误是 System.BadImageFormatException: Could not load file or assembly 'vjslib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。
已通过从here 安装 vjredist 64 解决。
【讨论】:
【参考方案29】:我的机器向我显示了 Bios 更新,我想知道这是否与突然弹出此错误有关。在我进行更新后,错误得到解决,解决方案构建良好。
【讨论】:
以上是关于无法加载文件或程序集...尝试加载格式不正确的程序 (System.BadImageFormatException)的主要内容,如果未能解决你的问题,请参考以下文章
无法加载文件或程序集“System.Data.SQLite”或它的一个依赖。试图加载程序格式不正确
未能加载文件或程序集 或它的某一个依赖项。试图加载格式不正确的程序。问题解决
未能加载文件或程序集“********”或它的某一个依赖项。试图加载格式不正确的程序。
未能加载文件或程序集“XXX.XXX”或它的某一个依赖项。试图加载格式不正确的程序。解决办法