如何强制.NET应用程序以32位模式运行

时间:2011-06-29 15:20:24

标签: .net-3.5 x86 64-bit corflags

我正在尝试在Win7 x64上运行我的.NET 3.5 WinForms应用程序。该应用程序使用NHibernate和System.Data.OracleClient来访问Oracle数据库。 Oracle客户端是32位。

启动应用时,我收到以下错误消息

  

尝试加载Oracle客户端库会引发BadImageFormatException。    在安装了32位Oracle客户端组件的64位模式下运行时会发生此问题。

为此,我将构建目标定位到x86平台:

Screenshot of the Build settings

令我惊讶的是,当尝试在Win7平台上执行新版本时,出现了同样的错误消息

NHibernate程序集在运行时由Assembly.Load("...");加载。

可能是NHibernate DLL仍然以64位模式运行,而主机exe以32位模式运行。这听起来很奇怪。或者可能是因为某种原因,我的应用程序以64位模式运行,即使它是针对x86的?


更新

我使用CorFlags检查了我的二进制文件,它标记为32位:

Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.0.30319.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 3
ILONLY    : 1
32BIT     : 1
Signed    : 0

我也在任务管理器中检查了它,后缀为*32

我还尝试并使用CorFlags将32位标志添加到我的应用程序附带的 所有 程序集。它仍会产生相同的错误消息。

我很困惑......困惑......困惑......

6 个答案:

答案 0 :(得分:6)

32位进程无法加载64位DLL,反之亦然(有关详细信息,请参阅this)。这意味着如果您的进程成功加载了64位DLL,那么它绝对是一个64位进程。您可以在任务管理器中验证(如Lasse建议的那样)或通过here描述的其他方式。该文章还提供了有关Windows x64上.Net的更多信息。

答案 1 :(得分:3)

正确,听起来NHibernate程序集是以AnyCPU为平台目标而构建的。你需要一个专为x86构建的NHibernate程序集。

答案 2 :(得分:2)

您可以尝试RunAsx86

当从命令行运行.NET应用程序时,我使用此工具以x86模式启动.NET应用程序。

答案 3 :(得分:0)

如果它对任何人有帮助,我在使用Oracle 64位和Windows 7 64位时遇到了相同的症状。我单独离开了平台目标(没有更改任何项目设置)。相反,我只是安装了oracle 32位并解决了这个问题。请务必更新环境变量(即ORACLE_HOME,PATH)以指向32位版本。

答案 4 :(得分:0)

之前我遇到过类似的问题。我有一个使用Crystal Reports的Windows服务,我的64b机器上的一切都很好,我调整了一切 - 该项目是为了使用x86架构而构建的。

当部署到不同的计算机时出现问题,该服务失败,因为Crystal Reports引擎无法加载log4net.dll 1.2.10程序集。我检查了目录 - 那里的版本是1.2.11,我的本地目录包含相同的版本。 bindingRedirect无效。

然后我检查了GAC-CR dll已签名并由安装程序添加到GAC,log4net 1.2.10在那里,但处理器架构不是x86。 为log4net 1.2.10架构添加x86后,它就像一个魅力。

答案 5 :(得分:0)

我在c ++ oracle应用程序中遇到了同样的错误,我需要在32位机器上运行64位机器。坏图像错误是由于32位和64位的dll的混合所以我使用依赖性walker来找到混合的dll。在该应用程序中,我发现oci.dll是64位,因为我已经安装了64位的oracle客户端,但所有其他的32位dll。所以我在64位机器上安装了32位的oracle客户端并解决了这个错误。