创建和托管包扩展

本文介绍如何创建 Windows 11 包扩展并将其托管在应用中。 UWP 应用和 打包的桌面应用支持包扩展。

包扩展类似于应用扩展,但具有更大的灵活性。 具有扩展声明的任何包现在都可以与主机应用无缝共享内容和部署事件。 此功能扩展到应用包之外,包括主包、可选包、框架包和资源包。 虽然使用一组不同的 XML 元素声明包扩展,但包扩展的实现、管理和调试是相同的应用程序扩展。 有关应用程序扩展的详细信息,请参阅 创建和托管应用扩展

程序包扩展现已在 Windows 11 Server 上提供,将来的版本中将可用于 Windows 11。

将包声明为扩展主机

应用通过在 <PkgExtensionHost>声明元素,将自身标识为包扩展主机。

下面显示了 Package.appxmanifest 文件中的示例包扩展声明。

 <Package 
   ... 
   xmlns:uap17="http:schemas.microsoft.com/appx/manifest/uap/windows10/17" 
   IgnorableNamespaces="uap uap17"> 
   ... 
   <Extensions> 
    <uap17:Extension Category="windows.packageExtensionHost">
      <uap17:PackageExtensionHost>
        <uap17:Name>com.microsoft.mathext</uap17:Name>
      </uap17:PackageExtensionHost>
    </uap17:Extension>
   </Extensions> 
     ... 
 </Package> 

请注意xmlns:uap17="http://..."以及IgnorableNamespaces中是否存在uap17。 这是必要的,因为我们使用的是 uap17 命名空间。

<uap17:Extension Category="windows.packageExtensionHost"> 将此包标识为扩展主机。

<uap17:PackageExtensionHost> 中的“Name”元素是扩展合约名称。 当扩展指定相同的扩展协定名称时,主机将能够找到它。 根据惯例,我们建议使用应用或发布者名称生成扩展协定名称,以避免与其他扩展协定名称发生潜在冲突。

可以在同一包中定义多个主机和多个扩展。 在此示例中,我们声明一个主机。 扩展在另一个包中定义。

将包声明为扩展

包通过在其 Package.appxmanifest 文件中声明 <uap17:PackageExtension> 元素,将自身标识为包扩展。 以下示例展示一个将自身声明为扩展的包。

 <Package 
   ... 
   xmlns:uap17="http:schemas.microsoft.com/appx/manifest/uap/windows10/17" 
   IgnorableNamespaces="uap uap17"> 
   ... 
   <Extensions> 
     <uap17:Extension Category="windows.packageExtension"> 
       <uap17:PackageExtension Name="com.microsoft.ai.aiexplorer.model" 
           Id="power" 
           DisplayName="x^y" 
           PublicFolder="Public"
		   Description="Exponent"> 
             <uap17:Properties> 
                 <Service>com.microsoft.powservice</Service>
             </uap17:Properties> 
       </uap17:PackageExtension> 
     </uap17:Extension> 
   </Extensions> 
     ... 
 </Package> 

再次注意 xmlns:uap17="http://..." 行,以及 uap17中的 IgnorableNamespaces。 这是必要的,因为我们使用的是 uap17 命名空间。

<uap17:Extension Category="windows.packageExtension"> 将此包标识为扩展。

属性<uap17:PackageExtension>的含义如下

特征 DESCRIPTION 必选
名称 这是扩展协定名称。 当它匹配主机中声明的 名称 时,该主机将能够找到此扩展。 ✔️
ID 唯一标识此扩展。 由于可能存在使用同一扩展合同名称的多个扩展(例如一个画图应用程序支持多个扩展),因此可以使用 ID 来区分它们。 应用扩展主机可以使用 ID 推断有关扩展类型的内容。 例如,可以将一个扩展设计为桌面,另一个扩展用于移动设备,ID 是区分器。 还可以为此使用下面讨论的 Properties 元素。 ✔️
显示名称 可以通过宿主应用向用户展示扩展。 可以从 新的资源管理系统ms-resource:TokenName)查询,并且可以使用它进行本地化。 本地化内容是从应用扩展包加载的,而不是主机应用。
说明 可用于通过主机应用向用户描述扩展。 可以从 新的资源管理系统ms-resource:TokenName)查询,并且可以使用它进行本地化。 本地化内容是从应用扩展包加载的,而不是主机应用。
PublicFolder 与包根目录相关的文件夹名称,在此文件夹中可以与扩展宿主共享内容。 按照约定,名称为“Public”,但你可以使用与扩展中的文件夹匹配的任何名称。 ✔️

<uap17:Properties> 是一个可选元素,其中包含主机可以在运行时读取的自定义元数据。 在代码示例中,扩展作为应用服务实现,因此主机需要一种方法来获取该应用服务的名称,以便它可以调用它。 应用服务的名称在<Service>元素中定义,这是我们定义的(我们可以随意命名)。 代码示例中的主机在运行时查找此属性,以了解应用服务的名称。

注解

本主题介绍包扩展。 包扩展的实现、管理和调试与应用扩展的实现、管理和调试类似,可从 此处引用。 要注意的要点是创建主机并将其标记为 Package.appxmanifest 文件、创建扩展并将其标记为 Package.appxmanifest 文件、确定如何实现扩展(例如应用服务、后台任务、COM 或 WinRT 服务器或其他方式),定义主机如何与扩展通信, 使用 PackageExtensions API 访问和管理扩展。