次の方法で共有


MakePri.exe の形式に固有のインデクサー

このトピックでは、リソースのインデックスを生成するために MakePri.exe ツールによって使われる形式に固有のインデクサーについて説明します。

注意

MakePri.exe は、Windows ソフトウェア開発キットのインストール時に Windows SDK for UWP Managed Apps オプションをオンにするとインストールされます。 パス %WindowsSdkDir%bin\<WindowsTargetPlatformVersion>\x64\makepri.exe (および他のアーキテクチャ用に指定されたフォルダー) にインストールされます。 たとえば、「 C:\Program Files (x86)\Windows Kits\10\bin\10.0.17713.0\x64\makepri.exe 」のように入力します。

MakePri.exe は、通常、newversioned、または resourcepack コマンドで使用されます。 「MakePri.exe のコマンド ライン オプション」を参照してください。 このような場合は、リソースのインデックスを生成するためにソース ファイルのインデックスが作成されます。 MakePri.exe では、さまざまな個々のインデクサーを使用して、リソースの異なるソース リソース ファイルまたはコンテナーを読み取ります。 最もシンプルなインデクサーはフォルダー インデクサーで、フォルダーの内容 (.jpg.png 画像など) にインデックスが付けられます。

形式固有のインデクサーを識別するには、MakePri.exe 構成ファイル<index> 要素内で <indexer-config> 要素を指定します。 type 属性では、使用される形式固有のインデクサーが識別されます。

インデックス作成中に検出されたリソース コンテナーは、通常、インデックス自体に追加されるのではなく、その内容のインデックスが作成されます。 たとえば、フォルダー インデクサーで検出された .resjson ファイルは、.resjson インデクサーによってさらにインデックスが作成される場合があります。その場合、.resjson ファイル自体はインデックスに表示されません。 その場合は、そのコンテナーに関連付けられているインデクサーの 要素を構成ファイルに含める必要があることに注意<indexer-config>してください。

通常、フォルダーや .resw ファイルなどのコンテナー エンティティで検出された修飾子は、コンテナー エンティティ内のすべてのリソース (フォルダー内のファイルや .resw ファイル内の文字列など) に適用されます。

Folder

フォルダー インデクサーは、FOLDER の type 属性によって識別されます。 フォルダーの内容のインデックスが作成され、フォルダーとファイル名からリソース修飾子が判断されます。 その構成要素は、次のスキーマに準拠しています。

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="ExclusionTypeList">
        <xs:restriction base="xs:string">
            <xs:enumeration value="path"/>
            <xs:enumeration value="extension"/>
            <xs:enumeration value="name"/>
            <xs:enumeration value="tree"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="FolderExclusionType">
        <xs:attribute name="type" type="ExclusionTypeList" use="required"/>
        <xs:attribute name="value" type="xs:string" use="required"/>
        <xs:attribute name="doNotTraverse" type="xs:boolean" use="required"/>
        <xs:attribute name="doNotIndex" type="xs:boolean" use="required"/>
    </xs:complexType>
    <xs:simpleType name="IndexerConfigFolderType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((f|F)(o|O)(l|L)(d|D)(e|E)(r|R))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="exclude" type="FolderExclusionType" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="type" type="IndexerConfigFolderType" use="required"/>
            <xs:attribute name="foldernameAsQualifier" type="xs:boolean" use="required"/>
            <xs:attribute name="filenameAsQualifier" type="xs:boolean" use="required"/>
            <xs:attribute name="qualifierDelimiter" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

qualifierDelimiter 属性では、拡張子を無視して、ファイル名に修飾子を指定する文字を指定します。 既定値は "." です。

PRI

PRI インデクサーは、PRI の type 属性によって識別されます。 PRI ファイルの内容のインデックスが作成されます。 通常は、別のアセンブリ、DLL、SDK、またはクラス ライブラリに含まれるリソースのインデックスをアプリの PRI に作成するときに使用します。

PRI ファイルに含まれるすべてのリソース名、修飾子、および値は、新しい PRI ファイルで直接保持されます。 しかし、最上位レベルのリソース マップは最終的な PRI では保持されません。 リソース マップはマージされます。

<xs:schema id="prifile" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="IndexerConfigPriType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((p|P)(r|R)(i|I))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:attribute name="type" type="IndexerConfigPriType" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

PriInfo

