首页 > C# > C#如何拥有自动递增版本号(Visual Studio)?

C#如何拥有自动递增版本号(Visual Studio)?

上一篇 下一篇

这个问题在这里已经有了答案
使用 Visual Studio 时,是否可以自动递增文件生成版本?

(26 回答)
9年前关闭。

我想存储一组在构建时自动递增的整数:

int MajorVersion = 0;
int MinorVersion = 1;
int Revision = 92;

当我编译时,它会自动递增.当我构建安装项目时,它会递增(我可以手动执行此操作)。 只会手动递增。RevisionMinorVersionMajorVersion

然后我可以在菜单“帮助/关于”中向用户显示版本号,如下所示:

  Version: 0.1.92

如何实现这一点?

这个问题不仅询问如何拥有自动递增的版本号,还询问如何在代码中使用它,这是一个比其他版本更完整的答案。

分割线

网友回答:

如果将 AssemblyInfo 类添加到项目中,并将属性修改为以星号结尾,例如:AssemblyVersion

[assembly: AssemblyVersion("2.10.*")]

Visual Studio 将根据这些规则为您增加最终数字(谢谢 galets,我完全错了!

要在代码中引用此版本,以便可以向用户显示它,请使用 。例如reflection

Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
DateTime buildDate = new DateTime(2000, 1, 1)
                        .AddDays(version.Build).AddSeconds(version.Revision * 2);
string displayableVersion = $"{version} ({buildDate})";

你应该知道的三个重要陷阱

从@ashes999:

还值得注意的是,如果同时指定了 和,则不会在.exe上看到此信息。AssemblyVersionAssemblyFileVersion

从@BrainSlugs83:

仅将第 4 个数字设置为 be 可能很糟糕,因为版本不会总是递增。
第 3 个数字是自 2000 年以来的天数第 4 个数字是自午夜以来的秒数(除以 2)[不是随机的]。因此,如果您在一天的晚些时候生成解决方案,并在第二天的早些时候生成解决方案,则较晚的版本将具有较早的版本号。我建议始终使用而不是,因为您的版本号将始终以这种方式增加。
*X.Y.*X.Y.Z.*

较新版本的Visual Studio会给出此错误:

(此线程始于 2009 年)

指定的版本字符串包含通配符,这些通配符与确定性不兼容。从版本字符串中删除通配符,或禁用此编译的确定性。

请参阅此 SO 答案,它解释了如何消除确定性 (https://stackoverflow.com/a/58101474/1555612)

分割线

网友回答:

您可以使用Visual Studio中的T4模板机制从简单的文本文件生成所需的源代码:

我想为某些 .NET
项目配置版本信息生成。自从我调查可用
选项以来已经有很长时间了,所以我四处搜索,希望找到一些简单的方法来做到这一点
。我发现的情况看起来并不令人鼓舞:人们编写
Visual Studio加载项和自定义MsBuild任务只是为了获得一个
整数(好吧,也许是两个)。对于一个小型
的个人项目来说,这感觉有点矫枉过正。

灵感来自StackOverflow的一个讨论,
有人建议T4模板可以完成这项工作。他们当然
可以。该解决方案需要最少的工作量,并且无需Visual Studio
或构建过程自定义。这里应该做什么:

  1. 创建一个扩展名为“.tt”的文件,并放置将生成AssemblyVersion和AssemblyFileVersion属性的T4模板:
<#@ template language="C#" #>
// 
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
// 

using System.Reflection;

[assembly: AssemblyVersion("1.0.1.<#= this.RevisionNumber #>")]
[assembly: AssemblyFileVersion("1.0.1.<#= this.RevisionNumber #>")]
<#+
    int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(2010,1,1)).TotalDays;
#>

您必须决定版本号生成算法。对我来说
,自动生成一个设置为自 1 年 2010 月 <> 日以来的天数的
修订号就足够了。如您所见,
版本生成规则是用纯 C# 编写的,因此您可以根据需要
轻松调整它。

  1. 上面的文件应放置在其中一个项目中。我只用这个文件创建了一个新项目,以使版本管理
    技术清晰。当我生成此项目时(实际上我甚至不需要
    生成它:保存文件足以触发 Visual Studio
    操作),将生成以下 C#:
// 
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
// 

using System.Reflection;

[assembly: AssemblyVersion("1.0.1.113")]
[assembly: AssemblyFileVersion("1.0.1.113")]

是的,今天是自113年1月2010日以来的<>天。明天修订
号将更改。

  1. 下一步是从应
    共享相同自动生成的版本信息的所有项目中的 AssemblyInfo.cs 文件中删除 AssemblyVersion 和 AssemblyFileVersion 属性。而是为每个项目选择“添加
    现有项”,导航到包含 T4
    模板文件的文件夹,选择相应的“.cs”文件并将其添加为链接。
    那就行了!

我喜欢这种方法的原因是它是轻量级的(没有自定义
MsBuild 任务),并且自动生成的版本信息不会添加到源代码管理中
。当然,使用 C# 进行版本生成
算法可以为任何复杂的算法打开。

分割线

网友回答:

这是我对 T4 建议的实现…这将在每次构建项目时增加内部版本号,而不管所选配置如何(即 Debug|发布),并且每次执行发布版本时,它都会递增修订号。您可以通过应用程序 ➤ 程序集信息继续更新主要和次要版本号…

为了更详细地解释,这将读取现有文件,并使用正则表达式查找信息,然后根据 的输入递增修订版号和内部版本号。AssemblyInfo.csAssemblyVersionTextTransform.exe

  1. 删除现有文件。AssemblyInfo.cs
  2. 在其位置创建一个文件。Visual Studio 应在保存 T4 文件后创建它并将其与 T4 文件分组。AssemblyInfo.ttAssemblyInfo.cs
    <#@ template debug="true" hostspecific="true" language="C#" #>
    <#@ output extension=".cs" #>
    <#@ import namespace="System.IO" #>
    <#@ import namespace="System.Text.RegularExpressions" #>
    <#
        string output = File.ReadAllText(this.Host.ResolvePath("AssemblyInfo.cs"));
        Regex pattern = new Regex("AssemblyVersion\("(?<major>\d+)\.(?<minor>\d+)\.(?<revision>\d+)\.(?<build>\d+)"\)");
        MatchCollection matches = pattern.Matches(output);
        if( matches.Count == 1 )
        {
            major = Convert.ToInt32(matches[0].Groups["major"].Value);
            minor = Convert.ToInt32(matches[0].Groups["minor"].Value);
            build = Convert.ToInt32(matches[0].Groups["build"].Value) + 1;
            revision = Convert.ToInt32(matches[0].Groups["revision"].Value);
            if( this.Host.ResolveParameterValue("-","-","BuildConfiguration") == "Release" )
                revision++;
        }
    #>
    
    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    using System.Resources;
    
    // General Information
    [assembly: AssemblyTitle("Insert title here")]
    [assembly: AssemblyDescription("Insert description here")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("Insert company here")]
    [assembly: AssemblyProduct("Insert product here")]
    [assembly: AssemblyCopyright("Insert copyright here")]
    [assembly: AssemblyTrademark("Insert trademark here")]
    [assembly: AssemblyCulture("")]
    
    // Version informationr(
    [assembly: AssemblyVersion("<#= this.major #>.<#= this.minor #>.<#= this.revision #>.<#= this.build #>")]
    [assembly: AssemblyFileVersion("<#= this.major #>.<#= this.minor #>.<#= this.revision #>.<#= this.build #>")]
    [assembly: NeutralResourcesLanguageAttribute( "en-US" )]
    
    <#+
        int major = 1;
        int minor = 0;
        int revision = 0;
        int build = 0;
    #>
    
  3. 将此添加到预构建事件中:
    "%CommonProgramFiles(x86)%microsoft sharedTextTemplating$(VisualStudioVersion)TextTransform.exe" -a !!BuildConfiguration!$(Configuration) "$(ProjectDir)PropertiesAssemblyInfo.tt"
    

模板简介:该模板名称为【C#如何拥有自动递增版本号(Visual Studio)?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 394次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 04-20
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信素材 微信模板 单页式简历模板 响应式 企业网站 微信公众平台 微信文章 自适应 微信图片 html5
您可能会喜欢的其他模板