【题外话】安全
一直以来都对.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
【相关连接】