系统.BadImageFormatException 尝试加载一个格式不正确的程序

65
我正在为另一个程序编写一个插件,该程序基于公共的.NET API。通常情况下,这些插件是通过创建引用API程序集的类库DLL来制作的。然后,通过从API程序集中继承基础命令类创建命令类。然后将应用程序设置为引用插件DLL文件,并在用户请求时负责实际启动自定义命令类。
然而,现在我正在尝试通过System.CodeDOM自动化一些代码生成,并希望创建一个简单的控制台应用程序,根据API程序集中的类型自动生成新的类类型。
但是,当我尝试运行我的应用程序时,我会收到以下异常:
System.BadImageFormatException was unhandled Message: Could not load file or assembly 'RevitAPI, Version=2011.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
通常我需要将插件程序集的目标框架设置为3.5。但是现在我发现,如果将我的控制台应用程序的目标框架设置为2.0,则上述错误消失了。但是,我的控制台应用程序已经引用了我其他的类库,它们的目标框架设置为3.5。而我真的不想围绕2.0框架重写它们。
9个回答

70

可能是32位和64位不匹配的问题。

如果您正在运行64位操作系统,则汇编RevitAPI可能会被编译为32位,而您的进程则为64位或“任何CPU”。

或者,RevitAPI被编译为64位,而您的进程被编译为32位或“任何CPU”,并且在32位操作系统上运行。


我正在运行Windows XP x64,我的所有其他项目都将其平台设置为“任何CPU”,但控制台应用程序的平台已设置为“x86”。我将其更改为“任何CPU”,现在出现异常--FileNotFoundException未处理:找不到指定的模块。 (来自HRESULT的异常:0x8007007E)。然而,我看不到任何有关未找到哪个文件或模块的详细信息。 - Eric Anastas
你检查过 RevitAPI 是如何编译的吗? - Simon Mourier
2
好的,我在 Stack Overflow 上找到了另一篇帖子,帮助我解决了这个问题。我在 RevitAPI 程序集上运行了 CorFlags。32BIT 标志被设置为 0,这意味着它是作为“Any CPU”编译的,对吗?此外,PE 标志设置为 PE32+。 - Eric Anastas
1
好的,那么现在你没有任何BadImageFormat异常了吗?FileNotFoundException是不同的:它意味着(可能)你缺少一个非托管的DLL。完整的堆栈信息会有所帮助。也许RevitAPI需要一个外部的DLL。 - Simon Mourier
在x64平台上构建C++项目解决了我的这个错误。 - Ben Wilde

52

如果您使用的是IIS, 前往应用程序池 选择您的站点所使用的池并点击高级设置 确保“启用32位应用程序”设置为True


我之前尝试将 Any CPU 改为 x86,但这没有起效。幸好在此之后找到了这篇答案。不知道为什么这项设置不默认启用,如果默认启用可以节省时间呢。 - Rich

46

我在安装 Visual Studio 2013、Visual Studio 2015 和 Visual Studio 2017 的 x64 项目时遇到了问题:

Tools
  -> Options
   -> Projects and Solutions
    -> Web Projects
     -> Check "Use the 64 bit version of IIS Express for web sites and projects"

1
+1. 在我的MVC项目中引用DLL时,在VS2015中为我工作。 我尝试将配置设置为x64,甚至链接到更新版本的程序集,但都无济于事。 这是最终起作用的解决方案。 - S Raghav
1
但是该选项已被禁用。 - k_kumar

8

这些建议是准确的,但我想补充一下。我曾经被卡住,原因是我有多个发布配置。我正在编辑“Debug - Any CPU”,然后部署“Debug - x64”配置。确保您编辑和部署相同的配置。在开始发布后,单击“设置”选项卡,弹出“发布Web”对话框。确保它与您编辑的配置匹配。(那是我永远无法挽回的4个小时!)


3

当我在另一台电脑上运行我的软件时,遇到了相同的问题。在我的开发者电脑(Windows 7)上,我已经安装了Visual Studio 2015,目标电脑是一个干净的Windows 10安装(.Net已安装)。我还在另一个包含.Net Framework的干净的Windows 7电脑上进行了测试。然而,在这两个目标电脑上,我需要安装Visual C++ Redistributable for Visual Studio 2015 x86或x64的软件包(取决于应用程序的构建方式)。这已经在我的开发者电脑上安装了。

我的应用程序使用了一个编译成C++应用程序的C库,使用visual studio中的/clr和/TP选项。此外,该应用程序通过使用dllexport方法签名向C#提供函数。不确定C#集成是否导致了这个错误,或者C++应用程序是否会给我带来相同的问题。

希望对大家有所帮助。


3
若要在 32 位或 62 位 CPU 上运行,请按照以下步骤进行操作: 在“解决方案资源管理器”中右键单击项目名称> 属性> 构建 并将以下设置放置在“配置”下:Active(发布),平台:Active(Any CPU) 和目标:x86。 然后,在“运行”按钮旁边选择选项ReleaseAny CPU。 最后,保存并运行。

2

enter image description here

我试图加载一个x86架构的dll。在C#项目中,我将平台目标描述为x86并消除了错误。


这对我有效。虽然它已经在开始按钮附近选择了“x64”,但似乎仍然构建并使用x32版本的二进制文件启动。 - Simon

1
我遇到了同样的问题,我只需要下载32位dll文件并将其添加到我的bin文件夹中,问题就解决了。

0
请注意所使用的引用dll文件版本非常重要。我在尝试使用MMC Snap-Ins中的WebView2组件与“HTMLView”或“FormView”类型时,几乎遇到了与“Microsoft.WebView2.FixedVersionRuntime.101.0.1210.39.x64”相同的问题。
我只需将dll文件(在我的情况下为WebView2Loader.dll,版本为1.0.1248.0,大小= 157640字节)复制到适当的路径中,该路径对项目可访问(您可以首先将其放置在项目输出文件旁以进行测试),然后WebView2浏览器就能按预期运行了。微软的错误消息有时(至少在我的情况下)有点误导,并没有提供足够明确的信息。
我收到了“BadImageFormatException”,通常发生在混合平台目标(例如在面向x86或反之的应用程序中使用在X64中编译的dll文件)或混合本机代码和.NET时,但这并不是我的问题。希望这能帮助那些可能陷入困境的人。

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