前幾天回答網友QOO提問,又多學會「AssemblyFileVersion不支援自動跳號,未設定時會引用AssemblyVersion」新知識,知道這些就夠了嗎?並沒有,今天又踩一雷,再獲冷知識一枚。
同事升級專案的Newtonsoft.Json.dll到7.0.1版,NuGet顯示版本為7.0.1版:
由於NuGet安裝時沒自動加入bindingRedirect設定,手動加入時為了找出newVersion的正確版號,參考了檔案資訊:
檔案版本是AssemblyFileVersion,那麼產品版本就是AssemblyVersion囉?加上NuGet Package說現在的版本是7.0.1,所以開開心心填上newVersion="7.0.1.18622":
<dependentAssembly>
<assemblyIdentityname="Newtonsoft.Json"publicKeyToken="30AD4FE6B2A6AEED"culture="neutral"/>
<bindingRedirectoldVersion="0.0.0.0-6.0.0.0"newVersion="7.0.1.18622"/>
</dependentAssembly>
不料,程式抱怨找不到Newtonsoft.Json 4.5.0版,顯示繫結重新導向沒生效。爬文發現Json.NET 7.0.1相關導向範例都是寫newVersion="7.0.0.0",乖乖改成7.0.0.0後,系統正常運作。
問題來了,7.0.1、7.0.1.18622、7.0.0.0,這麼多版號搞得我好亂,將來遇到同樣狀況,到底要以哪一個為準?
做完功課,老狗又學會新把戲,除了AssemblyVersion、AssemblyFileVersion,還有所謂AssemblyInformationVersion!
AssemblyVersion
為必要屬性,是參照組件的重要依據,一旦版號改變,參照該組件的程式必須更新(重新編譯或設定組件繫結重新導向)。AssemblyFileVersion
主要用於部署管理,可以每次部署時遞增以便區隔,是安裝程式常用的版本依據,實務上可由MSBuild產生(但要自己寫邏輯)。如果想不驚動相關程式悄悄換版,可以維持同一個AssemblyVersion,只編譯成AssemblyFileVersion不同的DLL檔。若未指定AssemblyFileVersion,系統會用AssemblyVersion版號當作AssemblyFileVersion。 AssemblyFileVersion可以用檔案總管檢視(即前面附圖所示的「檔案版本」)。
注意:用檔案總管是看不到AssemblyVersion的!最簡便的查詢方式是透過Visual Studio:AssemblyInformationalVersion
產品版本。它不像AssemblyVersion跟AssemblyFileVersion限定格式為四節數字,允許寫成"0.9 Beta Version"、"1.0 Release Candidate"之類的可讀文字,但過去曾出現過相關工具處理非數字AssemblyInformationalVersion的相容問題(例:Issue1、Issue2)。當組件未指定AssemblyInformationalVersion時,系統會使用AssemblyVersion代替。
參考來源:stackoverflow
經過這次教訓,下回遇到要寫bindingRedirect時,就知道要乖乖查Visual Studio的組件屬性視窗,不會再用檔案總管亂查了。