为何MSBuild Target设置ApplicationDisplayVersion不生效?求可行方案
问题原因及解决方案
你的代码不生效的核心原因是:Build阶段太晚了。ApplicationDisplayVersion和ApplicationVersion这类版本属性需要在MSBuild更早的阶段被设置,因为项目的版本信息会在Build之前的步骤(比如PrepareForBuild或GenerateAssemblyInfo)就被固化到编译产物中,等到Build阶段再设置已经无法影响最终的版本值。
修正步骤
1. 调整Target的执行时机
把BeforeTargets改为更早的阶段,比如PrepareForBuild(这是MAUI、ASP.NET Core等项目常用的前置阶段,兼容性较好):
<Target Name="CalculateVersionCodeProperties" BeforeTargets="PrepareForBuild"> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <ApplicationDisplayVersion>1.2.3</ApplicationDisplayVersion> <ApplicationVersion>2</ApplicationVersion> </PropertyGroup> </Target>
2. 从外部源读取版本的示例
如果需要从外部源(比如版本文件、环境变量)读取版本值,可以在Target中添加对应的MSBuild任务:
从文本文件读取版本
假设你有一个version.txt文件,内容是1.2.3:
<Target Name="CalculateVersionCodeProperties" BeforeTargets="PrepareForBuild"> <!-- 读取版本文件内容 --> <ReadLinesFromFile File="version.txt"> <Output TaskParameter="Lines" ItemName="VersionLines" /> </ReadLinesFromFile> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <ApplicationDisplayVersion>@(VersionLines)</ApplicationDisplayVersion> <ApplicationVersion>2</ApplicationVersion> </PropertyGroup> </Target>
从环境变量读取版本
假设你设置了环境变量MY_APP_DISPLAY_VERSION:
<Target Name="CalculateVersionCodeProperties" BeforeTargets="PrepareForBuild"> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <ApplicationDisplayVersion>$(MY_APP_DISPLAY_VERSION)</ApplicationDisplayVersion> <ApplicationVersion>2</ApplicationVersion> </PropertyGroup> </Target>
验证方法
- 构建项目后,查看生成的
AssemblyInfo.cs文件(通常在obj目录下),确认AssemblyInformationalVersion是否等于你设置的ApplicationDisplayVersion; - 运行项目,调用
AppInfo.VersionString查看是否显示正确值; - 开启MSBuild详细日志(使用
dotnet build -v detailed命令),搜索ApplicationDisplayVersion,确认属性是否在PrepareForBuild阶段被正确设置。
内容的提问来源于stack exchange,提问作者SimonSays
相关产品推荐
相关产品推荐

