.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使用的就是这个版本编号方案,而且建议你也是用它。

 【相关链接】

  1. How to use Assembly Version and Assembly File Version:http://support.microsoft.com/kb/556041/en-us

  2. Assembly Versioning in .NET:http://www.danielfortunov.com/software/%24daniel_fortunovs_adventures_in_software_development/2009/03/03/assembly_versioning_in_net

  3. Version 类:http://msdn.microsoft.com/zh-cn/library/system.version.aspx

原文地址:http://www.cnblogs.com/mayswind/p/3387680.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java实现最电话号码的简单加密源码

废话已经在 java实现加密电话号码,有具体的加密流程注释 这里面说了,这篇文章我就直接上代码了! 请看: /** * Title: TestMain.java * Package org.test * Description: TODO该方法的主要作用: * author A18ccms A1…

进程和线程关系及区别

转载自 进程和线程关系及区别 1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只…

铜仁学院计算机报名,铜仁学院2012年3月全国计算机等级考试报名时间通知

2012年3月全国计算机等级考试有关事宜的通知各系(部)、现代教育技术中心、计财处:2012年3月全国计算机等级考试将于2012年3月24日-25日举行,按照教育部考试中心和贵州省考试中心的要求,我院计算机考试报名准备工作从2011年12月1日…

2013蓝桥杯-B-省赛-七、错误票据

七、错误票据 package com.markerhub;import java.util.Scanner; import java.util.ArrayList; import java.util.Collections;public class TEST { //解题思路:枚举public static void main(String[] args) {Scanner sc new Scanner(System.in);int N sc.nextI…

Windows.etc\hosts文件

Windows.etc\hosts文件 ZC:就是将 后面的项 重定位到 前面的项 1、目录:"C:\Windows\System32\drivers\etc" 文件:"C:\Windows\System32\drivers\etc\hosts" 2、c__Windows_System32_drivers_etc_hosts的作用 - Sharpe…

Java多线程:实现方式Thread与Runnable

转载自 Java多线程:实现方式 在Java中, 多线程的实现有两种方式:扩展java.lang.Thread类实现java.lang.Runnable接口 方法1 /** * Description: 继承Thread类, 实现多线程. * author snoopy * blog http://blog.csdn.net/huang_xw */ package basic.a_start; …

java实现邮件发送准备工作(前期配置)

本文主要用的邮件客户端是:office 2007的outlook,服务器是apache-james-2.3.2,首先我们来配置一下这个james服务器: 1.将james服务器解压到硬盘目录下,注意目录不能有中文,如e:盘下 2.修改apps/james/sar-inf目录下的confi…

计算机在轻化工程中的应用,计算机在轻化工程专业中的应用-中国大学mooc-题库零氪...

第一章 试验设计与统计学基础第一章单元测验1、1. 统计学是一门收集、整理、()和解释数据的科学。A、A、扩大B、B、传递C、C、增加D、D、分析2、3. ()最早提出试验设计的理论。A、A、Francis GaltonB、B、Karl PearsonC、C、Rinald FisherD、D、William Gosset3、4. 用来描述样…

JwtFilter---解决其中的跨域问题

JwtFilter 第五步:定义jwt的过滤器JwtFilter。 这个过滤器是我们的重点,这里我们继承的是Shiro内置的AuthenticatingFilter,一个可以内置了可以自动登录方法的的过滤器,有些同学继承BasicHttpAuthenticationFilter也是可以的。 …

win10关闭“Windows安全中心”功能的两种方法

win10系统怎么将windows安全中心关闭? 听语音 原创|浏览:10407|更新:2020-03-24 10:541 2 3 4 5 6 7 分步阅读 一些软件需要将Windows安全中心关闭。 方法/步骤 1 首先打开开始菜单。 2 在开始菜单中点击设置按钮。 3 在设置界…

ASP.NET Core 中间件Diagnostics使用

ASP.NET Core 中间件(Middleware)Diagnostics使用。对于中间件的介绍可以查看之前的文章ASP.NET Core 开发-中间件(Middleware)。 Diagnostics中间件,主要功能是用于报告和处理ASP.NET Core中的异常和错误信息,以及诊断Entity Framework核心迁移错误。 其…

使用java底层实现邮件的发送(含测试,源码)

直接上代码:3个类,两个主要的类,一个测试类: 主类(Mail): /** * Title: Mail.java * Package org.service.impl * Description: TODO该方法的主要作用: * author A18ccms A18ccms_…

Java多线程:线程状态

转载自 Java多线程:线程状态 一. 线程状态类型 1. 新建状态(New):新创建了一个线程对象。 2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行…

配置计算机系统doc,[计算机系统配置实用程序.doc

[计算机系统配置实用程序初学者在使用电脑过程中,肯定会碰到各种各样的问题:如怎么管理电脑的自启动程序、如何查看加载的系统服务、怎样从安装光盘提取丢失的系统文件等。为了解决类似问题,微软在系统中提供了一个实用工具——系统配置实用程…

Win10怎么关闭开机启动项

Win10怎么关闭开机启动项 我们可以首先打开电脑的运行对话框,按下键盘的WINR组合键,打开运行。 然后这里我们在运行对话框中输入命令msconfig确定,打开系统配置程序。 系统配置窗口,启动里面点击这里的任务管理器打开。 这时…

TypeScript 2.1发布

TypeScript是微软开发的一个JavaScript的超集,提供了最新的JavaScript特性以及可选的静态类型。近日,TypeScript 2.1发布。该版本提供了功能更为强大的类型检查器,并且让开发人员可以编写出更简洁的代码。以下是该版本带来的主要新特性&#…

使用spring实现邮件的发送(含测试,源码,注释)

此篇主要讲的是使用spring配置实现邮件发送,与之前的底层实现简便了不少,只需要几个配置就可以了,那么请往下看: 先写个接口 /** * Title: IMailserdService.java * Package org.service * Description: TODO该方法的主要作用&a…

海南计算机网络技术学校,三亚广播电视大学计算机网络技术专业_海南报名_网络教育计算机网络技术专业教学计划_中国教育在线...

一、培养目标及规格专科,两年制三年业余学习,最短学习年限不低于两年半。本专业培养热爱社会主义祖国,拥护党的基本路线,具有良好的思想品德和职业道德以及健康的劳动态度;具有创新精神和实践能力,掌握必要…

Java并发编程:线程池的使用

转载自 Java并发编程:线程池的使用 一.Java中的ThreadPoolExecutor类 java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。下面我们来看一下ThreadPoolExecutor类的…

你当前无权访问该文件夹 解决你当前无权访问该文件夹拒绝你访问该文件夹

我 这样就完成了 http://www.xitonghe.com/jiaocheng/windows7-5642.html https://jingyan.baidu.com/article/4b52d702aa01b3fc5c774b1b.html Win10正式版提示你当前无权访问该文件夹怎么办 https://jingyan.baidu.com/article/4b52d702aa01b3fc5c774b1b.html 1407345人看了…