PriInfo インデクサーは、PRIINFO の type 属性によって識別されます。 詳細なダンプ ファイルの内容のインデックスが作成されます。 詳細なダンプ ファイルを生成する場合は、/dt detailed オプションを指定して makepri dump を実行します。 インデクサーの構成要素は、次のスキーマに準拠しています。

<xs:schema id="priinfo" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:simpleType name="IndexerConfigPriInfoType">
    <xs:restriction base="xs:string">
      <xs:pattern value="((p|P)(r|R)(i|I)(i|I)(n|N)(f|F)(o|O))"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="indexer-config">
    <xs:complexType>
      <xs:attribute name="type" type="IndexerConfigPriInfoType" use="required"/>
      <xs:attribute name="emitStrings" type="xs:boolean" use="optional"/>
      <xs:attribute name="emitPaths" type="xs:boolean" use="optional"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

この構成要素では、省略可能な属性で PriInfo インデクサーの動作を構成できます。 emitStringsemitPaths の既定値は true です。 emitStringstrue の場合、type 属性が "String" に設定されたリソース候補がインデックスに含まれ、それ以外の場合は除外されます。 'emitPaths' が true の場合、type 属性が "Path" に設定されたリソース候補がインデックスに含まれます。それ以外の場合は除外されます。

String リソースの種類を含むが、パス リソースの種類をスキップする構成例を以下に示します。

<indexer-config type="priinfo" emitStrings="true" emitPaths="false" />

インデックスを作成するには、ダンプ ファイルが拡張子 .pri.xml で終わる必要があり、次のスキーマに準拠している必要があります。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" >
  <xs:simpleType name="candidateType">
    <xs:restriction base="xs:string">
      <xs:pattern value="Path|String"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="scopeType">
    <xs:sequence>
      <xs:element name="ResourceMapSubtree" type="scopeType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="NamedResource" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Decision" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
                <xs:anyAttribute processContents="skip" />
              </xs:complexType>
            </xs:element>
            <xs:element name="Candidate" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="QualifierSet" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="Qualifier" minOccurs="0" maxOccurs="unbounded">
                          <xs:complexType>
                            <xs:attribute name="name" type="xs:string" use="required" />
                            <xs:attribute name="value" type="xs:string" use="required" />
                            <xs:attribute name="priority" type="xs:integer" use="required" />
                            <xs:attribute name="scoreAsDefault" type="xs:decimal" use="required" />
                            <xs:attribute name="index" type="xs:integer" use="required" />
                          </xs:complexType>
                        </xs:element>
                      </xs:sequence>
                      <xs:anyAttribute processContents="skip" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Value" type="xs:string"  minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
                <xs:attribute name="type" type="candidateType" use="required" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="name" use="required" type="xs:string" />
          <xs:anyAttribute processContents="skip" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" use="required" type="xs:string" />
    <xs:anyAttribute processContents="skip" />
  </xs:complexType>
  <xs:element name="PriInfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="PriHeader" >
          <xs:complexType>
            <xs:sequence>
              <xs:any minOccurs ="0" maxOccurs="unbounded" processContents="skip" />
            </xs:sequence>
            <xs:anyAttribute processContents="skip" />
          </xs:complexType>
        </xs:element>
        <xs:element name="QualifierInfo">
          <xs:complexType>
            <xs:sequence>
              <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="ResourceMap">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="VersionInfo">
                <xs:complexType>
                  <xs:anyAttribute processContents="skip" />
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" maxOccurs="unbounded" name="ResourceMapSubtree" type="scopeType" />
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="required" />
            <xs:anyAttribute processContents="skip" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

MakePri.exe では、'Basic'、'Detailed'、'Schema'、および 'Summary' というダンプの種類がサポートされています。 PriInfo インデクサーで読み取ることができるダンプの種類を出力するように MakePri.exe を構成するには、dump コマンドの使用時に "/DumpType Detailed" を含めます。

.pri.xml ファイルのいくつかの要素は MakePri.exe によってスキップされます。 これらの要素は、インデックス作成中に計算されるか、MakePri.exe 構成ファイルで指定されます。 ダンプ ファイル内に含まれるリソース名、修飾子、および値は、新しい PRI ファイルで直接保持されます。 しかし、最上位レベルのリソース マップは最終的な PRI では保持されません。 リソース マップは、インデックス作成の一部としてマージされます。

これは、ダンプ ファイルの有効な String 型リソースの例です。

