MSIX 框架包和动态依赖项

本文介绍与 MSIX 框架包相关的重要概念。 本文中的信息提供了有用的上下文,可帮助你更好地了解 Windows 应用 SDK 和 Windows 11 OS 中 动态依赖项 功能的设计和用途。 此功能使应用能够在运行时引用和使用 MSIX 框架包。

框架包和包图

MSIX 是一种提供新式打包和部署体验的包格式。 它还通过 MSIX 框架包提供一种干净且受信任的方法来打包可再发行库、内容和组件。 MSIX 框架包允许打包的应用通过用户设备上的单个共享源访问组件,而不是将它们捆绑到应用包中。 常见框架包包括 Windows 应用 SDK(包括 WinUI3)、WinUI2VCLibs和 DirectX 运行时。

从 Windows 8 开始,并继续通过 Windows 10 和 Windows 11,每个进程都有一个 包图形,它提供应用可用的所有包的列表,包括框架、资源、可选包和主包。 此图允许应用加载引用包提供的 DLL、内容和运行时类声明。 从历史上看,此图在进程创建时是固定的,在运行时无法更改它:

  • 对于打包的应用,图形是根据应用包清单中 PackageDependency 元素中声明的包依赖项初始化的。 生成打包的应用时,通常会根据项目引用和依赖项在生成过程中完成此操作。
  • 对于未打包的应用,包图形为空,无法更改。 因此,解压缩的应用仅限于 标准 DLL 搜索顺序 且无法访问框架包。

通过在 Windows 应用 SDK 和 Windows 11 中引入动态依赖项支持,该静态包图形限制得以解除。 开发人员可以使用动态依赖项在运行时从其应用引用和使用 MSIX 框架包。 动态依赖项从应用中删除静态包图形限制,开发人员可以决定它们如何利用框架包。

动态依赖项的主要场景

尽管动态依赖项允许任何应用在运行时添加包框架依赖项,但此功能主要供打包到外部位置或未打包的应用使用。 打包的应用仍可以通过包清单中的 PackageDependency 元素继续添加静态依赖项。

框架包的服务模型

动态依赖项功能为在运行时动态引用和使用的框架包保留服务管道的完整性。

MSIX 框架包支持在并行方式中进行服务,这意味着每个版本都会安装在其各自的独立版本化文件夹中。 这样,即使较新的应用安装较新版本的框架包,应用程序也能够保持正常运行。 根据某个框架包中是否存在安装时引用 以及运行时引用 ,操作系统具有卸载逻辑,以确定何时删除该包的旧版本。

  • 应用安装后,可以创建一个 安装时引用至框架包。 此参考通知 OS 应用依赖于指定的框架包,以便操作系统在安装应用时不会卸载框架包。
  • 当应用需要使用框架包中的 API 或内容时,它可以向框架包添加 运行时引用。 此参考告知操作系统框架包正在被积极使用,并且应以并行的方式处理任何版本更新。 如果安装了新版本的框架包,但正在运行的应用正在使用较旧版本,则在删除对旧版本的所有运行时引用之前,OS 无法删除旧版本。

例如,在这种情况下:

  • 应用 A 正在运行并使用给定框架包的版本 1.0.0.0。
  • 应用程序 应用 B 已安装,并依赖于同一框架包的版本 1.0.0.1。

在此方案中,应用 A应用 B安装并使用这两个版本的框架包。但是,当用户关闭 应用 A,然后重新启动时,它将选取框架包的较新版本 1.0.0.1。 此时,运行时引用要求对框架包的版本 1.0.0.0 不再有效,OS 可以安全地删除 1.0.0.0 版本。 稍后,当用户卸载 应用 A应用 B 时,安装时引用要求将不再有效,并且 OS 可以完全删除框架包。

对于使用 PackageDependency 元素指定对框架包的静态引用的打包应用,在安装或卸载应用时,操作系统会跟踪框架包的安装时间引用。 对于使用动态依赖项功能管理的运行时引用,OS 知道何时运行打包的应用,并避免在较新的框架包可用时删除其正在使用的框架包。