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

本文讨论了遇到BadImageFormatException错误的原因和解决方法,该错误发生在尝试运行依赖于另一个项目的控制台应用时。错误指出无法加载ProgramA的程序集,尽管两个项目都是纯.NET项目且无本机代码。尝试了多种解决方案,如检查项目平台目标、清理/重建解决方案、重启Visual Studio等,但问题仍未解决。讨论中提到了可能是32位/64位不匹配的问题,建议检查并统一项目平台目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文翻译自:Could not load file or assembly … An attempt was made to load a program with an incorrect format (System.BadImageFormatException)

I have two projects, ProjectA and ProjectB . 我有两个项目, ProjectAProjectB ProjectB is a console application, which depends on ProjectA . ProjectB是一个控制台应用程序,它依赖于ProjectA Yesterday, everything was working fine, but suddenly today when I run ProjectB I get this: 昨天,一切正常,但是今天突然当我运行ProjectB我得到了:

BadImageFormatException was unhandled : BadImageFormatException未处理
Could not load file or assembly 'ProjectA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. 无法加载文件或程序集'ProjectA,版本= 1.0.0.0,区域性=中性,PublicKeyToken =空'或其依赖项之一。 An attempt was made to load a program with an incorrect format. 试图加载格式错误的程序。

Both are just regular projects, with no dependencies on any other non-.Net projects. 两者都是常规项目,不依赖于任何其他非.Net项目。 Both are fully .Net - there is no native code, and no P/Invoke. 两者都是完全.Net-没有本机代码,也没有P / Invoke。 I have other projects which depend on ProjectA and still work just fine. 我还有其他依赖ProjectA ,但仍然可以正常工作。

Things I have tried: 我尝试过的事情:

  • Make sure both projects are set to "Any CPU," with the build checkbox checked. 确保两个项目都设置为“ Any CPU”,并且选中了构建复选框。 They are. 他们是。
  • Make sure both projects are for the same Target Framework (.Net 4.0 Client Profile) . 确保两个项目都针对相同的目标框架(.Net 4.0客户端配置文件)
  • Under ProjectB --> References --> ProjectA --> Properties, make sure "Copy Local" is set to "True" _ (I verified that ProjectA.dll is being copied correctly) 在ProjectB->引用-> ProjectA->属性下,确保将“ Copy Local”设置为“ True” _ (我已验证ProjectA.dll是否已正确复制)
  • Clean/Rebuild the solution. 清洁/重建解决方案。 I even tried manually deleting the /bin and /obj folders in both projects. 我什至尝试在两个项目中手动删除/ bin和/ obj文件夹。
  • Restart Visual Studio. 重新启动Visual Studio。 Restart my computer. 重新启动计算机。
  • Check out an entirely new copy of the repository. 签出存储库的全新副本。

But I still get the same error. 但是我仍然遇到同样的错误。 I have no idea what I did to cause this, nor how to fix it. 我不知道该怎么做,也不知道如何解决。 Any ideas? 有任何想法吗?


#1楼

参考:https://stackoom.com/question/lhwe/无法加载文件或程序集-试图加载格式不正确的程序-System-BadImageFormatException


#2楼

I am pretty sure you're having a 32-bit / 64-bit conflict. 我很确定您遇到32位/ 64位冲突。 It sounds like your main project might be set to 32-bit while the class its referencing is set to 64-bit. 听起来您的主项目可能设置为32位,而其引用的类设置为64位。 Try looking at this SO question and this one too . 尝试看这个SO问题也是 这个问题 Between the two of them, you should be able to figure out your problem. 在这两者之间,您应该能够找出问题所在。


#3楼

I had this same problem. 我有同样的问题。 I had set Project A's "Platform Target" ("Project A"(Right Click)->Properties->Build->"Platform Target") to x86 but kept Project B's at "Any CPU". 我已经将项目A的“平台目标”(“项目A”(右键单击)->“属性”->“构建”->“平台目标”)设置为x86,但将项目B的目标保持在“任何CPU”。 Setting Project B's to "x86" fixed this. 将项目B设置为“ x86”可解决此问题。


#4楼

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


#5楼

I encountered the same issue. 我遇到了同样的问题。 It popped up out of the blue and that seemed strange to me. 它突然冒出来,对我来说似乎很奇怪。

