如何在C#(.NET6)中自动递增程序集版本号?已尝试方案无效
.NET6+ 实现程序集版本号自动递增的可行方案
针对.NET6及之后SDK风格项目(默认无AssemblyInfo.cs)的版本号自动递增需求,给你几个实测有效的方案,避开常见坑:
方案一:直接用项目文件的Version属性通配符
这是最简便的原生方案,如果你之前试了没生效,大概率是配置冲突:
- 打开项目的.csproj文件,添加或修改如下配置:
<PropertyGroup> <!-- 第三部分为自2000年1月1日起的天数,第四部分为当天秒数/2 --> <Version>1.0.*</Version> <!-- 若需要AssemblyVersion和FileVersion同步,可直接用Version属性,默认会自动关联 --> <!-- 也可以单独指定AssemblyVersion:<AssemblyVersion>1.0.*</AssemblyVersion> --> </PropertyGroup> - 注意事项:
- 不要手动保留旧的AssemblyInfo.cs文件里的
[assembly: AssemblyVersion]或[assembly: FileVersion]属性,否则会覆盖.csproj的配置,直接删掉这些行或者删除整个AssemblyInfo.cs(SDK会自动生成)。 - 若项目里显式设置了
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>,需要改成true(默认就是true,除非你手动改了)。
- 不要手动保留旧的AssemblyInfo.cs文件里的
方案二:全局配置(多项目解决方案适用)
如果你的解决方案有多个项目,不想逐个配置,在解决方案根目录新建Directory.Build.props文件,内容如下:
<Project> <PropertyGroup> <Version>1.0.*</Version> </PropertyGroup> </Project>
所有子项目会自动继承这个版本配置,统一管理更省心。
方案三:自定义MSBuild任务实现灵活版本规则
如果原生通配符的规则不符合你的需求(比如要按构建次数、自定义序列生成),可以自定义MSBuild目标:
比如在.csproj里添加以下配置,实现按「年.月.日.时分」生成版本号:
<Target Name="SetCustomVersion" BeforeTargets="CoreCompile"> <PropertyGroup> <Major>$([System.DateTime]::Now.Year)</Major> <Minor>$([System.DateTime]::Now.Month)</Minor> <Build>$([System.DateTime]::Now.Day)</Build> <Revision>$([System.DateTime]::Now.Hour * 100 + [System.DateTime]::Now.Minute)</Revision> <Version>$(Major).$(Minor).$(Build).$(Revision)</Version> <AssemblyVersion>$(Major).$(Minor).$(Build).$(Revision)</AssemblyVersion> </PropertyGroup> </Target>
你可以根据需求修改逻辑,比如读取存储构建次数的文本文件,每次递增后写入,实现严格的自增序列。
验证版本是否生效
在代码里加一行测试代码,运行后查看输出:
using System.Reflection; var version = Assembly.GetExecutingAssembly().GetName().Version; Console.WriteLine($"当前版本:{version}");
或者右键生成的exe/dll文件,查看「详细信息」里的版本号。
内容的提问来源于stack exchange,提问作者Zerek
相关产品推荐
相关产品推荐

