2014-12-02 29 views
1

如果構建版本和修訂版本號發生更改,CLR如何處理程序集綁定和從GAC加載的問題。大會有四個部分[專業]。[小]。[建築]。[修訂]。我知道如果Major和Minor發生更改,您需要發佈者策略才能從GAC中找到較新版本的程序集。如果生成版本或修訂版本號更改會怎樣?在我的下面的情況下,它不適用於構建和修訂更新。定位GAC程序集,如果只有構建版本或修訂版本號發生更改

在我的應用程序中,我的程序集信息爲[1.0。*],所以TFS在每個版本上以增量方式構建[[1.0.5414.23455]]數字的程序集。 TFS每天都會生成項目並生成具有增量構建和修訂版本號的組件。這是預期的行爲,因爲我在AssemblyInfo文件中指出了通配符[1.0。*]。

現在,我有客戶端應用程序是針對我的應用程序版本[1.0.5414.23455]構建的。我正在使用安裝程序將我的應用程序部署到GAC。現在,如果GAC具有應用程序集版本[1.0.5414.23455],但如果我在GAC中安裝了更新版本(技術上沒有任何更改,只是新的每晚構建版本)[1.0.5414.23456],則客戶端應用程序工作正常,客戶端應用程序將不會加載此新版本。

我指的是一些Microsoft博客/文檔,發現只要主要和次要數字相同,客戶端應用程序應該能夠從GAC加載程序集。從GAC中查找組件時,構建和修訂號碼不是強制性檢查。

構建版本號和版本號變更對從GAC定位彙編沒有任何影響,是否正確?

在此先感謝。

+0

你是如何強大的命名你的程序集? – user1620220 2014-12-02 16:56:54

+0

使用強名稱密鑰文件和通過Visual Studio屬性分配的標準方式。 – 2014-12-02 17:03:14

+1

所有4個數字都是相關的並且被檢查。因此,只需更改構建版本或修訂版就足以迫使您使用bindingRedirect或發佈者策略。您絕對不想在GAC中存儲具有自動生成版本號的程序集,這樣會造成太多污染和頭痛。只能在用戶的機器上使用GAC。看看「語義版本控制」。 – 2014-12-02 17:17:33

回答

0

爲了避免一些複雜編譯與部署在GAC,你可以在你的web.config使用bindingRedirect或類似的app.config更新組件的版本:

<runtime> 
    <generatePublisherEvidence enabled="false" /> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="MyComponent.Web.UI" publicKeyToken="121fae78165ba3d4" /> 
     <bindingRedirect oldVersion="1.0.5414.23455" newVersion="1.0.5414.23455" /> 
     </dependentAssembly> ... 

請注意,屬性oldVersion代表還代表範圍的版本要替換oldVersion="1.0.0.35-1.0.1016.35"和屬性新版本表示替換版本newVersion="2.0.1205.35"

根據您的問題,爲什麼我們需要bindingRedirect

程序集的依賴關係是程序集元數據的一部分,您可以使用稱爲gacutil(它是.NET SDK Tools的工具部分)或我下面使用的東西來看到這一點。 NET反射器。由於引用及其版本是程序集的一部分,因此需要編譯或更改app.config引用來引用新版本。

enter image description here

+0

是的,我知道這件事,我在我的問題中提到了abt發佈者策略。我特別想知道,無論是生成版本號還是版本號更改都會導致GAC程序集加載失敗。 – 2014-12-02 17:02:24

+0

您很可能沒有針對新版本編譯所有組件,並且可能會產生差異 – Dalorzo 2014-12-02 17:03:18

+0

如果技術上沒有任何更改,爲什麼需要編譯?由於TFS每晚構建,Assembly只是獲得了新版本和修訂版本號。這就是全部,而不是單行代碼更改。爲什麼應該要求客戶重新編譯他們的應用程序,不要做任何小改動。 – 2014-12-02 17:05:08

相關問題