In the Exception snapshot, for the FusionLog, I saw the following within its message: 在Exception快照中,对于FusionLog,我在其消息中看到以下内容:

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

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

All the projects had a Target CPU of AnyCPU. 所有项目的目标CPU均为AnyCPU。 I changed the application project (the project that references all the other projects) to a Target CPU of x86. 我将应用程序项目(引用所有其他项目的项目)更改为x86的目标CPU。 It now works. 现在可以使用了。

Not sure how the Target CPU mix up occurred for no apparent reason, but it did. 不确定目标CPU是如何混合的,没有明显原因,但是确实如此。


#6楼

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

### C# 中 `System.BadImageFormatException` 的解决方案 #### 问题概述 当在 C# 应用程序中运行时抛出 `System.BadImageFormatException` 异常,通常表示尝试加载程序动态链接库(DLL)与其目标平台架构匹配。此异常可能由多种原因引起,主要包括但限于以下两种情况:程序的目标平台与引用 DLL 文件的系统平台一致[^2]。 --- #### 可能的原因及解决办法 1. **目标平台一致** 如果应用程序和其引用的 DLL 文件之间的目标平台架构存在差异,则会引发此类错误。例如,如果应用程序是以 x86 架构为目标构建的,而所引用的 DLL 是以 x64 架构为目标构建的,者反之亦然,则会出现这种异常[^3]。 - **解决方案**: 确保应用程序及其所有依赖项都具有相同的目标平台架构。可以通过修改项目的属性来实现这一点。具体操作如下: - 打开 Visual Studio 并导航到项目属性页面。 - 转至“生成”选项卡,并将“平台目标”设置为与使用的 DLL 对应的架构(即 x86 x64)。对于某些场景,建议显式指定目标平台而是使用默认的 AnyCPU 设置。 2. **IIS 配置中的兼容性问题** 当部署基于 ASP.NET 的 Web 应用程序并遇到此异常时,可能是由于 IIS 应用程序池配置当引起的。即使操作系统支持 64 位模式,但如果应用需要访问特定于 32 位的操作系统组件,则仍需调整 IIS 设置以便允许执行这些组件[^5]。 - **解决方案**: 修改 IIS 上的应用程序池设置以启用对 32 位应用程序的支持: ```plaintext 步骤一: 打开 IIS Manager. 步骤二: 查找对应的应用程序-> 单击右侧栏内的【高级设置】按钮。 步骤三: 将 “Enable 32-Bit Applications” 属性设为 True。 ``` 3. **第三方 SDK/DLL 兼容** 使用某些厂商提供的 SDK 者自定义开发的本地 DLL 文件也可能成为触发因素之一。比如,在集成像海康威视这样的设备 SDK (`MvCameraControl.Net.dll`) HALCON 图形处理库(`halcondotnet.dll`)过程中,如果没有按照官方文档指示正确安装相应版本的软件包以及配套资源文件,同样容易遭遇上述错误提示[^4]。 - **解决方案**: 安装适配当前系统的完整版SDK套件;仔细阅读产品手册了解各部分功能模块所需的最低硬件需求及相关注意事项说明;必要情况下联系技术支持团队寻求进一步指导帮助完成整个过程顺利实施。 --- #### 示例代码展示如何更改VisualStudio项目平台目标 以下是通过编程方式改变 .NET Framework 控制台应用程序平台目标的例子: ```csharp using System; using Microsoft.Build.Evaluation; class Program { static void Main() { string projectPath = @"C:\path\to\yourproject.csproj"; ProjectCollection pcoll = new ProjectCollection(); Project p = pcoll.LoadProject(projectPath); Console.WriteLine($"Current PlatformTarget is {p.GetPropertyValue("PlatformTarget")}"); // Set the platform target to x64 or any other desired value p.SetProperty("PlatformTarget", "x64"); Console.WriteLine($"New PlatformTarget set to {p.GetPropertyValue("PlatformTarget")}"); p.Save(); } } ``` 注意以上脚本仅适用于演示目的,请根据实际工作流调整路径参数等内容后再投入使用。 --- ### 结论 综上所述,针对 `System.BadImageFormatException` 错误的有效应对策略主要围绕以下几个方面展开讨论:确认源码工程本身设定无误、核查引入外部依赖关系链路清晰合理、最后再考虑服务器端环境变量影响等因素综合判断处置即可有效规避类似状况发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值