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

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

默认情况下,生成 应用捆绑包(.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.exe。 文件的内容 priconfig.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。

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

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

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

<AppxBundleAutoResourcePackageQualifiers>Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>

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

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

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