繁体   English   中英

Oracle.Dataaccess在GAC中。我可以控制我使用的版本吗?

[英]Oracle.Dataaccess is in the GAC. Can I control the version I use?

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

来自Oracle ODP.NET FAQ:

从ODP.NET 10.1.0.3开始,Oracle安装程序将在全局程序集缓存(GAC)中注册以下发布者策略DLL,该程序重定向9.2,10.1和10.2 ODP.NET应用程序以使用上次安装的ODP.NET版本:策略.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(Instant)客户端。

可以强制您的应用程序始终使用您想要的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 env变量完成的,但现在可以通过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,以确保永远不会有任何时髦。

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

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

    <Reference Include =“Oracle.DataAccess,Version = 2.111.7.20,Culture = neutral,PublicKeyToken = 89b483f429c47342,processorArchitecture = x86”/>

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

C:\\应用\\用户\\产品\\ 11.1.0 \\的Client_1; C:\\应用\\用户\\产品\\ 11.1.0 \\的Client_1 \\ BIN; 其他路径

  • 禁用发布者策略应用于Web.config或App.config文件
<configuration>
...
     <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
...
            <dependentAssembly>
            <assemblyIdentity name="Oracle.DataAccess"
                                    publicKeyToken="89b483f429c47342"
                                    culture="neutral" />
            <publisherPolicy apply="no"/>
            </dependentAssembly>
        </assemblyBinding>
     </runtime>
  </configuration>

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

您可以在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-using -a-DLL版本

为了让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  -->

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM