【问题标题】:Alternate cause of BadImageFormatException in .NET Assembly?.NET 程序集中 BadImageFormatException 的替代原因?
【发布时间】:2010-03-22 17:51:49
【问题描述】:

我正在使用 C# 开发一个 .NET 3.5 控制台应用程序,它使用 VC++ 非托管 DLL。几周前我处理它时它运行没有问题,但我今天又回来了,现在得到一个 BadImageFormatException(“尝试加载格式不正确的程序。(来自 HRESULT 的异常: 0x8007000B)).

我的开发工作站运行 64 位 Windows 7,并且我使用非托管代码进行了大量工作,因此我立即检查了 .NET 程序集和 VC++ 库是否都具有 x86 目标。他们做到了。

为了确定,我清理并重建了 VC++ 库和 .NET 程序集,但无济于事。

这两个系统都没有做任何特别不寻常的事情。 VC++ 库加载一个二进制数据文件并对其内容进行一些数学处理。 .NET 程序集具有库的 DllImports 和一些用于连接它的代码。这一切都在几周前奏效了。

所以现在我想知道是否还有其他导致 BadImageFormatException 的原因比我可能遇到的 x86/x64 冲突更不常见。

谢谢。

编辑:无论 x86 或 x64 模式,我都会遇到相同的错误,但是当设置为“任何 CPU”时,执行会超过该点,但在稍后调用 VC++ 库时执行会中止,无一例外。不管这是否与这个问题有关,'Any CPU' 是否有与 x86 和 x64 不同的东西可以对此有所了解?

【问题讨论】:

  • 正在运行的应用程序是否有机会访问 x64 版本的 VC++ 库,而它正在尝试加载该库?或者,您正在运行的应用程序可能针对的是 AnyCPU 而不是 x86?如果您在 64 位环境中,AnyCPU 将在 64 位中加载。
  • 好问题。前者似乎不是这样,我尝试将项目复制到另一台从未有任何库副本的机器上,小心只复制 x86 版本的程序集。同样的问题发生在另一台机器上。该应用程序肯定设置为 x86。出于好奇,我将其设置为在“任何 CPU”中运行。当我这样做时,它会通过对 VC++ 库的第一次调用(设置为 x86 或 x64 时它会死掉),但在稍后调用该库时会终止执行。
  • 在 .exe 上运行 Dependency Walker x86,然后在 .dll 上运行。在 64 位机器上从 system32 复制 msvcr120.dll 后,我遇到过这个问题。喂!

标签: c# c++ visual-studio visual-studio-2008 dllimport


【解决方案1】:

当我收到此错误时,它总是由在 64 位进程中加载​​ 32 位 DLL 引起的。

设置EXE文件编译成x86看看能不能用。

【讨论】:

  • 正如我在最初的问题中所说,一切都设置为 x86。
【解决方案2】:

您可能正在尝试在 CLR 2.0 上加载为 CLR 4.0 构建的程序集。

【讨论】:

  • 感谢您的快速响应,但我们这里没有任何 Visual Studio 2010 安装,所以没有 CLR 4.0。
【解决方案3】:

检查 .dll 加载冲突!

我正在从 C# 调用 C++/CLI dll; C++/CLI 库是第三方原生 dll 的包装器。

原来我有两个同名的 dll,都在路径 (libeay32.dll) 中。

为了找出问题的根源,我安装了 windows 调试工具: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools 旧链接:http://www.microsoft.com/whdc/devtools/debugging/default.mspx

运行“gflags”(在“c:\Program Files\Debugging Tools ...”文件夹中)以启用加载程序“快照”的显示

> gflags -i <my test app.exe> +sls

然后在 cdb(控制台调试器)或 windbg 中运行应用程序,并在输出中搜索以找出导致异常的 dll。

例如

> cdb -g <my test app.exe>

重命名“错误”的 libeay32.dll 说明了问题,但这只是一个临时解决方案!

无论如何,同样的故障查找方法可能对你有用。

【讨论】:

  • 感谢@kfreezen!
【解决方案4】:

鉴于您在这里使用本机代码,我认为这里最可能的问题是您正试图加载本机 DLL,就好像它是一个 .Net 程序集一样。这是一种将产生BadImageFormatException 的场景。

尝试运行您的应用程序并将其设置为在抛出BadImageFormatException 时中断,然后查看正在加载的 DLL。如果是本地人,那就是问题所在。

【讨论】:

    【解决方案5】:

    在我的例子中,具有讽刺意味的是,在 EXE 的项目属性的“调试”选项卡中关闭 Enable unmanaged code debugging 具有讽刺意味的是,如果它被选中的话。

    说实话,我不知道为什么这是问题的原因。

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 2016-06-11
      • 2010-10-04
      • 1970-01-01
      • 2010-10-04
      相关资源
      最近更新 更多