Net Core 6+ 程序版本号自增

其原理是通过.tt 实现AssemblyInfo

.csproj文件中设置<GenerateAssemblyInfo>false</GenerateAssemblyInfo>,然后通过.tt文件来管理版本号。这样既可以避免属性重复定义的问题,又可以保持版本号的动态更新。不过,请确保.tt文件之外的所有必要的程序集属性都已经妥善定义,以避免丢失重要的程序集元数据。

如果你希望通过项目文件(.csproj)或其他方式来控制版本号,你可以选择移除.tt模板文件中关于版本号的定义。这样,就不会产生重复定义的问题了。

1. 在项目文件中取消自动生成AssemblyInfo

如果你希望保留.tt文件中的版本号定义,并通过它来动态生成版本号,你可以在.csproj文件中添加一行配置,以防止Visual Studio自动生成AssemblyInfo.cs文件。打开.csproj文件,添加以下内容:

<PropertyGroup>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>

这样做会告诉编译器不要自动生成AssemblyInfo文件,从而避免了属性重复定义的问题。但请注意,这意味着需要在.tt文件或其他地方手动定义所有需要的程序集属性。

2. 编辑.tt文件中的属性定义

<#@ 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.<#= this.YearMonth #>.<#= this.TotalMinutesSince #>")]
[assembly: AssemblyFileVersion("1.0.<#= this.YearMonth #>.<#= this.TotalMinutesSince #>")]
<#+
    private string YearMonth
    {
        get
        {
            var now = DateTime.UtcNow; // 或者使用 DateTime.Now,取决于你是否需要UTC时间
            return now.ToString("yyM"); // "24"代表年份的后两位,"7"代表月份
        }
    }

    private int TotalMinutesSince
    {
        get
        {
            var now = DateTime.UtcNow; // 或者使用 DateTime.Now,取决于你是否需要UTC时间
            var startTime = new DateTime(now.Year, now.Month, 1);
            return (int)(now - startTime).TotalMinutes; 
        }
    }
#>

3. 使用方式

private static void Main(string[] args)
{
    // 获取当前程序集
    Assembly assembly = Assembly.GetExecutingAssembly();
    // 获取版本信息
    var version = assembly.GetName().Version.ToString();
    //程序自动更新
    AutoUpdater.TopMost = true;
    AutoUpdater.InstalledVersion = new Version(version);
    //AutoUpdater.ClearAppDirectory = true;
        
AutoUpdater.Start("https://software.mutadecheng.com/softwarexml/%E9%9D%99%E5%8A%9B%E6%A0%87%E5%AE%9A%E8%BD%AF%E4%BB%B6");

    //其他数据....
    
}