我正在尝试在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位标志添加到我的应用程序附带的 所有 程序集。它仍会产生相同的错误消息。
我很困惑......困惑......困惑......
答案 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客户端并解决了这个错误。