【问题标题】:How to tell System.Data.OracleClient to use the 64 bit Oracle Driver如何告诉 System.Data.OracleClient 使用 64 位 Oracle 驱动程序
【发布时间】:2011-10-11 02:19:13
【问题描述】:

我正在尝试在 Win7 x64 工作站上运行使用 System.Data.OracleClient 的 .NET 应用程序。工作站安装了 32 位 Oracle 客户端,导致以下错误消息:

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

这是我漫长的尝试和失败之旅:

  1. 我尝试安装 Oracle 客户端 win64_11gR2_client。但是在设置过程中它崩溃了,没有任何评论。
  2. 我关注answer from a different SO thread,尝试提取instantclient-basic-windows.x64-11.2.0.2.0,并将包含二进制文件的文件夹放入Windows PATH 变量中。我仍然收到相同的错误消息(即使在重新启动后)。
  3. 我按照this answer 的“替代方式”复制了文件oci.dll、orannzsbb11.dll、oraociei11.dll 进入我的网站项目的 bin/ 文件夹。还是一样的错误信息。
  4. 我尝试将即时客户端中的所有文件复制到该目录并再次尝试,但没有成功。
  5. 我安装了ODAC112021Xcopy_x64.zip,并将安装文件夹和bin文件夹放在windows PATH变量中。没有成功。
  6. 我把希望寄托在 this answer 上,并查看了注册表中的 DllPath(实际上应该与 ODP.NET 相关,而不是 System.Data.OracleClient),发现 DllPath 指向正确的 x64 安装 ODAC,因此,如果我的应用程序没有使用 System.Data.OracleClient,它应该可以工作,b 但由于它确实使用了它,它仍然失败。
  7. 我在 Google 上搜索和 stackoverflew,但没有找到我已经提到的帖子的其他任何内容。
  8. 我精心设计了这个 SO 问题,希望能从有见识的 SO 用户那里得到任何有见地的建议。
  9. 从 b_levitt 得到第一个答案后,我尝试在 Application_Start 的 Global.asax 中添加以下行:

    Environment.SetEnvironmentVariable("ORACLE_HOME", @"C:\OracleProducts\Odac-11.2.0.2.1-x64");
    Environment.SetEnvironmentVariable("PATH", @"C:\OracleProducts\Odac-11.2.0.2.1-x64;C:\OracleProducts\Odac-11.2.0.2.1-x64\bin");
    

    C:\OracleProducts\Odac-11.2.0.2.1-x64 是我安装 ODAC 64 位 xcopy 版本的位置。 也没有成功。

在相关说明中,我什至尝试过force my .NET app into 32bit mode without success,但那是另一回事。我需要一个具有前瞻性的解决方案,即 64 位。

【问题讨论】:

    标签: windows-7 .net-4.0 64-bit oracle11gr2 system.data.oracleclient


    【解决方案1】:

    我遇到了和你一样的问题。我通过 Oracle 论坛和 stackoverflow 找到了我的大部分答案。我无法发布链接以供参考,但我可以给你一些尝试。

    1. 还将 OraOps11w.dll 与其他 Oracle dll 文件一起包含在您的 bin 目录中。
    2. 转到项目属性|参考路径,将 C:\Windows\Microsoft.NET\Framework64\v2.0.50727 或 C:\Windows\Microsoft.NET\Framework64\v4.0.30319 添加到参考路径中,具体取决于哪个框架项目正在使用的版本。
    3. **我不太记得的模糊部分:删除 System.Data.OracleClient 当前引用并从 C:\Windows\Microsoft.NET\Framework64\v2.0.50727 或 C:\Windows\ 添加新引用Microsoft.NET\Framework64\v4.0.30319 到参考路径,具体取决于项目使用的框架版本。

    查看异常是否消失。

    仅供参考,Microsoft 将在不久的将来放弃对 Oracle 数据提供程序(在 ADO.NET 中)的支持。它目前通过 .NET 4 运行,但最好开始测试本机 Oracle 驱动程序。

    【讨论】:

      【解决方案2】:

      您的#5 应该可以工作,但您还需要设置 ORACLE_HOME 环境变量。我已经这样做了很多次,包括最近使用您正在使用的 xcopy 安装。请查看my experience with the xcopy install,让我知道您遇到了什么样的额外错误。

      就我而言,我是为 asp.net 设置的,但 winforms 更容易。您可以打开一个 cmd 窗口,使用“set”命令设置 PATH 和 ORACLE_HOME 环境变量,然后从同一个 cmd 窗口运行您的应用程序。解决错误后,您可以使用 Environment.SetEnvironmentVariable 在代码中设置这些错误。

      作为记录,我确实避免在客户端计算机上安装 oracle 客户端,而是通过 Web 服务处理所有业务逻辑。这样我只需要 web 服务器上的 oracle 组件。

      【讨论】:

      • 这看起来很有希望。回去工作的时候试试。事实上,我有两个这个问题的实例,一个是 ASP.NET,一个是桌面应用程序。
      • 你应该没有问题。我对 ASP.net、Winforms 甚至服务的 SetEnvironmentVariable 函数很幸运。这当然只有在您不想在系统级别设置这些变量时才有必要。如果这是机器上唯一的 oracle 客户端,我只需设置 ORACLE_HOME 和 PATH 系统环境变量。
      • 嗨,b_levitt。我试过了,不幸的是我仍然收到相同的错误消息(请参阅我更新的问题中的新 #9)
      • 我应该更清楚 - 除了 Oracle.DataAccess.dll 之外,您的应用程序中不应有任何 oracle 文件或 dll(如果您选择 GAC dll,这也是可选的)。确保它是 xcopy 安装中 odp.net\bin 文件夹中的那个。确保您的参考属性中的“特定版本”设置为 true(如果这是程序集不匹配,至少您会收到不同的错误)。确认您还撤消了 #6 或将其更改为指定新的 xcopy loc。您可以在这里找到未管理的文件搜索顺序:download.oracle.com/docs/html/E10927_01/InstallODP.htm
      • 进程监视器在这里也可能会有所帮助,因为它应该让您查看您的应用程序及其相应的 oracle 提供程序正在尝试访问的文件和注册条目:technet.microsoft.com/en-us/sysinternals/bb896645
      猜你喜欢
      • 1970-01-01
      • 2014-07-03
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多