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

Mav*_*ven 34 .net oracle oracle11g

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

错误说明了This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed..但我已经多次确定客户端安装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)
Run Code Online (Sandbox Code Playgroud)

Wer*_*eit 47

一种解决方案是在您的计算机上安装x86(32位)和x64 Oracle客户端,然后运行应用程序的架构无关紧要.

这是在一台机器上安装x86和x64 Oracle客户端的说明:

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

  • (可选)删除任何已安装的Oracle客户端(如果遇到问题,请参阅如何卸载/完全删除Oracle 11g(客户端)?)

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

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

  • 打开命令行工具,转到文件夹%WINDIR%\ System32,通常C:\Windows\System32创建一个指向ora112文件夹的符号链接C:\Oracle\11.2\Client_x64(参见下面的命令部分)

  • 通常更改为文件夹%WINDIR%\ SysWOW64 C:\Windows\SysWOW64并创建指向ora112文件夹的符号链接C:\Oracle\11.2\Client_x86(参见下文)

  • 修改PATH环境变量,更换喜欢的所有条目C:\Oracle\11.2\Client_x86,并C:\Oracle\11.2\Client_x64通过C:\Windows\System32\ora112,相应的其\bin子文件夹.注意:C:\Windows\SysWOW64\ora112不得在PATH环境中.

  • 如果需要,请将ORACLE_HOME环境变量设置为C:\Windows\System32\ora112

  • 打开注册表编辑器.将注册表值设置HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEC:\Windows\System32\ora112

  • 将注册表值设置HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEC:\Windows\System32\ora112(不C:\Windows\SysWOW64\ora112)

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

  • 例如,将TNS_ADMIN环境变量(TNS_ADMIN在Registry中的resp.条目)设置为公共位置可能是明智的选择TNS_ADMIN=C:\Oracle\Common\network.

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

cd C:\Windows\System32 mklink /d ora112 C:\Oracle\11.2\Client_x64 cd C:\Windows\SysWOW64 mklink /d ora112 C:\Oracle\11.2\Client_x86

笔记:

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

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


Dav*_*dRR 11

在我的情况下,甲骨文11.2 32位客户端 安装在我的64位Windows 2008 R2操作系统.

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

请参阅下面的我用于测试连接到Oracle的能力的独立.ashx测试脚本.在更改应用程序池之前,它的响应是:

[Running as 64-bit] Connection failed.
Run Code Online (Sandbox Code Playgroud)

...并在应用程序池更改后:

[Running as 32-bit] Connection succeeded.
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,此脚本可以独立使用,而不会干扰ASP.NET Web应用程序项目文件.只需将其放入应用程序文件夹即可.

<%@ WebHandler Language="C#" Class="Handler1" %>
<%@ Assembly Name="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" %>

using System;
using System.Data.OracleClient;
using System.Web;

public class Handler1 : IHttpHandler
{
    private static readonly string m_User = "USER";
    private static readonly string m_Password = "PASSWORD";
    private static readonly string m_Host = "HOST";

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";

        string result = TestOracleConnection();
        context.Response.Write(result);
    }

    public bool IsReusable
    {
        get { return false; }
    }

    private string TestOracleConnection()
    {
        string result = IntPtr.Size == 8 ?
            "[Running as 64-bit]" : "[Running as 32-bit]";

        try
        {
            string connString = String.Format(
              "Data Source={0};Password={1};User ID={2};",
              m_Host, m_User, m_Password);

            OracleConnection oradb = new OracleConnection();
            oradb.ConnectionString = connString;
            oradb.Open();
            oradb.Close();
            result += " Connection succeeded.";
        }
        catch
        {
            result += " Connection failed.";
        }

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 10

我在Windows 10 PC上遇到了同样的问题.我将项目从旧计算机复制到新计算机(64位),并在新计算机上安装了Oracle Client 64位.我得到了同样的错误信息,但在尝试了许多解决方案后没有效果,实际上对我有用的是:在Visual Studio中(我的是2017年)转到工具>选项>项目和解决方案> Web项目

在该页面上,选中以下选项:使用64位版本的IIS Express for Websites and Projects


小智 5

修改IIS

  1. 选择应用程序池。
  2. 单击 ASP .NET V4.0 Classic。
  3. 选择高级设置。
  4. 一般情况下,选项启用 32 位应用程序,默认为 false。选择真。
  5. 刷新并检查站点。

评论:

平台:Windows Server 2008 R2 Enterprise - 64 位 - IIS 7.5