将资源构建到应用包而不是资源包中
某些类型的应用(多语言词典、翻译工具等)需要重写应用捆绑包的默认行为,并将资源构建到应用包中,而不是将它们放在单独的资源包(或资源包中)。 本主题介绍了如何执行该操作。
默认情况下,生成 应用捆绑包(.appxbundle)时,只有语言、缩放和 DirectX 功能级别的默认资源内置到应用包中。 已翻译的资源(以及专为非默认缩放和/或 DirectX 功能级别定制的资源)内置于资源包中,并且它们仅下载到需要它们的设备上。 如果客户使用语言首选项设置为西班牙语的设备从 Microsoft Store 购买应用,则仅下载并安装西班牙语资源包的应用。 如果同一用户稍后在“设置”中将其语言首选项更改为法语,则下载并安装应用的法语资源包。 与符合缩放条件的资源和 DirectX 功能级别发生类似情况。 对于大多数应用而言,此行为是一种有价值的效率,这是你和客户 想要 执行的操作。
但是,如果你的应用允许用户从应用内部(而不是通过 “设置”)动态更改语言,则默认行为不适用。 实际上,你希望一次性下载并安装所有语言资源,并将其与应用一起安装,然后保留在设备上。 你想要将所有这些资源构建到应用包中,而不是构建到单独的资源包中。
请注意 ,在应用包中包含资源实质上会增加应用的大小。 这就是为什么当应用的性质要求它时,它才值得这样做。 否则,除了像往常一样构建常规应用捆绑包之外,无需执行任何操作。
可以将 Visual Studio 配置为通过以下两种方式之一将资源构建到应用包中。 可以将配置文件添加到项目,也可以直接编辑项目文件。 无论使用哪种选项,你最熟悉还是最适合你的生成系统。
选项 1. 使用priconfig.packaging.xml将资源构建到应用包中
- 在 Visual Studio 中,将新项添加到项目。 选择 XML 文件,并将该文件命名为
priconfig.packaging.xml
。 - 在“解决方案资源管理器”中,选择
priconfig.packaging.xml
并检查“属性”窗口。 文件的“生成操作”应设置为 None,“复制到输出目录”应设置为“不要复制”。 - 将文件的内容替换为此 XML。
<packaging> <autoResourcePackage qualifier="Language" /> <autoResourcePackage qualifier="Scale" /> <autoResourcePackage qualifier="DXFeatureLevel" /> </packaging>
- 每个
<autoResourcePackage>
元素都告知 Visual Studio 将给定限定符名称的资源自动拆分为单独的资源包。 这称为 自动拆分。 就目前拥有的文件内容来说,实际上尚未更改 Visual Studio 的行为。 换句话说,Visual Studio 的行为就像此文件存在这些内容一样 ,因为这些内容是默认值。 如果不希望 Visual Studio 自动拆分限定符名称,请从文件中删除该<autoResourcePackage>
元素。 如果希望将所有语言资源内置到应用包中,而不是自动拆分为单独的资源包,则文件的外观如下所示。<packaging> <autoResourcePackage qualifier="Scale" /> <autoResourcePackage qualifier="DXFeatureLevel" /> </packaging>
- 保存并关闭该文件,然后重新构建项目。
若要确认要考虑自动拆分选项,请查找该文件 <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>