TrySilentDownloadAndInstallStorePackageUpdatesAsync未重启应用的解决与测试疑问
问题描述
我正在测试一款通过Microsoft Store发布、以MSIX打包的Win32桌面应用。尝试使用TrySilentDownloadAndInstallStorePackageUpdatesAsync进行应用更新,该功能可完成更新,但安装后应用立即退出且未重启。
微软文档显示该函数应重启应用(从IsNowAGoodTimeToRestartApp函数名称可推断),但实际观察并非如此:调用后的调试语句均未触发,说明应用确实被终止但未重启。
考虑替代方案时发现旧Win32 API RegisterApplicationRestart,但它存在限制:“为防止循环重启,系统仅在应用运行至少60秒后才会重启”。这不符合我们快速检查更新、安装后重启的需求,等待60秒会破坏快速检查的目的。
请问有哪些替代方案?是否有办法让应用在安装Microsoft Store更新后自动重启?
(附带疑问:是否无需经过认证流程即可测试Microsoft Store更新?认证耗时数小时,严重影响开发测试周期。)
解决方案
一、应用更新后自动重启的替代方案
1. 自定义外部启动器程序
创建一个轻量的辅助启动器作为主应用的“看守进程”:
- 主应用启动时同步启动该启动器;
- 启动器通过进程ID或名称监听主应用状态;
- 检测到主应用因更新终止后,等待2-3秒(确保更新安装完成),再重新启动主应用。
- 实现示例(C# 伪代码):
var mainProcess = Process.GetCurrentProcess(); var mainAppPath = mainProcess.MainModule.FileName; mainProcess.WaitForExit(); Task.Delay(2000).Wait(); Process.Start(mainAppPath); - 注意:启动器需打包进MSIX包,可通过
Package.Current.InstalledLocation获取主应用路径,避免硬编码。
2. 利用任务计划触发重启
在触发更新前,创建一次性系统任务指定主应用终止后启动:
- 使用
TaskSchedulerAPI或schtasks.exe命令行工具创建任务; - 设置任务为即时执行(延迟几秒),或触发条件为“特定进程终止”;
- 更新完成后任务自动启动主应用,不受
RegisterApplicationRestart的60秒限制。 - 命令行示例:
schtasks /create /tn "RestartMyApp" /tr "C:\Path\To\MyApp.exe" /sc once /st %TIME% /sd %DATE% /f
3. 优化RegisterApplicationRestart使用逻辑
微调应用流程即可绕过60秒限制:
- 应用启动后立即调用
RegisterApplicationRestart注册重启; - 将更新检查逻辑延迟60秒执行(比如启动后后台异步等待,再触发检查);
- 更新触发时应用已运行满60秒,满足重启条件。
二、无需完整认证测试Store更新的方法
1. 使用Microsoft Store测试通道(Flight环)
- 在开发者后台创建应用测试版本(Flight),上传更新包后选择“快速测试”模式,审核时间通常10-30分钟;
- 邀请内部测试人员或添加自己的测试设备,安装测试版本后即可测试更新流程,无需等待正式版完整认证。
2. 本地旁加载测试
- 使用MSIX打包工具生成更新包,在测试设备开启“旁加载应用”权限(设置-更新和安全-开发者选项);
- 直接安装本地MSIX包模拟更新,无需上传到Store,适合快速迭代测试更新逻辑;
- 注意:旁加载应用与正式Store应用的包名/发布者ID需不同,避免冲突。
内容的提问来源于stack exchange,提问作者Leonardo Mesquita
相关产品推荐
相关产品推荐

