【发布时间】: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