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

chi*_*oro 10 64-bit x86 corflags .net-3.5

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

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

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

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

Build设置的屏幕截图

令我惊讶的是,尝试在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
Run Code Online (Sandbox Code Playgroud)

我也在任务管理器中检查了它,它有一个*32后缀.

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

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

Hel*_*ein 6

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


use*_*116 3

是的,听起来 NHibernate 程序集是AnyCPU以其平台目标构建的。您需要一个专门为 x86 构建的 NHibernate 程序集。