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");
//其他数据....
}