为什么ODP.NET 11 xcopy部署不能在安装了Oracle DB 10的计算机上运行?

Jos*_*off 5 oracle odp.net

我有一个应用程序,使用.exe文件所在目录下的本地版本的ODAC 11.我们的想法是,我们希望我们的应用程序使用本地ODAC 11,无论用户在她的计算机上安装了什么.

Oracle.DataAccess.dll与.exe位于同一目录中.

当客户端计算机没有安装Oracle客户端时,它可以正常工作,但在安装了Oracle Database 10.2.0.something的计算机上启动它时出错:

The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.

[Stack Trace]

The provider is not compatible with the version of Oracle client
OracleException
   at Oracle.DataAccess.Client.OracleInit.Initialize()
   at Oracle.DataAccess.Client.OracleConnection..cctor()
Run Code Online (Sandbox Code Playgroud)

我猜这与运行时绑定策略有关,但在Google上搜索"Oracle/ODAC/ODP.NET运行时绑定策略"并没有发现任何有用的东西.

有谁知道如何解决这个问题?

如果不是这个特定的问题,有人可以指出我如何做我想做的概述:确保我的应用程序使用ODAC 11无论如何?

Jos*_*off 4

据我了解,问题在于,虽然 Oracle.DataAccess.dll 与应用程序位于同一目录中,但它无法找到其较低级别的朋友(oci 等),因此出现兼容性错误。

事实证明,如果您希望应用程序能够与 ODAC 11 xcopy 部署配合使用,无论用户在其计算机上还安装了哪些其他内容,您需要执行以下两件事:

  1. 设置进程的 PATH 环境变量。(我已经在这样做了。)
  2. 为进程设置 ORACLE_HOME 环境变量。(我没有这样做。)

    Environment.SetEnvironmentVariable("PATH", Environment.CurrentDirectory + "\\oracle\\11.1\\odac;" + Environment.CurrentDirectory + "\\oracle\\11.1\\odac\\bin;", EnvironmentVariableTarget.Process);
    Environment.SetEnvironmentVariable("ORACLE_HOME", Environment.CurrentDirectory + "\\oracle\\11.1\\odac", EnvironmentVariableTarget.Process);
    
    Run Code Online (Sandbox Code Playgroud)

编辑:还需要注意的是,Oracle 不仅会因为环境问题而抛出此错误,而且如果目标计算机上缺少其中一个文件,也会抛出此错误。尽管有环境设置,我在其他计算机上也遇到了同样的错误,因为我将 Subversion 设置为忽略名为“bin”的目录,因此 OraOps DLL 没有被复制到客户端。