将资源构建到应用包而不是资源包中

某些类型的应用(多语言词典、翻译工具等)需要重写应用捆绑包的默认行为,并将资源构建到应用包中,而不是将它们放在单独的资源包(或资源包中)。 本主题介绍如何执行此操作。

默认情况下,在生成 应用捆绑包(.appxbundle)时,只有用于语言、缩放及 DirectX 特性级别的默认资源会被构建到应用包中。 已翻译的资源以及专为非默认缩放和/或 DirectX 功能级别定制的资源内置于资源包中,而且它们仅下载到需要这些资源的设备上。 如果客户使用语言首选项设置为西班牙语的设备从 Microsoft Store 购买您的应用,系统将仅下载和安装您的应用及其西班牙语资源包。 如果同一用户稍后在 “设置”中将其语言首选项更改为法语,则下载并安装应用的法语资源包。 与符合缩放条件的资源以及符合 DirectX 功能级别要求的资源发生类似情况。 对于大多数应用而言,此行为是一种有价值的表现,是你和客户希望发生的。

但是,如果你的应用允许用户从应用内部(而不是通过 “设置”)动态更改语言,则默认行为不适用。 实际上,你希望一次性下载并安装所有语言资源,并将其与应用一起安装,然后保留在设备上。 你想要将所有这些资源构建到应用包中,而不是构建到单独的资源包中。

注意 在应用包中包含资源实质上会增加应用的大小。 因此,只有在应用本身的性质要求的情况下才值得这样做。 如果不是这样,你只需像往常一样构建常规应用捆绑包即可,无需做其他任何事情。

可以将 Visual Studio 配置为通过以下两种方式之一将资源构建到应用包中。 可以将配置文件添加到项目,也可以直接编辑项目文件。 无论使用哪种选项,你最熟悉还是最适合你的生成系统。

选项 1. 使用 priconfig.packaging.xml 将资源构建入您的应用包中

  1. 在 Visual Studio 中,向项目添加新项。 选择 XML 文件,并命名该文件 priconfig.packaging.xml
  2. 在解决方案资源管理器中,选择 priconfig.packaging.xml 并检查属性窗口。 文件的生成操作应设置为“无”,“复制到输出目录”应设置为“不复制”。
  3. 将文件的内容替换为此 XML。
    <packaging>
       <autoResourcePackage qualifier="Language" />
       <autoResourcePackage qualifier="Scale" />
       <autoResourcePackage qualifier="DXFeatureLevel" />
    </packaging>
    
  4. 每个 <autoResourcePackage> 元素都告知 Visual Studio 将给定限定符名称的资源自动拆分为单独的资源包。 这称为 自动拆分。 根据您目前的文件内容,实际上您尚未更改 Visual Studio 的行为。 换句话说,Visual Studio 的行为就像 此文件存在这些内容一样,因为这些内容是默认值。 如果不希望 Visual Studio 自动拆分限定符名称,请从文件中删除该 <autoResourcePackage> 元素。 如果希望将所有语言资源内置到应用包中,而不是自动拆分为单独的资源包,则文件的外观如下所示。
    <packaging>
       <autoResourcePackage qualifier="Scale" />
       <autoResourcePackage qualifier="DXFeatureLevel" />
    </packaging>
    
  5. 保存并关闭文件并重新生成项目。

为了确认自动拆分选项已被考虑,请查找文件 <ProjectFolder>\obj\<ReleaseConfiguration folder>\split.priconfig.xml 并确认其内容与你的选择是否匹配。 如果这样做,则已成功将 Visual Studio 配置为将所选资源构建到应用包中。

需要执行最后一个步骤。 但前提是删除了 Language 限定符名称。 需要将所有应用支持的语言联合指定为应用的默认语言。 有关详细信息,请参阅 指定应用使用的默认资源。 如果你在应用包中包含英语、西班牙语和法语的资源,priconfig.default.xml 将包含如下内容。

   <default>
      <qualifier name="Language" value="en;es;fr" />
      ...
   </default>

这是如何运作的?

在后台,Visual Studio 启动一个工具,名为MakePri.exe,用于生成一个称为包资源索引的文件,该文件描述了应用的所有资源,包括指示要自动拆分的资源限定符名称。 有关此工具的详细信息,请参阅 使用 MakePri.exe手动编译资源。 Visual Studio 将配置文件传递给 MakePri.exe. priconfig.packaging.xml 文件的内容用作该配置文件中的 <packaging> 元素,这是决定自动拆分的部分。 因此,添加和编辑 priconfig.packaging.xml 最终会影响 Visual Studio 为应用生成的包资源索引文件的内容,以及应用捆绑包中包的内容。

使用一个与 priconfig.packaging.xml 不同的文件名

如果命名文件 priconfig.packaging.xml,Visual Studio 将识别该文件并自动使用它。 如果为其指定了其他名称,则需要让 Visual Studio 知道。 在项目文件中,在第一个 <PropertyGroup> 元素的开始标记和结束标记之间,添加此 XML。

<AppxPriConfigXmlPackagingSnippetPath>FILE-PATH-AND-NAME</AppxPriConfigXmlPackagingSnippetPath>

将 "FILE-PATH-AND-NAME" 替换为文件的路径和名称。

选项 2. 使用项目文件将资源构建到应用包中

这是选项 1 的替代方法。 了解选项 1 的工作原理后,如果这更适合开发和/或生成工作流,则可以选择执行选项 2。

在项目文件中,在第一个 <PropertyGroup> 元素的开始标记和结束标记之间,添加此 XML。

<AppxBundleAutoResourcePackageQualifiers>Language|Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>

这就是删除第一个限定符名称后的样子。

<AppxBundleAutoResourcePackageQualifiers>Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>

保存并关闭,然后重新生成项目。

需要执行最后一个步骤。 但前提是删除了 Language 限定符名称。 需要将所有应用支持的语言联合指定为应用的默认语言。 有关详细信息,请参阅 指定应用使用的默认资源。 如果你在应用包中包含英语、西班牙语和法语的资源,项目文件将包含的内容。

<AppxDefaultResourceQualifiers>Language=en;es;fr</AppxDefaultResourceQualifiers>