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。