包注册和生命周期

删除用户的 MSIX 包并不总是会立即删除其暂存文件。 Windows通过跟踪用户、其他包或正在运行的进程是否仍引用它们来管理暂存包。

在描述包生存期时使用以下术语:

  • 暂存:将包内容放置在 Windows 托管的安装存储中。
  • 注册:使分阶段发布的包可供用户使用,并创建其用户专属集成。
  • 删除或取消注册:移除用户的注册信息和集成。
  • Destage:从存储中删除暂存包负载内容。

删除操作可以取消注册包,而无需立即取消暂存。

强相关参考

当仍保留强引用时,Windows 无法将包移出暂存。 常见的强引用包括:

  • 用户的显式包注册。
  • 使包可供用户使用的预配。
  • 通过PackageDependency声明的静态依赖项。
  • 主机运行时依赖项。
  • 只有包才能满足的持久动态依赖项。
  • 当前正在使用包内容的进程。
  • 系统引脚。
  • 统一更新平台(UUP)产品成员资格。

框架包通常保持暂存状态,因为其他包依赖于它们。 当应用程序在版本之间迁移时,多个框架包版本可以并排保留。

弱引用

弱引用不会独立使包处于暂存状态。 资源包之间的关系是主要例子。 如果仅保留弱引用,Windows可以删除包及其弱关系。

删除期间发生的情况

删除包时,Windows首先删除适用的用户注册和特定于用户的集成。 然后,它会评估强引用是否保留:

  1. 如果仍然存在强引用,包将保持暂存状态。
  2. 如果未保留任何强引用,则包将有资格移出暂存区。
  3. Windows 在部署下一次评估并收集未引用的包时删除有效负载。

删除操作完成后,可能会发生 Destaging。 某些引用更改发生在部署操作之外,因此有效负载清理并不总是即时的。

如果进程正在使用该包,则卸载通常会要求关闭应用程序。 为了避免中断进程,请使用 RemovalOptions.DeferRemovalWhenPackagesAreInUse 调用 PackageManager.RemovePackageAsync。 Windows在包不再使用后完成删除。

PowerShell 行为

Remove-AppxPackage 删除一个注册项。 不要将没有用户注册作为 Windows 已删除每个暂存文件的证明。

诊断由其他用户或设备预配过程持有的引用时,请使用 Get-AppxPackage -AllUsers 和预配命令。 删除预配的包会影响将来的注册,但不会删除用户已存在的注册。