2010-12-20 54 views
3

我期待讓我的程序更具動態性。我希望它能夠使用相同的程序來支持Oracle 10g和Oracle 11g數據庫。如果我使用一個版本的.DLL參考編譯程序,那麼另一個版本會失敗。有沒有辦法使用已經安裝在計算機上的Oracle.DataAccess.DLL,而不是在我的安裝程序中提供DLL?在PC上使用Oracle.DataAccess.DLL,不提供它

在此先感謝。

回答

6

SpecificVersion是僅在構建期間應用的屬性。它旨在幫助如果在構建環境中有多個版本的程序集;當SpecificVersion爲true時,它將確保您構建並引用所需的版本。但是,構建目標程序集後,其引用將包含引用程序集的強名稱和版本號。因此,如果SpecificVersion爲false,那麼它將被設置爲引用當時構建環境中引用的可用版本。

「請注意,特定版本屬性只是構建時指令,它對引用程序集的運行時版本解析沒有影響」(http://www.code-magazine.com/article.aspx ?quickid = 0507041 & page = 3)。

但是,您可以使用版本重定向來顯式註釋您接受任何版本。 oldVersion字段指定任何內容(您構建的版本),而newVersion屬性將指定您希望在運行時實際鏈接哪一個。

<dependentAssembly> 
    <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/> 
    <bindingRedirect oldVersion="1.0.0.0-2.111.9999.9999" newVersion="2.102.2.20"/> 
    </dependentAssembly> 

(參見http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx。)

即dependentAssembly節點可以適用於不同的上下文。一個可能的上下文將在web.config或app.config中作爲配置/運行時/ assemblyBinding節點的子節點。

要回答您支持Oracle 10g和11g的特定情況?有兩種選擇,前者是用戶@BQ建議的:

  1. 只部署ODP.NET的一個版本。您應該能夠從任何版本的ODP.NET(10g或11g)與兩個版本的數據庫服務器(10g和11g)進行通信。請參閱下面的@ BQ的答案。
  2. 如果您確實需要能夠鏈接到兩個不同的彙編版本,則需要有兩種不同的版本重定向配置。換句話說,您需要兩個app.config文件,其中一個文件包含10g ODP.NET版本的重定向版本,另一個版本包含11g ODP.NET版本。

再提一些建議:

  1. 確保你從GAC刪除任何Oracle提供的發行政策。這些優先於web/app中的。config
  2. 默認情況下,綁定失敗被緩存,所以如果ODP.NET程序集碰巧與版本重定向綁定失敗,則需要重新啓動IIS以清除緩存的失敗。
+0

對於一個很好的答案+1,尤其是綁定重定向。但對於原始提問者,只要您可以提供適當的連接信息(TNSNAMES別名等),就應該能夠使用10g或11g客戶端來訪問10g或11g數據庫。 – 2010-12-20 19:17:02

+0

@BQ這是一個好點!我引用了你並在上面添加了你的答案。 – 2010-12-20 19:25:38

2

如果您在Visual Studio中選擇參考並轉到屬性窗口(默認爲F4),您將看到標有「特定版本」的選項。如果將其設置爲false,則該項目將接受不同版本的DLL。

現在這並不一定意味着該項目會在找到這個DLL的版本。如果它不在.exe附近(即在文件夾或子文件夾中)或GAC中,那麼您必須自行完成一些工作才能加載它。

+0

何時將其添加到GAC?那是我應該做的事,還是應該在安裝Oracle時發生? – 2010-12-20 18:32:23

+0

我不確定Oracle安裝程序是否將其放入GAC中,但我想有些情況下它不會將它放入GAC中。我知道你可以做ODAC的「XCOPY」風格部署,在這種情況下,它不在GAC中。你可能更適合用應用程序部署最新版本;即使使用v11 DLL,使用Oracle 10服務器也不會有任何問題。 – CodingGorilla 2010-12-20 18:41:34

1

見@MattRodatus'關於使用,如果你需要讓你的應用程序支持的Oracle.DataAccess多個版本,可能是要部署到機器上的綁定重定向出色答卷。

但是,您應該能夠使用Oracle客戶機安裝的任一版本訪問10g或11g數據庫。

請參閱@ the.jxc的答案Oracle: Does a 10g oracle client work with an 11g server?,以獲取有關哪些客戶端支持哪些數據庫的完整摘要。

相關問題