簡體   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