簡體   English   中英

在.NET中引用正確版本的Oracle.DataAccess

[英]Referencing the correct version of Oracle.DataAccess in .NET

我正在嘗試從Visual Studio 2013上編寫的.NET 4.0項目引用Oracle.DataAccess。我的計算機的GAC安裝了兩個版本的Oracle.DataAccess:4.112.1.2(由Oracle 11gr2版本提供)和4.121.2.0(已提供)由Oracle版本12c)。

我想引用4.112.1.2版本(我的項目必須在%ORACLE_HOME%設置為11gr2的安裝位置的情況下運行,並且在這種情況下,引用4.121.2.0會導致運行時失敗)。 我的計算機上沒有管理員帳戶,因此不能僅卸載12c dll。

我嘗試了以下步驟來強制可執行文件在運行時加載4.112.1.2 dll:

  1. 使用強名稱引用我的.csproj文件中的dll:

    <Reference Include="Oracle.DataAccess, Version=4.112.1.2, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86"/>

  2. 更新我的App.Config文件以強制重定向:

<dependentAssembly>
    <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" culture="neutral"/>
    <codeBase version="4.112.1.2" href="C:\Path\To\11gr2\Oracle.DataAccess.dll"/>
    <bindingRedirect oldVersion="4.121.2.0" newVersion="4.112.1.2"/>
    <publisherPolicy apply="no"/>
</dependentAssembly>

  1. 我修改了PATH,使11gr2 Client的bin目錄首先位於路徑中:

    set PATH="C:\\path\\to\\11gr2\\BIN;%PATH%"

但是,無論我做什么,可執行文件都會在運行時從GAC加載4.121.2.0 dll。 這是我附加調試器時的內容:

'MyApp.exe' (Managed (4.0.30319)): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\Oracle.DataAccess\v4.0_4.121.2.0_89b483f429c47342\Oracle.DataAccess.dll'

我已經閱讀了有關程序集綁定的Microsoft文檔( 此處此處 )。 我還閱讀了似乎與我的問題有關的StackOverflow答案( 此處此處 ),但沒有任何效果。

如何強制.NET在運行時從GAC加載正確的DLL版本?

編輯:

Wernfried的回答使我認為我可能以錯誤的方式看待這個問題。 這就是正在發生的事情:

我使用ORACLE_HOME = C:\\ ORACLE \\ ora12c運行我的應用程序,一切正常(數據庫訪問成功,應用程序運行良好)

我使用ORACLE_HOME = C:\\ ORACLE \\ ora11gr2(必需的版本)運行我的應用程序。 應用程序崩潰,但以下異常:

Oracle.DataAccess.Client.OracleException ORA-12557: TNS:protocol adapter not loadable.
<stacktrace follows>

在堆棧跟蹤之后,我發現在應用程序創建數據庫連接的調用中發生了錯誤。 我檢查了我的連接字符串並驗證了它的正確性(並且它與12c之后的連接字符串相同)。 然后,我發現我正在調用的Oracle.DataAccess dll版本是12c,而不是11gr2。 由此得出的結論是,我需要修改調用以加載dll以“強制”使用11gr2。 如果我吠錯了樹,請告訴我!

據我所知,ODP.NET提供程序4.112.1.2僅適用於Oracle Client 11.2。 ODP.NET提供者4.121.2.0需要Oracle 12.1客戶端。

您的計算機上是否同時安裝了兩個版本的Oracle Client?

為了使用一個或另一個,您還必須相應地設置PATH環境變量。 PATH必須包含您要在應用程序中使用的Oracle客戶端二進制文件的文件夾。

注意,您的應用程序,Oracle客戶端和ODP.NET提供程序的體系結構(即32位和64位)必須完全相同。

但是,為什么您要強制使用特定版本的ODP.NET? 我建議使用此參考

<Reference Include="Oracle.DataAccess">
  <SpecificVersion>False</SpecificVersion>
  <Private>False</Private>
</Reference>

那么無論您的計算機(或客戶的計算機)上安裝了什么版本,您的應用程序都會自動加載正確版本的ODP.NET。

無論如何,如果您想運行測試並強制使用特定版本的ODP.NET,則可以使用動態綁定。 為此,您的代碼如下所示:

using (OracleConnection con = new OracleConnection(connString))
{
    con.Open();
    ...
}

必須像這樣重寫:

var DLL = default(Assembly);
DLL = Assembly.LoadFrom(@"C:\Path\To\11gr2\Oracle.DataAccess.dll");
// resp for GAC:
// DLL = Assembly.Load(String.Format("Oracle.DataAccess, Version={0}.{1}.*.*, Culture=neutral, PublicKeyToken=89b483f429c47342", 1, 112));    
var type = DLL.GetType("Oracle.DataAccess.Client.OracleConnection", true, false);
using ( dynamic con = Activator.CreateInstance(type, connString) ) {
    con.Open();
    ...
 }

我相信我已經解決了。

對我來說起作用的是取消設置ORACLE_HOME環境變量,並將C:\\ Path \\ to \\ 11gr2 \\ bin放在路徑的開頭,如下所示:

set PATH=C:\Path\to\11gr2\bin;%PATH%

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM