使用动态依赖项 API 在运行时引用 MSIX 包

两种实现

根据目标平台和方案,动态依赖项 API 有两种实现可供选择:

  • Windows 应用 SDK 的动态依赖项 API。 Windows 应用 SDK 提供可实现动态依赖项 API 的 C 和 C++ 函数(在 msixdynamicdependency.h 中)和 Windows 运行时 (WinRT) 类型(在 Microsoft.Windows.ApplicationModel.DynamicDependency 命名空间中)。 可以在支持 Windows 应用 SDK 的任何版本的 Windows 上使用此 API 实现。
  • Windows 11 的动态依赖项 API。 Windows 11 也提供了实现动态依赖项 API 的 C 和 C++ 函数(在 appmodel.h 中)。 此 API 实现只能由面向 Windows 11 版本 22H2 (10.0;内部版本 22621)及更高版本的应用使用。

另请参阅两种实现之间的差异

注意

如本主题中所示,Windows 应用 SDK (C/C++) API 与 Windows 11 (C/C++) API 具有相同的名称,但带有额外的 Mdd 前缀。 Mdd 代表 Microsoft 动态依赖项。

并且有不同类型的 MSIX 包,包括框架资源可选包。 动态依赖项 API 使未打包的应用能够引用和使用 WinUI 2 与 DirectX 运行时等框架包。 有关框架包依赖项的详细信息,请参阅 MSIX 框架包和动态依赖项

具体而言,动态依赖项 API 提供了用于为 MSIX 包管理安装时引用和运行时引用的方式。 有关详细信息,请参阅框架包的服务模型

使用动态依赖项 API

若要在未打包的应用中使用动态依赖项 API 依赖于 MSIX 包,请在代码中遵循此常规模式:

1. 创建安装时引用

在应用安装程序中或首次运行应用期间,可调用以下函数或方法之一来为要使用的 MSIX 包指定一组条件。 这会向操作系统告知应用依赖于满足指定条件的 MSIX 包。 如果安装了满足条件的一个或多个 MSIX 包,则 Windows 会确保在删除安装时引用之前至少使这些包中的一个保持安装状态。

  • Windows 11 (C/C++):TryCreatePackageDependency
  • Windows App SDK (C/C++):MddTryCreatePackageDependency
  • Windows App SDK (WinRT):PackageDependency.Create

指定的条件包括包系列名称、最低版本和体系结构,但不能指示特定 MSIX 包。 添加对 MSIX 包的运行时引用时,API 会选择满足指定条件的最高版本。

还必须指定生存期项目,这可以是当前进程、文件或是向系统指示应用仍可用的 Windows 注册表项。 如果指定项目不再存在,则操作系统可能会假设不再需要依赖项,并且如果其他应用都未声明对 MSIX 包的依赖,则可以卸载它。 对于应用在卸载时会忽略删除安装时 pin 的情况,此功能十分有用。

此 API 会返回一个依赖项 ID,必须在其他调用中使用该 ID 才能创建运行时引用并删除安装时引用。

2. 添加运行时引用

在应用需要使用 MSIX 包时,调用以下函数或方法之一可请求访问指定 MSIX 包并为其添加运行时引用。 调用此 API 会向操作系统告知 MSIX 包处于活动使用状态,以按并行方式处理任何版本更新(实际上会延迟卸载或以其他方式维护较旧版本,直到应用使用完它之后)。 如果成功,则应用可能会激活类并使用 MSIX 包中的内容。

  • Windows 11 (C/C++):AddPackageDependency
  • Windows App SDK (C/C++):MddAddPackageDependency
  • Windows App SDK (WinRT):PackageDependency.Add

调用此 API 时,必须传入在创建安装时引用时返回的依赖项 ID 以及进程包图中要用于 MSIX 包的所需级别。 此 API 会返回所引用的 MSIX 包的完整名称,以及用于跟踪活动使用依赖项的句柄。 如果安装了多个满足在创建安装时引用时指定的条件的 MSIX 包,则 API 会选择满足条件的最高版本。

3. 删除运行时引用

应用使用完 MSIX 包后,调用以下函数或方法之一可删除运行时引用。 通常,应用会在关闭过程中调用此 API。 此 API 会向操作系统告知可以安全地删除任何不必要的 MSIX 包版本。

  • Windows 11 (C/C++):RemovePackageDependency
  • Windows App SDK (C/C++):MddRemovePackageDependency
  • Windows App SDK (WinRT):PackageDependencyContext.Remove

调用此 API 时,必须传入添加运行时引用时返回的句柄。

4. 删除安装时引用

卸载应用时,可调用以下函数或方法之一来删除安装时引用。 此 API 会向操作系统告知如果没有其他应用依赖于 MSIX 包,则可以安全地删除框架包。

  • Windows 11 (C/C++):DeletePackageDependency
  • Windows App SDK (C/C++):MddDeletePackageDependency
  • Windows App SDK (WinRT):PackageDependency.Delete

调用此 API 时,必须传入创建安装时引用时返回的依赖项 ID。

两种实现之间的差异

需要生存期管理器(Windows 应用 SDK 限制)

当使用 Windows 应用 SDK 的动态依赖项 API 依赖于 MSIX 包时,该 API 需要通过其他已安装的包和正在运行的进程提供帮助,以向 Windows 告知 MSIX 包正在使用中,并在使用期间阻止为框架提供服务。 该组件称为生存期管理器

Windows 应用 SDK 为其框架包提供了一个生存期管理器组件,称为动态依赖项生存期管理器 (DDLM)。 但是,当前没有其他框架包提供与 Microsoft 类似的生存期管理器组件。

Windows 11 的动态依赖项 API 没有此限制。

引用和使用主包(Windows 应用 SDK 限制)

动态依赖项始终可以面向框架包。 但只有 Windows 11 的动态依赖项 API 可以引用和使用包。

主包必须正确配置其应用包清单源文件(Visual Studio 中的 Package.appxmanifest 文件)。 具体而言,主包(目标,而不是调用方)需要设置 <uap15:DependencyTarget>true</>(请参阅 uap15:DependencyTarget)。 因此,<uap15::DependencyTarget> 的目的是使动态依赖项以主包为目标。 换句话说,主包必须选择允许其自身用作动态依赖项(而框架包始终隐式允许此设置)。

引用 Windows 应用 SDK 框架包(Windows 应用 SDK 限制)

在未打包的应用中,不能使用 Windows 应用 SDK 的动态依赖项 API 来引用 Windows 应用 SDK 框架包(就像可以使用它引用其他 MSIX 包一样)。 相反,你需要使用 Windows 应用 SDK 提供的 引导程序 API。 引导程序 API 是动态依赖项 API 的一种专用形式,旨在依赖于 Windows 应用 SDK 框架包。 有关详细信息,请参阅将 Windows 应用 SDK 运行时用于使用外部位置打包的应用或未打包的应用

Windows 11 的动态依赖项 API 没有此限制。