WinUI 3多项目应用版本管理最佳实践与自动增量实现咨询
多项目版本管理最佳实践(WinUI 3 场景)
一、自动版本递增方案(无需外部工具)
1. 统一版本控制(基于 Directory.Build.props)
在解决方案根目录创建Directory.Build.props文件,让所有项目共享版本配置,避免逐个维护:
<Project> <PropertyGroup> <!-- 主版本、次版本、构建号手动维护 --> <MajorVersion>1</MajorVersion> <MinorVersion>0</MinorVersion> <BuildNumber>10</BuildNumber> <!-- 修订号自动递增:基于当年天数,每天自动更新 --> <Revision>$([System.DateTime]::Now.DayOfYear)</Revision> <!-- 统一程序集版本、文件版本 --> <AssemblyVersion>$(MajorVersion).$(MinorVersion).$(BuildNumber).$(Revision)</AssemblyVersion> <FileVersion>$(MajorVersion).$(MinorVersion).$(BuildNumber).$(Revision)</FileVersion> <!-- WinUI 3 部署版本与程序集版本对齐 --> <AppxVersion>$(MajorVersion).$(MinorVersion).$(BuildNumber).$(Revision)</AppxVersion> </PropertyGroup> </Project>
所有项目(WinUI 3前端、类库)会自动继承该配置,若需每次构建都递增修订号,可将Revision改为$([System.DateTime]::Now.Ticks.ToString().Substring(10))(基于时间戳,避免重复)。
2. 区分共享类库与专属项目版本
针对CP.Common这类跨解决方案共享的类库,可在其项目的.csproj中覆盖版本属性,独立维护版本:
<PropertyGroup> <MajorVersion>2</MajorVersion> <MinorVersion>1</MinorVersion> <BuildNumber>5</BuildNumber> <Revision>$([System.DateTime]::Now.DayOfYear)</Revision> </PropertyGroup>
专属项目仍使用根目录的统一版本,实现版本隔离。
二、获取版本信息方案
1. 获取WinUI 3部署版本号
直接通过系统API读取侧载包的部署版本:
using Windows.ApplicationModel; public string GetDeploymentVersion() { var package = Package.Current; var version = package.Id.Version; return $"{version.Major}.{version.Minor}.{version.Build}.{version.Revision}"; }
该版本与Directory.Build.props中配置的AppxVersion完全一致,对应安装包显示的版本号。
2. 获取所有关联项目的版本号
通过反射遍历当前程序集的引用,获取所有类库的版本:
using System.Reflection; using System.Collections.Generic; public Dictionary<string, string> GetAllReferencedVersions() { var versionDict = new Dictionary<string, string>(); var currentAssembly = Assembly.GetExecutingAssembly(); // 遍历所有直接引用的程序集 foreach (var referencedAssembly in currentAssembly.GetReferencedAssemblies()) { try { var assembly = Assembly.Load(referencedAssembly); versionDict.Add(referencedAssembly.Name, assembly.GetName().Version.ToString()); } catch (FileNotFoundException) { versionDict.Add(referencedAssembly.Name, "未加载"); } } // 添加当前WinUI项目版本 versionDict.Add(currentAssembly.GetName().Name, currentAssembly.GetName().Version.ToString()); return versionDict; }
此方法可覆盖所有CP.Common和CP.ProjectName开头的项目版本,全面把控状态。
3. 性能优化:预编译嵌入版本信息
若担心反射性能,可在构建时将各项目版本写入文件,嵌入WinUI项目作为资源:
在Directory.Build.props中添加目标任务:
<Project> <Target Name="GenerateVersionInfo" AfterTargets="Build"> <WriteLinesToFile File="$(OutputPath)$(AssemblyName).version" Lines="$(AssemblyVersion)" Overwrite="true" /> </Target> </Project>
将所有类库生成的.version文件添加到WinUI项目的嵌入资源中,运行时直接读取资源文件即可获取版本。
三、注意事项
- 移除所有项目
AssemblyInfo.cs中手动设置的版本号,避免覆盖统一配置。 - WinUI 3项目的
Package.appxmanifest版本号会自动读取AppxVersion属性,无需手动修改。 - 跨解决方案共享的
CP.Common类库,可结合Git标签管理版本,保证跨方案一致性。
内容的提问来源于stack exchange,提问作者pinguinone
相关产品推荐
相关产品推荐

