【问题标题】:Application built exactly the same way in both Debug and Release configurations doesn't work in Release on Win7: BadImageFormatException在 Debug 和 Release 配置中以完全相同的方式构建的应用程序在 Win7 上的 Release 中不起作用:BadImageFormatException
【发布时间】:2015-02-19 18:36:25
【问题描述】:

我正在 Win7 x64 机器上开发应用程序。

有一些代码可以调用外部 .dll 文件。 .dll 是为 32 位机器构建的。我遇到的问题是在调试器中以Debug 配置运行应用程序时,它工作正常。一旦我切换到Release,任何进入进行 .dll 调用的方法的条目都会失败,并显示

An unhandled exception of type 'System.BadImageFormatException' occurred in MyCool.exe

Additional information:  is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)

ReleaseDebug 的配置相同,并且正在为 x86 构建应用程序。此问题仅发生在 Windows 7 机器上。我们的客户运行 XP 没有问题。诚然,我们没有运行 XP x64 的客户,因此我无法验证这一点。

这是我的解决方案配置的图片:

我已将 Platform: 选项更改为所有可能的组合,但它仍然无法正常工作。 Debug 配置是否有一些隐藏的东西?

编辑:我想通了,但我真的不明白这个问题。

在项目属性中每个项目的Build 选项卡(VB 项目的Compile 选项卡)我必须将Target CPU 设置为x86 而不是AnyCPU。

也许这是另一个问题,但是:为什么?将整个解决方案的平台设置为 x86 和在每个项目的基础上将目标 CPU 设置为 x86 之间有什么区别。另外,在上图中:那么Platform 字段的用途是什么??

【问题讨论】:

  • 是的,与平台设置无关。名称 (x86) 和 AnyCPU 都不相关。只有 Project + Properties, Build 选项卡中的设置很重要。
  • ..... 那么......平台会做什么呢?
  • 没什么。它只对 C++ 项目很重要。当它很重要时,它会影响所使用的编译器和链接器。 .NET 编译器与平台无关,因为 MSIL 是。
  • 这令人难以置信的误导,但我想这是有道理的......

标签: .net configuration badimageformatexception


【解决方案1】:

这是因为 AnyCPU 将以 64 位运行,但您的 DLL 很可能编译为 32 位 DLL。您不能从 64 位可执行文件中交叉调用 32 位 DLL。

在将您的应用设置为 x86 时,这将强制它作为 32 位应用程序编译(和运行)。

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 2023-03-31
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多