【问题标题】:What is the best practice for supporting different versions of ODP.NET (Oracle.DataAccess.dll) in an off-the-shelf product?在现成产品中支持不同版本的 ODP.NET (Oracle.DataAccess.dll) 的最佳实践是什么?
【发布时间】:2015-08-05 22:29:29
【问题描述】:

问题

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

我尝试过的事情

  1. 工作:用户在.exe.config 文件中手动添加/编辑dependentAssembly 部分:

<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. 不起作用:使用newVersion 的范围(是的,MSDN doesn't say you can do this,但我试过了;请注意,oldVersion 的使用范围是支持但对我没有帮助)。

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

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

问题

有没有更好的方法来做到这一点?就像我不必自己编码的自动方式?

解决方案 1 和 4 有效,但 1 对用户来说是一件烦人的事情,而 4 看起来很奇怪(虽然这是我目前正在发布的)。

如果有办法声明这个程序集 (ODP.NET) 可以在任何版本范围内正常工作,那似乎会很好,但我看不到为newVersion 指定可接受范围的方法(您可以添加多个 dependentAssembly 节点,但是当我尝试为未安装的版本添加条目时,这会在运行时出错。)

【问题讨论】:

    标签: .net oracle configuration


    【解决方案1】:

    最简单的选择可能是使用Oracle Instant Client 并安装您想要的任何版本的客户端作为应用程序安装的一部分。这样一来,您就可以将编译时所针对的任何版本的 ODP.Net 与您的应用程序一起发布,而不管碰巧安装了哪些其他 Oracle 软件。

    【讨论】:

    • 一般来说,当您在一台机器上安装多个 Oracle 客户端时,我有 非常 糟糕的体验,我真的不推荐这样做。唯一的例外是在一台机器上同时安装 32 位和 64 位 Oracle 客户端,但是此过程需要在 PC 上进行一些手动更改。
    • @Wernfried - 您是在谈论安装多个版本的完整 Oracle 客户端吗?或者有多个应用程序使用他们自己的即时客户端版本? Instant Client 的全部意义在于允许应用程序在安装时安装它们需要的任何支持库,所以我不确定您遇到了什么问题。如果您依赖某些不兼容多宿主的组件,则完整客户端的多个版本确实会出现问题。
    • 我从来没有自己安装过 Instant Client。我认为您总是必须“玩”您的 PATH 变量才能使其正常工作 - 除非您将所有 Oracle 文件安装到您的应用程序目录中。
    • 我有多个版本和架构的 Oracle 客户端安装得很好,但是在这种情况下你需要管理到 Oracle 主页的路径。感谢您的建议,我下周回到办公室时会尝试这些!
    【解决方案2】:

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

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

    另一种解决方案是将您的.exe.config 设置为:

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

    即没有任何版本、处理器架构或 publicKeyToken 信息。 应用程序将根据所选架构和目标 .NET 框架加载正确的 Oracle.DataAccess.dll。但是,它仅解决了“32 位与 64 位”问题以及 Oracle 客户端(9i、10g、11g、12c)的发布。选定的目标 .NET 框架仍然必须匹配 ODP.NET 的版本(1.x、2.x、4.x)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 2011-11-10
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多