.net - Oracle.Dataaccess 位于 GAC 中。我可以控制我使用的版本吗?

标签 .net oracle odp.net

我有一个使用 Oracle.DataAccess (ODP.NET) 的 XCOPY 可部署 .NET 应用程序。我们还在应用程序目录中部署 Oracle Instant 客户端。一切正常,但我担心..

来自 Oracle ODP.NET 常见问题解答:

Beginning with ODP.NET 10.1.0.3, the Oracle installer will register the following publisher policy DLLs in the Global Assembly Cache (GAC) that redirect 9.2, 10.1 and 10.2 ODP.NET applications to use the last installed version of ODP.NET: Policy.9.2.Oracle.DataAccess.dll and Policy.10.1.Oracle.DataAccess.dll

这意味着在安装了 Oracle ODP.NET 的计算机上,将使用 GAC 中的版本,而不是我使用应用程序部署的版本。由于发布者政策,该版本可能比我使用应用程序部署的版本更新。 Oracle.DataAccess 需要 Oracle(即时)客户端也与我的应用程序一起部署。这些是 native Win32 DLL,因此将使用我的版本。

Oracle 是否有可能将 Oracle.DataAccess 升级到可能与我的应用程序中部署的 Oracle Instant Client 不兼容的新版本?从而破坏了我 future 的申请。

这是一个问题吗?我可以避免吗?无需在计算机上安装/删除任何内容,我是否可以覆盖 Oracle Publishers 策略以保证我使用通过应用程序 xcopy 部署的 Oracle.Dataaccess 版本?

对于给定版本的 ODP.NET,它支持哪些 Oracle 客户端版本?新版本的 Oracle.DataAccess 是否支持旧版本的 Oracle(即时)客户端。

最佳答案

可以强制您的应用程序始终使用您想要的 ODP 和 ODAC 版本。

  1. 强制 ODP 版本:使用 Robert 发布的 assemblyBinding 技巧,强制使用您的 Oracle.DataAccess 版本而不是 GAC 版本。例如:

    <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Oracle.DataAccess"  culture="neutral" publicKeyToken="89b483f429c47342"/>
            <codeBase version="4.112.3.0" href="FILE://Oracle.DataAccess.dll"/>
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    
  2. 强制 ODAC 版本:ODP DLL 依赖于一组共享的 Oracle 组件(即时客户端、非托管 OCI dll)。获取这些的一种方法是通过 ODAC 包。您可以定义(基于每个应用程序)要使用的 ODAC 包。传统上这是通过 PATH 环境变量完成的,但现在可以通过配置来定义:

    <configuration>
      <configSections>
        <section name="oracle.dataaccess.client" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </configSections>
    
      <oracle.dataaccess.client>
        <settings>
          <add name="DllPath" value="C:\somefolder\ODAC_11.2.0.3.0_32bit\bin" />
        </settings>
      </oracle.dataaccess.client>
    </configuration>
    
  3. 作为额外的预防措施,您可以随时删除 GAC 的发布商策略 DLL,以确保永远不会发生任何奇怪的事情。

关于.net - Oracle.Dataaccess 位于 GAC 中。我可以控制我使用的版本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9374323/

相关文章:

asp.net - 如何在 RegularExpressionValidator ErrorMessage 字段中插入换行符?

oracle - 带有 Entity Framework 的 Oracle Unmanaged Provider 的 Nuget 包

oracle - SSIS 可以使用 Oracle ManagedDataAccess 客户端吗?

c# - 如何从C#中的存储过程中获取所需的参数

.net - Sharepoint,IIS,.net和多线程

c# - Visual Studio Solution通过VS SDK获取Build后如何获取回调?

C# ODP.NET 加载文件或程序集

java - 将我们的应用程序从Oracle JRE迁移到openJDK JRE是否有任何影响?

oracle - ORA-00947 : Not Enough Values

python - Oracle/Python 转换为字符串 -> HEX(对于 RAW 列) -> varchar2