【发布时间】:2011-09-25 06:28:10
【问题描述】:
我正在尝试在 Win7 x64 上运行我的 .NET 3.5 WinForms 应用程序。该应用程序使用 NHibernate 和 System.Data.OracleClient 来访问 Oracle 数据库。 Oracle 客户端是 32 位的。
启动应用程序时,我收到以下错误消息
尝试加载 Oracle 客户端库引发了 BadImageFormatException。 在安装了 32 位 Oracle 客户端组件的 64 位模式下运行时会出现此问题。
作为回应,我将我的构建定位到 x86 平台:
令我惊讶的是,当尝试在 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 位标志添加到我的应用程序附带的 all 程序集中。它仍然会产生相同的错误消息。
我很困惑...很困惑...很困惑...
【问题讨论】:
-
您是否通过任务管理器检查过您的程序在崩溃时是在 32 位还是 64 位模式下运行的?如果它的进程名称后面有“*32”,则它是 32 位的,否则是 64 位的(假设是 64 位操作系统和系统。)
-
那么您针对 x86 的目标是什么?你的类库?你的程序?两者都有?
-
@Lasse:更详细地说,该应用程序由 3 层、2 个 DLL 和 1 个 EXE 组成,而一个 DLL 引用 NHibernate。我已将所有这些都针对 x86,并确保 EXE 项目在编译时使用 DLL 项目的 x86 箱。我唯一无法控制的是 NHibernate DLL 本身。
-
您确定 NHibernate 程序集是 Any CPU,而不是 64 位?
-
@Lasse:是的,因为该应用程序在 Windows XP 32 位上运行流畅。我可能不得不尝试下载源代码并自行编译,但这会使构建和部署过程变得更加复杂,而且我很难相信加载到 EXE 进程中的程序集可以在不同的模式下运行比EXE本身。但是,我不是 .NET 深度的专家……
标签: .net-3.5 x86 64-bit corflags