我期待讓我的程序更具動態性。我希望它能夠使用相同的程序來支持Oracle 10g和Oracle 11g數據庫。如果我使用一個版本的.DLL參考編譯程序,那麼另一個版本會失敗。有沒有辦法使用已經安裝在計算機上的Oracle.DataAccess.DLL,而不是在我的安裝程序中提供DLL?在PC上使用Oracle.DataAccess.DLL,不提供它
在此先感謝。
我期待讓我的程序更具動態性。我希望它能夠使用相同的程序來支持Oracle 10g和Oracle 11g數據庫。如果我使用一個版本的.DLL參考編譯程序,那麼另一個版本會失敗。有沒有辦法使用已經安裝在計算機上的Oracle.DataAccess.DLL,而不是在我的安裝程序中提供DLL?在PC上使用Oracle.DataAccess.DLL,不提供它
在此先感謝。
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建議的:
再提一些建議:
如果您在Visual Studio中選擇參考並轉到屬性窗口(默認爲F4),您將看到標有「特定版本」的選項。如果將其設置爲false,則該項目將接受不同版本的DLL。
現在這並不一定意味着該項目會在找到這個DLL的版本。如果它不在.exe附近(即在文件夾或子文件夾中)或GAC中,那麼您必須自行完成一些工作才能加載它。
何時將其添加到GAC?那是我應該做的事,還是應該在安裝Oracle時發生? – 2010-12-20 18:32:23
我不確定Oracle安裝程序是否將其放入GAC中,但我想有些情況下它不會將它放入GAC中。我知道你可以做ODAC的「XCOPY」風格部署,在這種情況下,它不在GAC中。你可能更適合用應用程序部署最新版本;即使使用v11 DLL,使用Oracle 10服務器也不會有任何問題。 – CodingGorilla 2010-12-20 18:41:34
見@MattRodatus'關於使用,如果你需要讓你的應用程序支持的Oracle.DataAccess
多個版本,可能是要部署到機器上的綁定重定向出色答卷。
但是,您應該能夠使用Oracle客戶機安裝的任一版本訪問10g或11g數據庫。
請參閱@ the.jxc的答案Oracle: Does a 10g oracle client work with an 11g server?,以獲取有關哪些客戶端支持哪些數據庫的完整摘要。
對於一個很好的答案+1,尤其是綁定重定向。但對於原始提問者,只要您可以提供適當的連接信息(TNSNAMES別名等),就應該能夠使用10g或11g客戶端來訪問10g或11g數據庫。 – 2010-12-20 19:17:02
@BQ這是一個好點!我引用了你並在上面添加了你的答案。 – 2010-12-20 19:25:38