如何在MSBuild 15中用*设置AssemblyVersion自动生成构建号及新csproj保留旧行为?
在MSBuild 15及新csproj中保留AssemblyVersion自动生成构建号的方法
我来帮你搞定这个问题——不管是在MSBuild 15里用*设置AssemblyVersion自动生成构建号,还是在新的SDK风格csproj项目里保留旧的*占位符自动填充逻辑,其实都有明确的实现方式,下面分情况给你拆解:
旧MSBuild项目(非SDK风格)的原有操作
在传统的csproj项目里,我们一直是这么做的:
- 打开项目根目录下的
Properties/AssemblyInfo.cs文件 - 添加或修改以下代码:
[assembly: AssemblyVersion("1.0.*")] // 可选:如果希望文件版本和程序集版本保持一致,也可以用* [assembly: AssemblyFileVersion("1.0.*")]
MSBuild会自动把*替换成自动生成的数值:构建号是从2000年1月1日到当前日期的天数,修订号是当天的秒数除以2取整——这就是你熟悉的旧行为。
新SDK风格csproj项目的实现方案
新的SDK项目默认会自动生成AssemblyInfo相关内容,直接在自定义的AssemblyInfo里写*可能会冲突,而且默认逻辑不支持*占位符,所以需要做以下调整,二选一即可:
方案一:禁用自动生成AssemblyInfo,沿用旧的AssemblyInfo.cs
如果你习惯维护自己的AssemblyInfo文件,可以在csproj中关闭自动生成功能:
- 打开你的
.csproj文件 - 在
<PropertyGroup>节点中添加以下配置:
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
- 回到
Properties/AssemblyInfo.cs,像之前一样写[assembly: AssemblyVersion("1.0.*")]即可,MSBuild 15+会按照旧逻辑自动填充构建号。
方案二:直接在csproj中配置版本号(推荐)
如果你不想单独维护AssemblyInfo.cs,可以直接在csproj文件里设置版本属性,同样支持*占位符:
- 打开
.csproj文件 - 在
<PropertyGroup>节点中添加:
<Version>1.0.*</Version>
这样MSBuild会自动解析*,生成和旧版本完全一致的构建号、修订号,并且自动同步到AssemblyVersion和AssemblyFileVersion。
- 如果你需要单独控制文件版本,也可以额外设置
FileVersion属性:
<PropertyGroup> <Version>1.0.*</Version> <FileVersion>1.0.*</FileVersion> </PropertyGroup>
额外注意事项
- 用
*生成的版本号规则和旧MSBuild完全一致,确保行为完全匹配你的预期; - 如果你需要更复杂的版本生成逻辑(比如基于Git提交号),可以自定义MSBuild任务,但如果只是要保留旧的
*占位符行为,上面的方案已经足够。
内容的提问来源于stack exchange,提问作者jbtule




