一直以來都對.NET項目中的幾個版本号(AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersion)以及版本号中的Revision和Build有疑問,今兒抽了點時間看了幾篇文章,整理一下與大家一起分享下。
【題外話】
【文章索引】
- AssemblyVersion與AssemblyFileVersion
- AssemblyInformationalVersion
- Build與Revision
【一、AssemblyVersion與AssemblyFileVersion】
衆所周知,.NET項目屬性中可以設定兩種版本号,一種叫程式集版本(AssemblyVersion),一種叫檔案版本(AssemblyFileVersion),在微軟的知識庫(見相關連結1)中有一篇文章提到了這兩個版本号的差別,我大緻翻譯一下。
Assembly Version:這是在.NET Framework中編譯和運作時使用的版本号,使用該版本号定位和加載指定程式集。當你在你的項目中引用了指定的程式集,其版本号将會嵌入到你的項目中。在運作時,CLR通過該版本号加載指定程式集。注意,僅當程式集使用強命名時,才會使用程式集名稱、公鑰、語言資訊以及該版本号查找指定程式集,否則隻會根據檔案名進行查找。
Assembly File Version:這是在檔案系統中給檔案的版本号,會在Windows資料總管中顯示。但是,在.NET Framework引用類庫時從來不會用到這個版本。
我們可以建立兩個項目試試,對于引用沒有使用強命名程式集的項目,不論修改Assembly Version還是修改Assembly File Version,都不會出現任何錯誤;而對于引用了使用強命名程式集的項目,一旦引用的程式集的Assembly Version修改,則會出現如下圖所示的錯誤,導緻程式無法運作,而修改Assembly File Version則不會出現任何錯誤。

是以, 在知識庫的文章中,也給出了建議的方法:
如果您在為一個應用程式建構一個很多開發者都在引用的基礎程式集,并且這個程式集更新速度非常快,比如一天一次之類的,而且這個程式集還是強命名的,那麼您每次更新完程式集後所有的開發者都需要重新更新引用。這樣做非常繁瑣并且還容易引用出錯。是以對于這種情況更好的辦法是,固定好Assembly Version,而隻修改Assembly File Version,即使用後者來表示最新的版本号。在這種情況下,開發者們不需要更新引用,而僅僅隻需要把新的程式集檔案覆寫到引用目錄下就可以了。在中間或最後釋出的版本中,為了更有意義,可以更新Assembly Version,使Assembly File Version與Assembly Version近似。
在相關連結2的文章中,作者也給出了修改Assembly Version的情景:
1、當程式集為了維護而更新時,為了向後相容,一定不要修改Assembly Version。
2、在程式集有重大修改時,一定要修改Assembly Version。
【二、AssemblyInformationalVersion】
除了上述兩種版本号外,其實還有一種版本号,可以自己在AssemblyInfo.cs檔案中添加,那就是AssemblyInformationalVersion,從名字就可以看出來,這個版本号更大的意義是版本的資訊,而不僅僅是數字的描述,比如可以設定為如下的版本資訊之類的。
[assembly: AssemblyInformationalVersion("1.0 RC")]
AssemblyInformationalVersion與AssemblyFileVersion一樣,都是可以在Windows資料總管中顯示的,換言之,其都是存儲在Win32版本資源中的。是以如果不設定AssemblyInformationalVersion的話,預設在檔案屬性裡顯示的“産品版本”就是AssemblyFileVersion,而設定了AssemblyInformationalVersion以後,才會顯示AssemblyInformationalVersion設定的内容。如下圖,左邊為未設定AssemblyInformationalVersion,右邊為設定了AssemblyInformationalVersion。
【三、Build與Revision】
對于.NET的項目,版本号是由Major.Minor.Build.Revision構成的,通常被稱作主要版本、次要版本、内部版本以及修訂号。在MSDN上有專門對版本号說明的内容(見相關連結3),比較重要的摘抄如下:
Major:名稱相同但主要版本号不同的程式集不可互換。 更高版本号可能表明大幅重寫無法假定向後相容的産品。
Minor:如果兩個程式集的名稱和主要版本号相同,而次要版本号不同,這訓示顯著增強,但照顧到了向後相容性。 該較高的次要版本号可訓示産品的修正版或完全向後相容的新版本。
Build:生成号的不同表示對相同源所作的重新編譯。 處理器、 平台或編譯器更改時,可能使用不同的生成号。
Revision:名稱、主要版本号和次要版本号都相同但修訂号不同的程式集應是完全可互換的。 更高修訂号可能在修複以前釋出的程式集安全漏洞的版本中使用。
程式集的隻有Build或Revision不同的後續版本被認為是先前版本的修補程式 (Hotfix) 更新。
在《CLR via C#(第3版)》一書中,也提到了版本号的建議使用方式:
如果公司每天都要生成程式集,那麼每天都應該遞增這個build号。最後一個編号指出build的修訂次數。如果因為某個原因,公司某一天必須生成兩次程式集(可能是為了修複一個重大的bug),revision号就應該遞增。
Microsoft使用的就是這個版本編号方案,而且建議你也是用它。
P52
【相關連結】
- How to use Assembly Version and Assembly File Version:http://support.microsoft.com/kb/556041/en-us
- Assembly Versioning in .NET:http://www.danielfortunov.com/software/%24daniel_fortunovs_adventures_in_software_development/2009/03/03/assembly_versioning_in_net
- Version 類:http://msdn.microsoft.com/zh-cn/library/system.version.aspx
如果您覺得本文對您有所幫助,不妨點選下方的“推薦”按鈕來支援我! 本文及文章中代碼均基于“署名-非商業性使用-相同方式共享 3.0”,文章歡迎轉載,但請您務必注明文章的作者和出處連結,如有疑問請私信我聯系! |