.NET项目版本号的小随笔
【题外话】
一直以来都对.NET项目中的几个版本号(AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersion)以及版本号中的Revision和Build有疑问,今儿抽了点时间看了几篇文章,整理一下与大家一起分享下。
【一、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使用的就是这个版本编号方案,而且建议你也是用它。
【相关链接】
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项目版本号的小随笔相关推荐
- vue项目中的小知识--快捷键-vue插件版本号--vscode插件等
vue项目中的小知识--快捷键等 0 版本号 1 代码片段的获取: 2 vscode中一些常用扩展 3 进入另一个文件夹,返回上一级 4查看Vue的版本和Vue/CLI的版本 5 --save-dev ...
- 微信小程序(一)初步,包括(初步了解微信小程序,小程序项目结构,小程序宿主环境,发布与上线等)
文章目录 前言 一 微信小程序 1. 小程序与普通网页开发的区别 2. 注册小程序开发帐号 3. 安装开发者工具 4. 创建小程序项目 5. 查看项目效果 6. 主界面的 5 个组成部分 二 项目结构 ...
- 软件项目版本号的命名格式
软件项目版本号的命名格式 版本控制比较普遍的 3 种命名格式 : 一. GNU 风格的版本号命名格式 : 主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ]] 英文对照 : Major_V ...
- vins中imu融合_双目版 VINS 项目发布,小觅双目摄像头作为双目惯导相机被推荐...
继 VINS-Mono 和 VINS-Mobile 之后,香港科技大学沈劭劼老师实验室正式发布了双目版 VINS 开源项目 VINS-Fusion .项目推荐了小觅双目摄像头标准版(MYNT EYE ...
- Maven打包时去掉项目版本号
Maven打包时去掉项目版本号 Maven打包后,jar或war文件名里带有版本号信息,如projectname0.0.1-SNAPSHOT.jar等,怎么去掉呢? 解决办法: 打开项目pom.xml ...
- VS2017学习C++基础十一(项目实战:小公主养成记)
// chapter11a01.cpp : //项目实战:小公主养成记#include <iostream> #include <string> #include <ve ...
- Jenkins 通过 Version Number Plug 优雅的生成项目版本号
文章目录 一.场景介绍 二.插件安装 三.插件配置 四.缺陷说明 一.场景介绍 在项目开发过程中,项目版本号的管理和维护对于开发人员来说是一个非常不愿意去维护的事情.特别是微服务盛行的今天,子模块 ...
- HBuildx项目运行到小程序出现下面提示
HBuildx项目运行到小程序出现下面提示 提示服务器已开启,没有报错但是小程序没有反应,这种情况下是由于你不是该项目的开发者导致的.需要在开发者平台去设置添加你为项目成员即可.
- Eclipse里面web项目上面的小地球消失的原因
一般java的web目录在eclipse里面的显示主要的目录.settings,src和WebContent , .classpath , .project 如果项目上面小地球消失,先查看目录格式是 ...
最新文章
- PHP优于Node.js的五大理由
- python自动化框架测试实操_自动化框架之 python+selenium+pytest
- LeetCode 1293. 网格中的最短路径(DP/BFS)
- 统计学习方法第二版知识点合集 - 自用笔记
- 05And06VM和Linux安装
- Aspose.Words转换为PDF的时候字体丢失的问题解决
- PHP中的错误处理set_error_handler()与trigger_error()的问题
- BUGKU 多次 手动注入+脚本盲注
- matlab 冒泡排序函数,MATLAB实现冒泡排序算法
- android 3d翻转动画 viewpage,利用ViewPager实现3D画廊效果及其图片加载优化
- hodj 1008 Elevator (模拟题)
- win10笔记本电脑耳机没反应,耳机没声音的解决方法
- 中英文电子书下载:https://sobooks.cc/
- 工业机器人图册 索罗门采夫_机械手控制系统设计(完整图纸)
- ios相机黑边_iOS相机去黑框
- maya中实时置换效果 dx11shader
- java 获取est时间_java – 在EST时区获取XMLGregorianCalendar日期
- Python数据分析入门--线性规划和非线性规划学习笔记
- IC卡、ID卡、M1卡、射频卡的区别是什么(射频卡是种通信技术)
- ng-alain新版尝试