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

这两个实现

动态 依赖项 API 有两种实现可供选择,具体取决于目标平台和方案:

  • Windows 应用 SDK 的动态依赖项 API。 Windows 应用 SDK 提供 C 和 C++ 函数(在 msixdynamicdependency.h中)和 Windows 运行时 (WinRT) 类型(在 Microsoft.Windows.ApplicationModel.DynamicDependency 命名空间中),用于实现动态依赖关系 API。 可以在支持 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 的名称与具有附加 Mdd 前缀的 Windows 11 (C/C++) API 的名称相同。 Mdd 代表 Microsoft 动态依赖项

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

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

使用动态依赖项 API

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

1. 在安装时创建参考文件

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

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

您还必须指定一个 生命周期工件,它可以是当前进程、文件或 Windows 注册表项,用于指示系统表明应用仍可用。 如果指定的项目不再存在,则 OS 可以假定不再需要依赖项,并且如果没有其他应用声明依赖它,则可以卸载 MSIX 包。 此功能对于应用在卸载时忽略删除安装时引脚的情况非常有用。

此 API 返回一个依赖项 ID,该 ID 必须用于其他调用来创建运行时引用,并删除安装时引用。

2.添加运行时引用

当应用需要使用 MSIX 包时,请调用以下函数或方法之一来请求访问指定的 MSIX 包,并为其添加运行时引用。 调用此 API 会通知 OS MSIX 包正在使用中,并并行处理任何版本更新(有效延迟卸载或为旧版本提供服务,直到应用使用完毕)。 如果成功,应用可能会激活类并使用 MSIX 包中的内容。

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

3.删除运行时引用

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

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

4.删除安装时引用

卸载应用后,调用以下函数或方法之一以删除安装时引用。 此 API 通知 OS,如果其他应用不依赖于 MSIX 包,则删除 MSIX 包是安全的。

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

两个实现之间的差异

对生存期管理器的需求(Windows 应用 SDK 限制)

使用 Windows 应用 SDK 的动态依赖 API 来依赖 MSIX 包时,API 需要通过另一个已安装的包和一个正在运行的进程协助通知 Windows,该 MSIX 包正在被使用,并在使用期间阻止对框架的维护。 该组件称为 生存期管理器

对于框架包,Windows 应用 SDK 提供名为 动态依赖项生命周期管理器(DDLM)的组件。 但是,目前没有其他框架包提供来自Microsoft的类似生存期管理器组件。

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

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

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

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

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

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

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