在现成的产品中支持不同版本的ODP.NET(Oracle.DataAccess.dll)的最佳做法是什么?

时间:2015-08-05 22:29:29

标签: .net oracle configuration

问题

我在支持Oracle DBMS的.NET COTS产品上工作。我的用户可能安装了Oracle客户端(和相应的ODP.NET),版本为9i,10g,11g或12c。我针对特定版本的ODP.NET(2.102.2.20)构建,如果用户安装了不同版本,则会出现“找不到Oracle.DataAccess”错误。

我尝试过的事情

  1. 工作:用户手动添加/修改dependentAssembly文件中的.exe.config部分:
  2. <dependentAssembly><assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" culture="Neutral" /><bindingRedirect oldVersion="2.102.2.20" newVersion="4.121.1.0" /><publisherPolicy apply="no"/></dependentAssembly>

    1. DID NOT WORK:使用newVersion的范围(是的,MSDN doesn't say you can do this,但我尝试了;请注意使用oldVersion 支持但不帮助我。)

    2. 无法工作:告诉用户他们必须安装一个特定版本的Oracle客户端。 (从技术上讲,它确实有效,但IT部门和管理人员讨厌这个想法。)

    3. 工作:创建了一个外部配置工具,用于在应用程序域中搜索Oracle.DataAccess程序集(使用System.AppDomain.CurrentDomain.GetAssemblies()),按体系结构过滤(32位或64位),按版本排序,获取最高支持版本,并使用检测到的最高版本手动编写.exe.config文件,但这有点笨拙且可能容易出错,并且可能会出现升级问题。

    4. 问题

      有更好的方法吗?就像自动方式一样,我不需要自己编码?

      解决方案1和4工作,但1是让用户做的烦人的事情,4只是看起来很奇怪(这就是我目前正在发货的)。

      如果有一种方法可以说明这个程序集(ODP.NET)适用于任何版本的范围,似乎会很好,但是我没有看到为{{1}指定可接受范围的方法(你可以添加多个newVersion节点,但是当我尝试为我没有安装的版本添加条目时,这会在运行时被删除。)

2 个答案:

答案 0 :(得分:0)

最简单的选择可能是使用Oracle Instant Client并在应用程序安装过程中安装所需的任何客户端版本。这样,您可以将您编译的任何版本的ODP.Net与您的应用程序一起发送,无论其他Oracle软件安装的是什么。

答案 1 :(得分:-1)

一种解决方案是使用 ODP.NET托管驱动程序。您可以从此处下载:64-bit Oracle Data Access Components (ODAC) Downloads

然后,您必须只为您的应用程序提供一个dll Oracle.ManagedDataAccess.dll,并且您不依赖于任何Oracle客户端安装。

另一个解决方案是设置.exe.config这样的内容:

<dependentAssembly><assemblyIdentity name="Oracle.DataAccess" /></dependentAssembly>

即。没有任何版本,processorArchitecture或publicKeyToken信息。 应用程序将加载正确的Oracle.DataAccess.dll,具体取决于所选的体系结构和目标.NET框架。但是,它只解决了“32位与64位”问题以及Oracle客户端版本(9i,10g,11g,12c)。选定的目标.NET框架仍然必须与ODP.NET(1.x,2.x,4.x)

的版本相匹配