.net BadImageFormatException。当在64位模式下运行并安装了32位Oracle客户端组件时,会发生这种情况

.net BadImageFormatException。当在64位模式下运行并安装了32位Oracle客户端组件时,会发生这种情况,.net,oracle,oracle11g,.net,Oracle,Oracle11g,当我的.Net应用程序的上一个尝试连接到oracle数据库时,我收到此错误 错误说明在安装了32位Oracle客户端组件的情况下以64位模式运行时会出现此问题。。很多次客户端安装在x64位而不是32 Date Time: 6/8/2014 10:57:55 AM: System.InvalidOperationException: Attempt to load Oracle client libraries threw BadImageFormatException. This proble

当我的
.Net
应用程序的上一个尝试连接到oracle数据库时,我收到此错误

错误说明
在安装了32位Oracle客户端组件的情况下以64位模式运行时会出现此问题。
。很多次客户端安装在
x64
位而不是
32

Date Time: 6/8/2014 10:57:55 AM: System.InvalidOperationException: Attempt to load Oracle client libraries threw BadImageFormatException.  This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
       at System.Data.Common.UnsafeNativeMethods.OCILobCopy2(IntPtr svchp, IntPtr errhp, IntPtr dst_locp, IntPtr src_locp, UInt64 amount, UInt64 dst_offset, UInt64 src_offset)
       at System.Data.OracleClient.OCI.DetermineClientVersion()
       --- End of inner exception stack trace ---
       at System.Data.OracleClient.OCI.DetermineClientVersion()
       at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
       at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
       at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
       at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       at System.Data.OracleClient.OracleConnection.Open()
       at CustomizedSetupInstaller.Runscripts.InitializeDBObjects(String connectionString, String dbProvider)

当32位(x86)dll调用64位dll或反之亦然时,会发生BadImageFormatException。如果使用AnyCPU作为入口可执行文件,那么当在64位机器上运行时,它将以64位运行,但是如果调用32位dll,则会出现异常,这就是为什么AnyCPU并不总是答案

我倾向于以32位(x86)构建所有组件,因为我们仍然需要与一些用VB6(32位(x86))完成的旧组件进行接口。虽然性能可能更好的64位机器,如果我们在哪里建立任何CPU的可靠性对我们来说更重要


我建议您尝试用32位(x86)构建所有组件,除非您正在做一些非常密集的工作,否则我怀疑这会有多大不同。

一个解决方案是在您的计算机上同时安装x86(32位)和x64 Oracle客户机,那么您的应用程序在哪个体系结构上运行并不重要

下面是在一台计算机上安装x86和x64 Oracle客户端的说明:


假设:Oracle Home称为
OraClient11g_home1
,客户端版本为11gR2

  • (可选)删除任何已安装的Oracle客户端(查看是否面临问题)

  • 下载并安装Oracle x86客户端,例如安装到
    C:\Oracle\11.2\Client\u x86

  • 下载Oracle x64客户端并将其安装到不同的文件夹中,例如C:\Oracle\11.2\Client\u x64

  • 打开命令行工具,转到文件夹%WINDIR%\System32,通常是
    C:\Windows\System32
    ,并创建指向文件夹
    C:\Oracle\11.2\Client\u x64
    的符号链接
    ora112
    (请参阅下面的命令部分)

  • 更改到文件夹%WINDIR%\SysWOW64,通常是
    C:\Windows\SysWOW64
    ,并创建一个符号链接
    ora112
    ,指向文件夹
    C:\Oracle\11.2\Client\u x86
    (见下文)

  • 修改
    PATH
    环境变量,用
    C:\Windows\System32\ora112
    替换所有条目,如
    C:\Oracle\11.2\Client\u x86
    C:\Oracle\11.2\Client\u x64
    ,分别替换它们各自的
    \bin
    子文件夹。注意:
    C:\Windows\SysWOW64\ora112
    不能在路径环境中

  • 如果需要,将您的
    ORACLE\u HOME
    环境变量设置为
    C:\Windows\System32\ora112

  • 打开注册表编辑器。将注册表值
    HKLM\Software\ORACLE\KEY\u OraClient11g\u home1\ORACLE\u HOME
    设置为
    C:\Windows\System32\ora112

  • 将注册表值
    HKLM\Software\Wow6432Node\ORACLE\KEY\u OraClient11g\u home1\ORACLE\u HOME
    设置为
    C:\Windows\System32\ora112
    (非
    C:\Windows\SysWOW64\ora112

  • 你完了!现在,您可以无缝地同时使用x86和x64 Oracle客户端,即x86应用程序将加载x86库,x64应用程序加载x64库,而无需对系统进行任何进一步修改

  • TNS\u ADMIN
    环境变量(注册表中的相应
    TNS\u ADMIN
    项)设置为公共位置,例如
    TNS\u ADMIN=C:\Oracle\common\network
    ,可能是一个明智的选择

用于创建符号链接的命令:

cd C:\Windows\System32
mklink/d ora112 C:\Oracle\11.2\Client\u x64
cd C:\Windows\SysWOW64
mklink/d ora112 C:\Oracle\11.2\Client_x86

注:

两个符号链接必须具有相同的名称,例如
ora112


尽管名称不同,文件夹
C:\Windows\System32
包含x64库,而
C:\Windows\SysWOW64
包含x86(32位)库。不要混淆。

在我的情况下,Oracle 11.232位客户端安装在我的64位Windows2008 R2操作系统上

我的解决方案:在分配给我的ASP.NET应用程序的应用程序池的高级设置中,我将启用32位应用程序设置为

请参阅下面的单机版.ashx测试脚本,我用它来测试连接到Oracle的能力。在更改应用程序池之前,其响应为:

[以64位运行]连接失败。
…在应用程序池更改之后:

[以32位身份运行]连接成功。

TestOracle.ashx–通过System.Data.OracleClient测试Oracle连接的脚本:

使用:根据需要更改用户、密码和主机变量

请注意,此脚本可以独立使用,而不会干扰ASP.NET web应用程序项目文件。把它放到你的应用程序文件夹里


使用制度;
使用System.Data.OracleClient;
使用System.Web;
公共类handler 1:IHttpHandler
{
私有静态只读字符串m_User=“User”;
私有静态只读字符串m_Password=“Password”;
私有静态只读字符串m_Host=“Host”;
公共void ProcessRequest(HttpContext上下文)
{
context.Response.ContentType=“text/plain”;
字符串结果=TestOracleConnection();
context.Response.Write(结果);
}
公共布尔可重用
{
获取{return false;}
}
私有字符串TestOracleConnection()
{
字符串结果=IntPtr.Size==8?
“[以64位运行]:”[以32位运行]”;
尝试
{
string connString=string.Format(
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <oracle.dataaccess.client>
    <add key="DllPath"            value="C:\oracle\bin"/>
  </oracle.dataaccess.client>
</configuration>
Select Application Pools.
Clic in ASP .NET V4.0 Classic.
Select Advanced Settings.
In General, option Enable 32-Bit Applications, default is false. Select TRUE.
Refresh and check site.