<NamedResource name="SampleString " index="96" uri="ms-resource://SampleApp/resources/SampleString ">
  <Decision index="2">
    <QualifierSet index="1">
      <Qualifier name="Language" value="EN-US" priority="900" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
  </Decision>
  <Candidate type="String">
    <QualifierSet index="1">
      <Qualifier name="Language" value="EN-US" priority="900" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
    <Value>A Sample String Value</Value>
  </Candidate>
</NamedResource>

これは、ダンプ ファイルの 2 つの候補を含む有効な Path 型リソースの例です。

<NamedResource name="Sample.png" index="77" uri="ms-resource://SampleApp/Files/Images/Sample.png">
  <Decision index="2">
    <QualifierSet index="1">
      <Qualifier name="Scale" value="180" priority="500" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
    <QualifierSet index="2">
      <Qualifier name="Scale" value="140" priority="500" scoreAsDefault="0.7" index="2"/>
    </QualifierSet>
  </Decision>
  <Candidate type="Path">
    <QualifierSet index="1">
      <Qualifier name="Scale" value="180" priority="500" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
    <Value>Images\Sample.scale-180.png</Value>
  </Candidate>
  <Candidate type="Path">
    <QualifierSet index="2">
      <Qualifier name="Scale" value="140" priority="500" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
    <Value>Images\Sample.scale-140.png</Value>
  </Candidate>
</NamedResource>

ResFiles

ResFiles インデクサーは、RESFILES の type 属性によって識別されます。 .resfiles ファイルの内容のインデックスが作成されます。 その構成要素は、次のスキーマに準拠しています。

<xs:schema id="resx" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="IndexerConfigResFilesType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((r|R)(e|E)(s|S)(f|F)(i|I)(l|L)(e|E)(s|S))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:attribute name="type" type="IndexerConfigResFilesType" use="required"/>
            <xs:attribute name="qualifierDelimiter" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

.resfiles ファイルは、ファイル パスのフラット リストを含むテキスト ファイルです。 .resfiles ファイルには、"//" コメントを含めることができます。 次に例を示します。

Strings\component1\fr\elements.resjson
Images\logo.scale-100.png
Images\logo.scale-140.png
Images\logo.scale-180.png

ResJSON

ResJSON インデクサーは、RESJSON の type 属性によって識別されます。 .resjson ファイル (文字列リソース ファイル) の内容のインデックスが作成されます。 その構成要素は、次のスキーマに準拠しています。

<xs:schema id="resjson" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="IndexerConfigResJsonType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((r|R)(e|E)(s|S)(j|J)(s|S)(o|O)(n|N))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:attribute name="type" type="IndexerConfigResJsonType" use="required"/>
            <xs:attribute name="initialPath" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

.resjson ファイルには JSON テキストが含まれています (「JavaScript Object Notation (JSON) のアプリケーション/json メディアの種類」を参照してください)。 ファイルには、階層プロパティがある単一の JSON オブジェクトが含まれている必要があります。 各プロパティは、別の JSON オブジェクトまたは文字列値である必要があります。

名前がアンダースコア ("_") で始まる JSON プロパティは、最終的な PRI ファイルにはコンパイルされませんが、ログ ファイルで保持されます。

ファイルには、解析中に無視される "//" コメントを含めることもできます。

initialPath 属性では、リソースの名前の前に指定することで、すべてのリソースがこの初期パスの下に配置されます。 これは通常、クラス ライブラリ リソースのインデックスを作成するときに使用します。 既定値は空白です。

ResW

ResW インデクサーは、RESW の type 属性によって識別されます。 .resw ファイル (文字列リソース ファイル) の内容のインデックスが作成されます。 その構成要素は、次のスキーマに準拠しています。

<xs:schema id="resw" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="IndexerConfigResxType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((r|R)(e|E)(s|S)(w|W))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:attribute name="type" type="IndexerConfigResxType" use="required"/>
            <xs:attribute name="convertDotsToSlashes" type="xs:boolean" use="required"/>
            <xs:attribute name="initialPath" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

.resw ファイルは、次のスキーマに準拠する XML ファイルです。

  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>

convertDotsToSlashes 属性では、ドット文字が "[" と "]".の間にある場合を除き、リソース名 (データ要素名属性) で見つかったすべてのドット (".") 文字をスラッシュ "/" に変換します。

initialPath 属性では、リソースの名前の前に指定することで、すべてのリソースがこの初期パスの下に配置されます。 これは通常、クラス ライブラリ リソースのインデックスを作成するときに使用します。 既定値は空白です。