.NET项目版本号的小随笔
【題外話】
一直以來(lái)都對(duì).NET項(xiàng)目中的幾個(gè)版本號(hào)(AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersion)以及版本號(hào)中的Revision和Build有疑問(wèn),今兒抽了點(diǎn)時(shí)間看了幾篇文章,整理一下與大家一起分享下。
【一、AssemblyVersion與AssemblyFileVersion】
眾所周知,.NET項(xiàng)目屬性中可以設(shè)置兩種版本號(hào),一種叫程序集版本(AssemblyVersion),一種叫文件版本(AssemblyFileVersion),在微軟的知識(shí)庫(kù)(見相關(guān)鏈接1)中有一篇文章提到了這兩個(gè)版本號(hào)的區(qū)別,我大致翻譯一下。
Assembly Version:這是在.NET Framework中編譯和運(yùn)行時(shí)使用的版本號(hào),使用該版本號(hào)定位和加載指定程序集。當(dāng)你在你的項(xiàng)目中引用了指定的程序集,其版本號(hào)將會(huì)嵌入到你的項(xiàng)目中。在運(yùn)行時(shí),CLR通過(guò)該版本號(hào)加載指定程序集。注意,僅當(dāng)程序集使用強(qiáng)命名時(shí),才會(huì)使用程序集名稱、公鑰、語(yǔ)言信息以及該版本號(hào)查找指定程序集,否則只會(huì)根據(jù)文件名進(jìn)行查找。
Assembly File Version:這是在文件系統(tǒng)中給文件的版本號(hào),會(huì)在Windows資源管理器中顯示。但是,在.NET Framework引用類庫(kù)時(shí)從來(lái)不會(huì)用到這個(gè)版本。
我們可以創(chuàng)建兩個(gè)項(xiàng)目試試,對(duì)于引用沒有使用強(qiáng)命名程序集的項(xiàng)目,不論修改Assembly Version還是修改Assembly File Version,都不會(huì)出現(xiàn)任何錯(cuò)誤;而對(duì)于引用了使用強(qiáng)命名程序集的項(xiàng)目,一旦引用的程序集的Assembly Version修改,則會(huì)出現(xiàn)如下圖所示的錯(cuò)誤,導(dǎo)致程序無(wú)法運(yùn)行,而修改Assembly File Version則不會(huì)出現(xiàn)任何錯(cuò)誤。
所以, 在知識(shí)庫(kù)的文章中,也給出了建議的方法:
如果您在為一個(gè)應(yīng)用程序構(gòu)建一個(gè)很多開發(fā)者都在引用的基礎(chǔ)程序集,并且這個(gè)程序集更新速度非常快,比如一天一次之類的,而且這個(gè)程序集還是強(qiáng)命名的,那么您每次更新完程序集后所有的開發(fā)者都需要重新更新引用。這樣做非常繁瑣并且還容易引用出錯(cuò)。所以對(duì)于這種情況更好的辦法是,固定好Assembly Version,而只修改Assembly File Version,即使用后者來(lái)表示最新的版本號(hào)。在這種情況下,開發(fā)者們不需要更新引用,而僅僅只需要把新的程序集文件覆蓋到引用目錄下就可以了。在中間或最后發(fā)布的版本中,為了更有意義,可以更新Assembly Version,使Assembly File Version與Assembly Version近似。
在相關(guān)鏈接2的文章中,作者也給出了修改Assembly Version的情景:
1、當(dāng)程序集為了維護(hù)而更新時(shí),為了向后兼容,一定不要修改Assembly Version。
2、在程序集有重大修改時(shí),一定要修改Assembly Version。
?
【二、AssemblyInformationalVersion】
除了上述兩種版本號(hào)外,其實(shí)還有一種版本號(hào),可以自己在AssemblyInfo.cs文件中添加,那就是AssemblyInformationalVersion,從名字就可以看出來(lái),這個(gè)版本號(hào)更大的意義是版本的信息,而不僅僅是數(shù)字的描述,比如可以設(shè)置為如下的版本信息之類的。
[assembly: AssemblyInformationalVersion("1.0 RC")]AssemblyInformationalVersion與AssemblyFileVersion一樣,都是可以在Windows資源管理器中顯示的,換言之,其都是存儲(chǔ)在Win32版本資源中的。所以如果不設(shè)置AssemblyInformationalVersion的話,默認(rèn)在文件屬性里顯示的“產(chǎn)品版本”就是AssemblyFileVersion,而設(shè)置了AssemblyInformationalVersion以后,才會(huì)顯示AssemblyInformationalVersion設(shè)置的內(nèi)容。如下圖,左邊為未設(shè)置AssemblyInformationalVersion,右邊為設(shè)置了AssemblyInformationalVersion。
?
【三、Build與Revision】
對(duì)于.NET的項(xiàng)目,版本號(hào)是由Major.Minor.Build.Revision構(gòu)成的,通常被稱作主要版本、次要版本、內(nèi)部版本以及修訂號(hào)。在MSDN上有專門對(duì)版本號(hào)說(shuō)明的內(nèi)容(見相關(guān)鏈接3),比較重要的摘抄如下:
Major:名稱相同但主要版本號(hào)不同的程序集不可互換。 更高版本號(hào)可能表明大幅重寫無(wú)法假定向后兼容的產(chǎn)品。
Minor:如果兩個(gè)程序集的名稱和主要版本號(hào)相同,而次要版本號(hào)不同,這指示顯著增強(qiáng),但照顧到了向后兼容性。 該較高的次要版本號(hào)可指示產(chǎn)品的修正版或完全向后兼容的新版本。
Build:生成號(hào)的不同表示對(duì)相同源所作的重新編譯。 處理器、 平臺(tái)或編譯器更改時(shí),可能使用不同的生成號(hào)。
Revision:名稱、主要版本號(hào)和次要版本號(hào)都相同但修訂號(hào)不同的程序集應(yīng)是完全可互換的。 更高修訂號(hào)可能在修復(fù)以前發(fā)布的程序集安全漏洞的版本中使用。
程序集的只有Build或Revision不同的后續(xù)版本被認(rèn)為是先前版本的修補(bǔ)程序 (Hotfix) 更新。
?在《CLR via C#(第3版)》一書中,也提到了版本號(hào)的建議使用方式:
如果公司每天都要生成程序集,那么每天都應(yīng)該遞增這個(gè)build號(hào)。最后一個(gè)編號(hào)指出build的修訂次數(shù)。如果因?yàn)槟硞€(gè)原因,公司某一天必須生成兩次程序集(可能是為了修復(fù)一個(gè)重大的bug),revision號(hào)就應(yīng)該遞增。
Microsoft使用的就是這個(gè)版本編號(hào)方案,而且建議你也是用它。
?【相關(guān)鏈接】
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
原文地址:http://www.cnblogs.com/mayswind/p/3387680.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的.NET项目版本号的小随笔的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .NET Core下使用gRpc公开服务
- 下一篇: ASP.NET Core 中间件Diag