MRM 中的资源名称
MRM 中每个资源都有一个名称。 资源名称是符合 IETF RFC 3986 的 URI。
MRM 中的资源名称采用以下形式:
ms-resource://<PackageFamilyName>/<Root>/<Rest...>
其中:
ms-resource
是方案。<PackageFamilyName>
是颁发机构,是将使用资源的应用的包系列名称,或者是未打包应用的文本字符串"Application"
。<Root>
是单个路径段。<Rest...>
是由斜线分隔的一个或多个其他路径段。
不允许使用 URI 的查询和片段部分。
为简洁起见,本文档通常引用资源名称而不使用方案或权限(例如"strings/foo"或仅使用"foo")。
事例敏感性
尽管方案 ms-resource
区分大小写,但路径不区分大小写。
以下各项均相等:
ms-resource:///FILES/LOGO.PNG
ms-resource:///files/logo.png
ms-resource:///FiLeS/LoGo.PnG
但以下都是错误:
MS-RESOURCE:///files/logo.png
Ms-Resource:///files.logo.png
如果不同的资源候选项使用不同的大小写,则 PRI 文件中出现的大小写与实现相关。 这并不重要,因为运行时资源查找也是不区分大小写的。
颁发机构
为方便起见,MRM 允许资源 URI 在将资源添加到索引器时省略 <PackageFamilyName>
。 此外,MRM 允许指定任何有效的颁发机构作为 <PackageFamilyName>
,但在创建资源索引器时,它将替换为指定为 packageFamilyName 的值(有关详细信息,请参阅 MrmCreateResourceIndexer)。
例如,假设资源索引器是使用 "MyApp"
的 packageFamilyName 创建的,则以下所有资源 URI 都是等效的:
ms-resource://MyApp/strings/foo // Canonical form.
ms-resource:///strings/foo // Omit the PFN.
ms-resource://App2/strings/foo // PFN "App2" is ignored.
路径
如上述简化语法所示,MRM 中的所有资源名称必须至少有两个路径段 <Root>
和 <Rest...>
。 在资源名称中具有单个路径段或用斜杠结束资源名称是错误的。 以下是错误:
ms-resource///hello // Error, only one path segment
ms-resource///strings/hello/ // Error, ends with a slash
除了对 URI 总长度的限制(通常约为 2,000 个字符)之外,对可以拥有的路径段数没有实际限制。 以下是有效的资源名称:
ms-resource:///strings/hello
ms-resource:///files/assets/logo.png
ms-resource:///food/baked/muffins/lemon.and.blueberry/gluten_free
约定
尽管不需要,但 PRI 文件中使用了以下约定。
- 字符串资源将添加到“strings”
<RootPath>
。 - 文件资源将添加到“文件”
<RootPath>
。 - 容器资源(例如
resw
文件中的资源)将添加到“资源”<RootPath>
。
请注意,XAML 本地化依赖于“资源”约定(有关详细信息,请参阅 x:Uid 指令),其他库也可能依赖于这些约定。
库的命名资源
将 PRI 文件构建为可重新分发库的一部分时,请务必选择不太可能与父应用的名称(或其他库)冲突的资源名称。 这是因为应用的所有资源(包括依赖库的资源)在生成时合并到单个 PRI 文件中 - 有关详细信息,请参阅 MrmIndexResourceContainerAutoQualifiers。 如果主应用及其一个库(或两个库)使用相同的资源名称,则生成 PRI 时将发生错误。
若要避免这种情况,请考虑将资源命名为包含唯一段的路径,例如公司的反向 DNS 名称或 GUID。