You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:00:28