【问题标题】:Oracle.Dataaccess is in the GAC. Can I control the version I use?Oracle.Dataaccess 在 GAC 中。我可以控制我使用的版本吗?
【发布时间】:2012-02-21 08:30:09
【问题描述】:

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

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

从 ODP.NET 10.1.0.3 开始,Oracle 安装程序将注册 全局程序集缓存 (GAC) 中的以下发布者策略 DLL 将 9.2、10.1 和 10.2 ODP.NET 应用程序重定向到使用最后一个 已安装的 ODP.NET 版本:Policy.9.2.Oracle.DataAccess.dll 和 Policy.10.1.Oracle.DataAccess.dll

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

Oracle 是否有可能将 Oracle.DataAccess 升级到可能与随我的应用程序一起部署的 Oracle Instant Client 不兼容的新版本?从而在将来破坏我的应用程序。

这是个问题吗?我可以避免吗?在机器上不安装/删除任何东西的情况下,我是否可以覆盖 Oracle Publishers 策略以保证我使用通过我的应用程序 xcopy 部署的 Oracle.Dataaccess 版本?

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

【问题讨论】:

标签: .net oracle odp.net


【解决方案1】:

可以强制您的应用程序始终使用您想要的 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 环境变量完成的,但现在可以通过 config 定义:

    <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,以确保不会发生任何异常情况。

【讨论】:

    【解决方案2】:

    您可以在 app.config 文件中使用 assemblyBinding。

    这里有几个链接说明如何使用它。

    http://blogs.msdn.com/b/suzcook/archive/2004/05/14/132022.aspx http://stackoverflow.com/questions/1165190/is-there-a-way-to-force-using-a-dll-version

    【讨论】:

    • 据我所知,codeproject.com/Articles/12215/… 发布者策略覆盖了 app.config 中的程序集绑定。但是我可以使用 ,但这会对其他 DLL 产生影响吗?
    • 我可以申请。对于 assemblyBinding/dependentAssembly/ 中的单个程序集,publisherPolicy apply="no"
    • 使用 assemblyBinding 技巧只会保证您将指向正确版本的 Oracle.DataAccess。它不能保证您将指向正确版本的 ODP 依赖项(即时客户端、非托管 dll)。后者需要通过 oracle.dataaccess.client/DLLPath 配置文件进行配置。
    【解决方案3】:

    我将 Robert & Arve 的回答与我之前的努力结合起来:

    • 在项目的 Oracle.DataAccess 属性中将 SpecificVersion 设置为 True,并确保声明的版本与您要使用的版本匹配。如果没有,手动编辑csproj文件更改版本号,删除bin文件夹中复制的dll。 Visual Studio 会自动在 GAC 中查找版本号。如果 GAC 中尚不存在该版本,则应先安装 ODAC。

    • 确保在 Path 中找到的第一个 OraOps11w.dll 是您要使用的版本。如果不是,请更改 Windows 的系统路径,以便您要使用的 Oracle 客户端的目录是第一个路径条目。

    C:\app\user\product\11.1.0\client_1;C:\app\user\product\11.1.0\client_1\bin;其他路径

    • 在 Web.config 或 App.config 文件中禁用发布者策略
    ... ... 汇编绑定> 运行时> 配置>

    在 Notepad++ 或您喜欢的文本编辑器中编辑 csproj / web.config 文件时关闭 Visual Studio 可能会更好。但通常 Visual Studio 会询问您是否要重新加载项目。

    【讨论】:

      【解决方案4】:

      为了让 Oracle 11 和 12 能够很好地协同工作,我必须对我的 app.config 文件进行以下更改。这是我所做的唯一更改,我没有对我的项目文件进行任何更改,例如将特定版本从 false 更改为 true。

      <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
      
        <!--Add This Section to run Oracle 11 and !2 side By Side  -->
        <runtime>
          <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
              <assemblyIdentity name="Oracle.DataAccess"  culture="neutral" publicKeyToken="89b483f429c47342"/>
              <codeBase version="4.112.4.0" href="FILE://Oracle.DataAccess.dll"/>
              <publisherPolicy apply="no"/>
            </dependentAssembly>
          </assemblyBinding>
      
          <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"/>
              <publisherPolicy apply="no"/>
            </dependentAssembly>
          </assemblyBinding>
        </runtime>
        <!--Add the above Section to run Oracle 11 and 12 side By Side  -->
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-09
        • 1970-01-01
        • 1970-01-01
        • 2019-10-27
        • 1970-01-01
        • 2019-02-07
        • 2022-01-02
        • 1970-01-01
        相关资源
        最近更新 更多