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

如何通过PackageManager将Windows桌面Blazor MAUI应用降级至旧版本

问题描述

我正在开发基于Blazor MAUI的Windows桌面应用,使用PackageManager类处理应用更新。当前实现可正常升级至新版本,但尝试降级至旧版本时失败。

当前使用的代码如下:

RegisterApplicationRestart(null, RestartFlags.NONE);

var deploymentOperation = packageManager.AddPackageAsync(packageUri, null, DeploymentOptions.ForceApplicationShutdown);
var opCompletedEvent = new TaskCompletionSource<bool>();

deploymentOperation.Completed = (depProgress, status) => opCompletedEvent.SetResult(true);
await opCompletedEvent.Task;

if (deploymentOperation.Status == AsyncStatus.Error)
{
    var deploymentResult = deploymentOperation.GetResults();
    _logger.LogError("Error installing update: {ErrorText}", deploymentResult.ErrorText);
    returnValue = 1;
}
else if (deploymentOperation.Status == AsyncStatus.Completed)
{
    _logger.LogInformation("Update installation succeeded.");
}

尝试安装比当前版本旧的应用时,PackageManager.AddPackageAsync操作失败,收到“不允许降级”的错误提示。

请问如何修改更新逻辑,以允许通过PackageManager将应用降级至旧版本?是否需要特定的DeploymentOptions或额外步骤来处理此场景?

附加信息:

  • 应用基于.NET MAUI for Windows构建
  • 更新包从远程服务器下载
  • 更新操作中使用了DeploymentOptions.ForceApplicationShutdown
解决方案

要实现降级,需调整AddPackageAsync的调用参数并注意几个关键环节:

1. 组合使用强制部署选项

默认情况下PackageManager禁止降级,需显式添加ForceTargetApplicationShutdown选项,与原有ForceApplicationShutdown组合后,可强制覆盖现有版本(包括降级场景):

var deploymentOptions = DeploymentOptions.ForceApplicationShutdown | DeploymentOptions.ForceTargetApplicationShutdown;
var deploymentOperation = packageManager.AddPackageAsync(packageUri, null, deploymentOptions);

2. 确保包签名一致性

降级的前提是旧版本安装包与当前应用使用相同的签名证书。若证书不一致,即使添加强制选项,系统也会拒绝安装,这是Windows应用的安全限制。

3. 预先判断版本关系

在触发降级前,主动检测目标版本是否低于当前版本,避免无效操作:

// 获取当前应用包版本
var currentPackage = Package.Current;
var currentVersion = currentPackage.Id.Version;
// 从下载包的元数据中解析目标版本
var targetVersion = new PackageVersion(...); 

// 对比版本号,判断是否为降级操作
bool isDowngrade = targetVersion.Major < currentVersion.Major || 
                   (targetVersion.Major == currentVersion.Major && targetVersion.Minor < currentVersion.Minor) ||
                   (targetVersion.Major == currentVersion.Major && targetVersion.Minor == currentVersion.Minor && targetVersion.Build < currentVersion.Build) ||
                   (targetVersion.Major == currentVersion.Major && targetVersion.Minor == currentVersion.Minor && targetVersion.Build == currentVersion.Build && targetVersion.Revision < currentVersion.Revision);

if (isDowngrade)
{
    // 执行降级逻辑
}

4. 完整修改后的示例代码

RegisterApplicationRestart(null, RestartFlags.NONE);

// 组合强制关闭选项以支持降级
var deploymentOptions = DeploymentOptions.ForceApplicationShutdown | DeploymentOptions.ForceTargetApplicationShutdown;
var deploymentOperation = packageManager.AddPackageAsync(packageUri, null, deploymentOptions);
var opCompletedEvent = new TaskCompletionSource<bool>();

deploymentOperation.Completed = (depProgress, status) => opCompletedEvent.SetResult(true);
await opCompletedEvent.Task;

if (deploymentOperation.Status == AsyncStatus.Error)
{
    var deploymentResult = deploymentOperation.GetResults();
    _logger.LogError("Error installing downgrade: {ErrorText}", deploymentResult.ErrorText);
    returnValue = 1;
}
else if (deploymentOperation.Status == AsyncStatus.Completed)
{
    _logger.LogInformation("Downgrade installation succeeded.");
}

注意事项

  • 该方案仅适用于Windows平台(含.NET MAUI Windows),跨平台场景需单独处理其他平台的更新逻辑。
  • 降级操作可能清除应用临时数据,建议操作前提示用户备份重要信息。

内容的提问来源于stack exchange,提问作者Trajkov Dimitar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:09:55