VS版本号定义、规则和相关的Visual Studio插件

软件版本号主要标识了软件的版本,通过其可以了解软件、类库文件的当前版本,使得软件版本控制有所依据。

我们就Windows系统和.NET Framework的编号规则来看,软件版本号的定义结构一般是这样:

主版本号.子版本号.编译版本号.修正版本号

我们也可以在项目属性上可以看到相关设置的界面,对应的英文名称分别为:major.minor.build.revision

Major:具有相同名称但不同主版本号的程序集不可互换。例如,这适用于对产品的大量重写,这些重写使得无法实现向后兼容性。当有极大的更新时,会增加major的版号。

Minor:如果两个程序集的名称和主版本号相同,而次版本号不同,这指示显著增强,但照顾到了向后兼容性。例如,这适用于产品的修正版或完全向后兼容的新版本。而当有大更新,但不至于更新major时,会更新minor的版号。

Build:内部版本号的不同表示对相同源所作的重新编译。这适合于更改处理器、平台或编译器的情况。若更新比较小,例如只是除虫(bug fixing),则会更新build的版号。

Revision:名称、主版本号和次版本号都相同但修订号不同的程序集应是完全可互换的。这适用于修复以前发布的程序集中的安全漏洞。程序集的只有内部版本号或修订号不同的后续版本被认为是先前版本的修补程序 (Hotfix) 更新。当在同一个Build下需要重新编译,那么就需要增加Revision即可。

从msdn看到最大值为“a maximum value of F:System.UInt16.MaxValue - 1,也就是 65534

所以一般的版本信息设置看起来应该是这样:

1
1.1
1.1.*
1.1.1
1.1.1.*
1.1.1.1

2. .NET里自动编号的方法

在设置页面里有一个是程序集版本号,一个是文件版本号。文件版本号主要用来为文件做标识,而程序集版本号用于CLR识别使用。

在我们确定了主版本号和子版本号后,编译版本号和修正版本号就需要在每次编译的时候去变动了,这样在程序测试、排错时才能快速定位到使用的是哪个编译出的版本,而不仅仅是通过文件创建时间去辨别。

在.NET里面提供了一个方法去自动对编译版本号和修正版本号进行设置的方法。

首先我们需要知道通过界面设置的版本信息是存储在项目里的AssemblyInfo.cs文件里的。

默认的设置是这样。

1 [assembly: AssemblyVersion("1.0.0.0")]
2 [assembly: AssemblyFileVersion("1.0.0.0")]

我们需要将主版本号和子版本号填写好,因为这部分是不会频繁变动的,而编译版本使用通配符*代替,并将文件版本信息注释掉,设置起来像这样。

1 [assembly: AssemblyVersion("1.0.*")]
2 //[assembly: AssemblyFileVersion("1.0.0.0")]  //如果需要自动增加版本号,需要注释这句代码,只用上面的一行

这样设置后生成的规则就是:编译版本号是自2000年1月1日以来的天数,而修正版本号会是当天自午夜零点以来的秒数除以2所得的值。

我们看一个编译后的结果。

3. 相关的Visual Studio插件

上面.NET提供自动编号的方法在解决方案里有很多项目且想统一管理其版本号时就不能满足需求了,要保持统一就要每次编译前手动统一所有的版本信息了。

还好我们找到了一个插件:Versioning Controlled Build ,这里是作者的CodeProject上面的主页,里面有项目和使用方法的介绍。

在这里面可以统一管理解决方案里面的所有项目,可以按照自己的项目统一修改对应的版本号。

而在插件设置里面还提供了更多的选项已满足不同的自动编号需求。

更多的功能各位可以按照自己的需求去摸索与配置了。

因为CodeProject下载需要注册登录,为了方便下载我把插件放在了这里,点击下载

出处:https://blog.csdn.net/cnhk1225/article/details/37500593

==============================================================================

我在使用VS2017创建的类库的项目的时候,想按照上面的说的[assembly: AssemblyVersion("1.0.*")]来自动增加版本号的,但是修改后,在编译的时候出错,错误提示如下:

错误 CS8357 指定的版本字符串中包含与确定性不兼容的通配符。从版本字符串删除通配符,或者禁用此编译的确定性 PVG.Lib ....PVG.LibPropertiesAssemblyInfo.cs 35

这个情况我就奇怪了,为什么我的其他的项目都可以用,这个项目不可以这样用?于是我又创建了一些其他的类库等进行测试,同样的问题。从错误提示看应该是项目的配置不正确。

不死心啊,打开之前正常的自动版本号的程序和这个项目的文件(.csproj)进行比较,去掉项目文件和引用等,其实两个项目文件不同的地方不多,那就一个一个是试试,到底是哪个项目属性影响导致的问题。当试到<Deterministic>True</Deterministic>的时候,发现我新建的项目都是true,而之前的项目这个属性是false,修改成fasle编译测试,通过了,不报错了。于是拿<Deterministic>到网上查,说是.NET Core默认的设置。
由于时间比较紧,也没细查其他的,等有空了在查<Deterministic>的说明

-------------------------------------------------------------------------------------

再提供几个其他方式实现版本号的思路吧:
将增量(DateTime)信息添加到AssemblyFileVersion属性中,该属性具有不破坏任何依赖性的优点。
你可以结合使用预生成事件生成文件,添加该文件(包括其版本属性)然后使用一种方法来读出那些价值再次。
那是在项目的预生成,事件中:
echo [assembly:System.Reflection.AssemblyFileVersion("%date:~0,4%.%date:~5,2%%date:~8,2%.%time:~0,2%%time:~3,2%.%time:~6,2%")] > $(ProjectDir)PropertiesVersionInfo.cs

将生成的VersionInfo.cs文件(Properties子文件夹)包含到项目中.

注意:

1)写入的文件路径有空格的时候,建议使用双引号

2)写入的文件名可以自己指定,最好和功能相对应

3)版本号的最大值是65535,所以使用AssemblyFileVersion不受这个限制。

所有经过优化可以如下代码:

set t=%time: =0%
echo [assembly: System.Reflection.AssemblyFileVersion("%date:~0,4%.%date:~5,2%.%date:~8,2%.%t:~0,2%%t:~3,2%%t:~6,2%")] > "$(ProjectDir)PropertiesFileVersionInfo.cs"


-------------------------------------------------------------------------------------
Cake支持AssemblyInfo文件修补。手中拿着蛋糕,你可以通过无限的方式实现自动版本递增。
像C#编译器那样递增版本的简单示例:
Setup(() =>
{
// Executed BEFORE the first task.
var datetimeNow = DateTime.Now;
var daysPart = (datetimeNow - new DateTime(2000, 1, 1)).Days;
var secondsPart = (long)datetimeNow.TimeOfDay.TotalSeconds/2;
var assemblyInfo = new AssemblyInfoSettings
{
Version = "3.0.0.0",
FileVersion = string.Format("3.0.{0}.{1}", daysPart, secondsPart)
};
CreateAssemblyInfo("MyProject/Properties/AssemblyInfo.cs", assemblyInfo);
});

参考:https://stackoverflow.com/questions/356543/can-i-automatically-increment-the-file-build-version-when-using-visual-studio

原文地址:https://www.cnblogs.com/mq0036/p/9429708.html