【題外話】安全
一直以來都對.NET項目中的幾個版本號(AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersion)以及版本號中的Revision和Build有疑問,今兒抽了點時間看了幾篇文章,整理一下與你們一塊兒分享下。ui
【文章索引】spa
【1、AssemblyVersion與AssemblyFileVersion】翻譯
衆所周知,.NET項目屬性中能夠設置兩種版本號,一種叫程序集版本(AssemblyVersion),一種叫文件版本(AssemblyFileVersion),在微軟的知識庫(見相關連接1)中有一篇文章提到了這兩個版本號的區別,我大體翻譯一下。code
Assembly Version:這是在.NET Framework中編譯和運行時使用的版本號,使用該版本號定位和加載指定程序集。當你在你的項目中引用了指定的程序集,其版本號將會嵌入到你的項目中。在運行時,CLR經過該版本號加載指定程序集。注意,僅當程序集使用強命名時,纔會使用程序集名稱、公鑰、語言信息以及該版本號查找指定程序集,不然只會根據文件名進行查找。orm
Assembly File Version:這是在文件系統中給文件的版本號,會在Windows資源管理器中顯示。可是,在.NET Framework引用類庫時歷來不會用到這個版本。blog
咱們能夠建立兩個項目試試,對於引用沒有使用強命名程序集的項目,不論修改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的情景:
一、當程序集爲了維護而更新時,爲了向後兼容,必定不要修改Assembly Version。
二、在程序集有重大修改時,必定要修改Assembly Version。
【2、AssemblyInformationalVersion】
除了上述兩種版本號外,其實還有一種版本號,能夠本身在AssemblyInfo.cs文件中添加,那就是AssemblyInformationalVersion,從名字就能夠看出來,這個版本號更大的意義是版本的信息,而不只僅是數字的描述,好比能夠設置爲以下的版本信息之類的。
[assembly: AssemblyInformationalVersion("1.0 RC")]
AssemblyInformationalVersion與AssemblyFileVersion同樣,都是能夠在Windows資源管理器中顯示的,換言之,其都是存儲在Win32版本資源中的。因此若是不設置AssemblyInformationalVersion的話,默認在文件屬性裏顯示的「產品版本」就是AssemblyFileVersion,而設置了AssemblyInformationalVersion之後,纔會顯示AssemblyInformationalVersion設置的內容。以下圖,左邊爲未設置AssemblyInformationalVersion,右邊爲設置了AssemblyInformationalVersion。
對於.NET的項目,版本號是由Major.Minor.Build.Revision構成的,一般被稱做主要版本、次要版本、內部版本以及修訂號。在MSDN上有專門對版本號說明的內容(見相關連接3),比較重要的摘抄以下:
Major:名稱相同但主要版本號不一樣的程序集不可互換。 更高版本號可能代表大幅重寫沒法假定向後兼容的產品。
Minor:若是兩個程序集的名稱和主要版本號相同,而次要版本號不一樣,這指示顯著加強,但照顧到了向後兼容性。 該較高的次要版本號可指示產品的修正版或徹底向後兼容的新版本。
Build:生成號的不一樣表示對相同源所做的從新編譯。 處理器、 平臺或編譯器更改時,可能使用不一樣的生成號。
Revision:名稱、主要版本號和次要版本號都相同但修訂號不一樣的程序集應是徹底可互換的。 更高修訂號可能在修復之前發佈的程序集安全漏洞的版本中使用。程序集的只有Build或Revision不一樣的後續版本被認爲是先前版本的修補程序 (Hotfix) 更新。
在《CLR via C#(第3版)》一書中,也提到了版本號的建議使用方式:
若是公司天天都要生成程序集,那麼天天都應該遞增這個build號。最後一個編號指出build的修訂次數。若是由於某個緣由,公司某一天必須生成兩次程序集(多是爲了修復一個重大的bug),revision號就應該遞增。
Microsoft使用的就是這個版本編號方案,並且建議你也是用它。
P52
【相關連接】