将资源生成到应用包而不是资源包中

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

默认情况下, (.appxbundle) 生成应用程序包 时,只有语言、缩放和 DirectX 功能级别的默认资源才会内置到应用包中。 已翻译的资源(以及针对非默认缩放和/或 DirectX 功能级别定制的资源)内置在资源包中,并且仅下载到需要它们的设备上。 如果客户使用语言首选项设置为西班牙语的设备从 Microsoft Store 购买应用,则只下载并安装应用和西班牙语资源包。 如果同一用户稍后在设置中将他们的语言首选项更改为法语,则将下载并安装应用的法语资源包。 符合缩放和 DirectX 功能级别的资源的情况也类似。 对于大多数应用,此行为构成了宝贵的效率,而这正是你和客户 想要 实现的。

但是如果应用支持用户在应用中即时(而不是通过设置)更改语言,则该默认行为并不适合使用。 你实际上希望无条件下载所有语言资源并随应用一次性安装,然后将它们保留在设备上。 你希望将所有这些资源构建到应用包而不是单独的资源包。

注意:将资源包含在应用包中本质上增加了该应用的大小。 正因如此,只有应用的性质要求时才值得执行此操作。 如果没有要求,除了像往常一样构建常规的应用程序包之外,无需执行任何操作。

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

选项 1. 使用 priconfig.packaging.xml 将资源构建到应用包

  1. 在 Visual Studio 中,将新项添加到项目。 选择 XML 文件,并将该文件命名为 priconfig.packaging.xml
  2. 在“解决方案资源管理器”中,选择 priconfig.packaging.xml 并检查“属性”窗口。 文件的“生成操作”应设置为 None,“复制到输出目录”应设置为“不要复制”。
  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>

WSL 的工作原理是怎样的?

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

使用不同的文件名而不是 priconfig.packaging.xml

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

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

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

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

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

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

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

以下是删除第一个限定符名称后的外观。

<AppxBundleAutoResourcePackageQualifiers>Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>

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

还有一个需要执行的最终步骤。 但仅在已删除 Language 限定符名称时需要执行该步骤。 你需要将应用的所有受支持语言的并集指定为应用的默认语言。 有关详细信息,请参阅指定应用使用的默认资源。 如果你在应用包中包含英语、西班牙语和法语资源,则项目文件将包含此内容。

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