自动更新版本号

我想我的应用程序的版本属性增加每个生成,但我不知道如何在Visual Studio(2005/2008)中启用此function。 我试图将AssemblyVersion指定为1.0 *,但它并不能完全满足我的要求。

我也在使用一个设置文件,而在以前的尝试中,当程序集版本改变我的设置时,由于应用程序在另一个目录中查找设置文件而重置为默认值。

我希望能够以1.1.38的forms显示版本号,所以当用户发现问题时,我可以logging他们正在使用的版本,并告诉他们如果他们有一个旧版本升级。

如何版本工作的简短说明也将不胜感激。 构build版本号和版本号何时递增?

使用“内置”的东西,你不能,因为使用1.0。*或1.0.0。*将取代修订和编号与一个编码的date/时间戳,这通常也是一个好方法。

有关更多信息,请参阅/ v标签中的汇编链接器文档。

至于自动递增数字,使用AssemblyInfo任务:

AssemblyInfo任务

这可以configuration为自动增加内部版本号。

有2个问题:

  1. 版本string中的4个数字中的每一个都被限制为65535.这是Windows限制,不太可能得到解决。
    • 为什么内部版本号限制在65535?
  2. 与Subversion一起使用需要一个小的改变:
    • 在构build时使用MSBuild生成程序集版本信息(包括SubVersion修复)

检索版本号非常简单:

Version v = Assembly.GetExecutingAssembly().GetName().Version; string About = string.Format(CultureInfo.InvariantCulture, @"YourApp Version {0}.{1}.{2} (r{3})", v.Major, v.Minor, v.Build, v.Revision); 

并澄清:在.net或至less在C#中,构build实际上是第三个数字,而不是第四个,因为有些人(例如习惯于Major.Minor.Release.Build的Delphi开发人员)可能会期望。

在.net中,它是Major.Minor.Build.Revision。

VS.NET默认Assembly版本为1.0。*,并在自动递增时使用以下逻辑:它将构build部分设置为2000年1月1日以来的天数,并将修订部分设置为自午夜以来的秒数,当地时间,除以二。 看到这个MSDN文章 。

程序集版本位于assemblyinfo.vb或assemblyinfo.cs文件中。 从文件:

 ' Version information for an assembly consists of the following four values: ' ' Major Version ' Minor Version ' Build Number ' Revision ' ' You can specify all the values or you can default the Build and Revision Numbers ' by using the '*' as shown below: ' <Assembly: AssemblyVersion("1.0.*")> <Assembly: AssemblyVersion("1.0.0.0")> <Assembly: AssemblyFileVersion("1.0.0.0")> 

我发现,只要在需要产品版本的地方显示上一次构build的date,就可以使用以下方法:

 System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString("yyyy.MM.dd.HH.mm.ss") 

而不是尝试从如下的东西获取版本:

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); object[] attributes = assembly.GetCustomAttributes(typeof(System.Reflection.AssemblyFileVersionAttribute), false); object attribute = null; if (attributes.Length > 0) { attribute = attributes[0] as System.Reflection.AssemblyFileVersionAttribute; } 

你使用什么源码控制系统?

几乎所有的人都有某种forms的$ Id $标签,当文件签入时会得到扩展。

我通常使用某种forms的hackery来显示这个版本号。

另一种方法是使用date作为内部版本号:080803-1448

[Visual Studio 2017, .csproj属性]

要自动更新您的PackageVersion / Version / AssemblyVersion属性(或任何其他属性),首先创build一个新的Microsoft.Build.Utilities.Task类,它将获得您当前的内部版本号并发送更新后的数字(我build议单独创build项目只为该类)。

我手动更新major.minor数字,但让MSBuild自动更新内部版本号(1.1.1,1.1.2,1.3.3等:)

 using Microsoft.Build.Framework; using System; using System.Collections.Generic; using System.Text; public class RefreshVersion : Microsoft.Build.Utilities.Task { [Output] public string NewVersionString { get; set; } public string CurrentVersionString { get; set; } public override bool Execute() { Version currentVersion = new Version(CurrentVersionString ?? "1.0.0"); DateTime d = DateTime.Now; NewVersionString = new Version(currentVersion.Major, currentVersion.Minor, currentVersion.Build+1).ToString(); return true; } } 

然后调用您最近创build的任务MSBuild进程添加您的.csproj文件的下一个代码:

 <Project Sdk="Microsoft.NET.Sdk"> ... <UsingTask TaskName="RefreshVersion" AssemblyFile="$(MSBuildThisFileFullPath)\..\..\<dll path>\BuildTasks.dll" /> <Target Name="RefreshVersionBuildTask" BeforeTargets="Pack" Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> <RefreshVersion CurrentVersionString="$(PackageVersion)"> <Output TaskParameter="NewVersionString" PropertyName="NewVersionString" /> </RefreshVersion> <Message Text="Updating package version number to $(NewVersionString)..." Importance="high" /> <XmlPoke XmlInputPath="$(MSBuildProjectDirectory)\mustache.website.sdk.dotNET.csproj" Query="/Project/PropertyGroup/PackageVersion" Value="$(NewVersionString)" /> </Target> ... <PropertyGroup> .. <PackageVersion>1.1.4</PackageVersion> .. 

当selectVisual Studio Pack项目选项(在Build之前更改为BeforeTargets="Build"以执行任务),将触发RefreshVersion代码来计算新版本号,并且XmlPoke任务将相应地更新您的.csproj属性(是的,将修改文件)。

在使用NuGet库时,我还通过将下一个构build任务添加到前面的示例中,将包发送到NuGet存储库。

 <Message Text="Uploading package to NuGet..." Importance="high" /> <Exec WorkingDirectory="$(MSBuildProjectDirectory)\bin\release" Command="c:\nuget\nuget push *.nupkg -Source https://www.nuget.org/api/v2/package" IgnoreExitCode="true" /> 

c:\nuget\nuget是我拥有NuGet客户端的地方(记得通过调用nuget SetApiKey <my-api-key>来保存您的NuGet API密钥,或者在NuGet推送调用中包含密钥)。

以防万一它帮助某人^ _ ^。

前段时间我写了一个快速而脏的exe文件,它会在assemblyinfo中更新#版本。{cs / vb} – 我也用rxfind.exe(一个简单而强大的基于正则expression式的searchreplace工具)来执行作为构build过程的一部分从命令行更新。 其他一些有用的提示:

  1. 将汇编信息分解成产品部分(公司名称,版本等)和assembly特定部分(assembly名称等)。 看到这里
  2. 另外 – 我使用颠覆,所以我发现将内部版本号设置为颠覆版本号是很有帮助的,因此可以很容易地返回到生成程序集的代码库(例如1.4.100.1502由版本1502构build)。

如果您想要每次编译完成时更新的自动递增数字,则可以使用预生成事件中的VersionUpdater 。 如果您愿意,预构build事件可以检查构buildconfiguration,以便版本号仅针对发布版本(例如)进行增量。