2012-02-21 35 views
4

我有一个使用Oracle.DataAccess(ODP.NET)的XCOPY可部署.NET应用程序。我们还将Oracle Instant客户端部署在应用程序目录中。一切工作正常,但我担心..Oracle.Dataaccess位于GAC中。我可以控制我使用的版本吗?

从Oracle ODP.NET FAQ:

与ODP.NET 10.1.0.3开始,Oracle安装程序将注册 在全局下发行政策的DLL程序集缓存(GAC) 表示重定向9.2,10.1和10.2使用ODP.NET应用程序的最后一个安装版本 ODP.NET:Policy.9.2.Oracle.DataAccess.dll和 策略10.1.1 .Oracle.DataAccess.dll

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

Oracle可能会将Oracle.DataAccess升级到可能与我的应用程序中部署的Oracle Instant Client不兼容的新版本?从而打破了我的未来应用。

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

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

+0

甲骨文已经发布了一个完全托管提供商没有这些问题。 http://www.oracle.com/technetwork/topics/dotnet/index-085163.html – Arve 2014-02-25 04:31:46

+1

另外,Oracle安装程序的最新版本现在有一个选项,不要将任何内容放入GAC或机器配置中。 – 2015-06-28 18:51:29

回答

1

您可以在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

+0

据我可以看到从http://www.codeproject.com/Articles/12215/Assemblies-locating-binding-and-部署发布者策略覆盖app.config中的程序集绑定。但是我可以使用,但会对其他DLL有影响吗? – Arve 2012-02-21 09:14:19

+0

我可以申请。对于assemblyBinding/dependentAssembly/ – Arve 2012-02-21 09:49:20

+0

中的单个程序集,publisherPolicy apply =“no”使用assemblyBinding技巧只会保证您将指向Oracle.DataAccess的正确版本。它不能保证你将指向正确版本的ODP依赖项(即时客户端,非托管dll)。后者需要通过oracle.dataaccess.client/DLLPath配置来配置。 – 2012-02-22 10:51:19

3

这有可能迫使应用程序始终使用你想要的ODP和ODAC版本。

  1. 力ODP版本:使用张贴罗伯特assemblyBinding招,用你Oracle.DataAccess的版本,而不是GAC'd版本给力。例如: -

    <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'd出版商策略DLL,以确保没有任何从未质朴的继续。

1

我结合罗伯特&艾云与我以前的努力回答:

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

    <参考包括= “Oracle.DataAccess,版本= 2.111.7.20,文化=中性公钥= 89b483f429c47342,ProcessorArchitecture用于= 86”/ >

  • 确保第一OraOps11w.dll在Path被发现您要使用的版本。如果没有,请更改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> 

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

0

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

相关问题