Formatspezifische Indexer für „MakePri.exe“

In diesem Thema werden die formatspezifischen Indexer beschrieben, die vom MakePri.exe-Tool verwendet werden, um den Index der Ressourcen zu generieren.

Hinweis

MakePri.exe ist installiert, wenn Sie die Option Windows SDK für verwaltete UWP-Apps beim Installieren des Windows Software Development Kit markieren. Sie wird auf dem Pfad %WindowsSdkDir%bin\<WindowsTargetPlatformVersion>\x64\makepri.exe installiert (sowie in Ordnern, die für die anderen Architekturen benannt sind). Beispiel: C:\Program Files (x86)\Windows Kits\10\bin\10.0.17713.0\x64\makepri.exe.

MakePri.exe wird in der Regel mit den Befehlen new, versioned oder resourcepack verwendet. Weitere Informationen finden Sie unter Befehlszeilenoptionen für MakePri.exe. In diesen Fällen werden Quelldateien indiziert, um einen Index von Ressourcen zu generieren. MakePri.exe verwendet verschiedene einzelne Indexer, um verschiedene Quellressourcendateien oder Container für Ressourcen zu lesen. Der einfachste Indexer ist der Ordnerindexer, der den Inhalt eines Ordners indexiert, z. B. .jpg oder .png Bilder.

Sie identifizieren formatspezifische Indexer, indem Sie <indexer-config>-Elemente innerhalb eines <index>-Elements der MakePri.exe-Konfigurationsdatei angeben. Das Attribut type identifiziert den formatspezifischen Indexer, der verwendet wird.

Ressourcencontainer, die während der Indizierung gefunden werden, werden normalerweise nicht in den Index aufgenommen, sondern ihr Inhalt wird indiziert. Beispielsweise können .resjson-Dateien, die der Ordnerindexer findet, von einem .resjson-Indexer weiter indiziert werden, in diesem Fall wird die .resjson-Datei selbst nicht im Index angezeigt. Beachten Sie, dass ein <indexer-config>-Element für den indexer, der diesem Container zugeordnet ist, in der Konfigurationsdatei enthalten sein muss, damit dies geschehen kann.

In der Regel werden Qualifizierer, die für eine enthaltende Entität ( z. B. einen Ordner oder eine .resw-Datei ) gefunden werden, auf alle darin enthaltenen Ressourcen angewendet, z. B. die Dateien innerhalb des Ordners oder die Zeichenfolgen in der .resw-Datei.

Ordner

Der Ordnerindexer wird durch ein type-Attribut von FOLDER identifiziert. Er indiziert den Inhalt eines Ordners und bestimmt Ressourcenqualifizierer aus dem Ordner und Dateinamen. Das Konfigurationselement entspricht dem folgenden Schema.

<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>

Das qualifierDelimiter-Attribut gibt das Zeichen an, nach dem Qualifizierer in einem Dateinamen angegeben werden, wobei die Erweiterung ignoriert wird. Der Standardwert ist „.“.

PRI

Der PRI-Indexer wird durch ein type-Attribut von PRI identifiziert. Er indiziert den Inhalt einer PRI-Datei. Sie verwenden ihn in der Regel beim Indizieren der Ressource in einer anderen Assembly, DLL, SDK oder Klassenbibliothek in der PRI der App.

Alle Ressourcennamen, Qualifizierer und Werte, die in der PRI-Datei enthalten sind, werden direkt in der neuen PRI-Datei verwaltet. Die Ressourcenzuordnung der obersten Ebene wird jedoch nicht im endgültigen PRI verwaltet. Ressourcenzuordnungen werden zusammengeführt.

<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

Der PriInfo-Indexer wird durch ein type-Attribut von PRIINFO identifiziert. Er indiziert den Inhalt einer detaillierten Dumpdatei. Sie erstellen eine detaillierte Dumpdatei, indem Sie makepri dump mit der Option /dt detailed ausführen. Das Konfigurationselement für den Indexer entspricht dem folgenden Schema.

<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>

Mit diesem Konfigurationselement können optionale Attribute das Verhalten des PriInfo-Indexers konfigurieren. Der Standardwert von emitStrings und emitPaths ist true. Wenn emitStrings gleich true ist, werden Ressourcenkandidaten, bei denen das Attribut type auf „Zeichenfolge“ gesetzt ist, in den Index aufgenommen, andernfalls werden sie ausgeschlossen. Wenn „emitPaths“ gleich true ist, werden Ressourcenkandidaten, bei denen das Attribut type auf „Pfad“ gesetzt ist, in den Index aufgenommen, andernfalls werden sie ausgeschlossen.

Hier ist eine Beispielkonfiguration, die Zeichenfolgenressourcentypen enthält, aber Pfadressourcentypen überspringt.

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

Um indiziert zu werden, muss eine Dumpdatei mit der Erweiterung .pri.xml enden und dem folgenden Schema entsprechen.

<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 unterstützt Dumptypen „Basic“, „Detailed“, „Schema“ und „Summary“. Um MakePri.exe so zu konfigurieren, dass der Dumptyp ausgegeben wird, den der PriInfo-Indexer lesen kann, schließen Sie „/DumpType Detailed“ ein, wenn Sie den Befehl dump verwenden.

Mehrere Elemente der .pri.xml-Datei werden von MakePri.exe übersprungen. Diese Elemente werden entweder während der Indizierung berechnet oder in der MakePri.exe-Konfigurationsdatei angegeben. Ressourcennamen, Qualifizierer und Werte, die in der Dumpdatei enthalten sind, werden direkt in der neuen PRI-Datei verwaltet. Die Ressourcenzuordnung der obersten Ebene wird jedoch nicht im endgültigen PRI verwaltet. Ressourcenzuordnungen werden als Teil der Indizierung zusammengeführt.

Dies ist ein Beispiel für eine gültige Zeichenfolgentypressource aus einer Speicherabbilddatei.

<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>

Dies ist ein Beispiel für eine gültige Pfadtypressource mit zwei Kandidaten aus einer Speicherabbilddatei.

<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

Der ResFiles-Indexer wird durch das type-Attribut RESFILES identifiziert. Er indiziert den Inhalt einer .resfiles-Datei. Das Konfigurationselement entspricht dem folgenden Schema.

<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>

Eine .resfiles-Datei ist eine Textdatei, die eine flache Liste von Dateipfaden enthält. Eine .resfiles-Datei kann „//“-Kommentare enthalten. Im Folgenden sehen Sie ein Beispiel.

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

ResJSON

Der ResJSON-Indexer wird durch das type-Attribut RESJSON identifiziert. Er indiziert den Inhalt einer .resjson-Datei, bei der es sich um eine Zeichenfolgenressourcendatei handelt. Das Konfigurationselement entspricht dem folgenden Schema.

<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>

Eine .resjson-Datei enthält JSON-Text (weitere Informationen finden Sie unter Der application/json-Medientyp für JavaScript Object Notation (JSON)). Die Datei muss ein einzelnes JSON-Objekt mit hierarchischen Eigenschaften enthalten. Jede Eigenschaft muss entweder ein anderes JSON-Objekt oder ein Zeichenfolgenwert sein.

JSON-Eigenschaften mit Namen, die mit einem Unterstrich („_“) beginnen, werden nicht in die endgültige PRI-Datei kompiliert, sondern in der Protokolldatei verwaltet.

Die Datei kann auch „//“-Kommentare enthalten, die während der Analyse ignoriert werden.

Das initialPath-Attribut platziert alle Ressourcen unter diesem ursprünglichen Pfad, indem sie dem Namen der Ressource vorangestellt wird. Normalerweise verwenden Sie dies beim Indizieren von Klassenbibliotheksressourcen. Der Standardwert lautet „blank“.

ResW

Der ResW-Indexer wird durch ein type-Attribut von RESW identifiziert. Er indiziert den Inhalt einer .resw-Datei, bei der es sich um eine Zeichenfolgenressourcendatei handelt. Das Konfigurationselement entspricht dem folgenden Schema.

<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>

Eine .resw-Datei ist eine XML-Datei, die dem folgenden Schema entspricht.

  <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>

Das convertDotsToSlashes-Attribut wandelt alle Punktzeichen („.“) in Ressourcennamen (Datenelementnamenattribute) in einen Schrägstrich „/“ um, es sei denn, die Punktezeichen liegen zwischen „[“ und „]“.

Das initialPath-Attribut platziert alle Ressourcen unter diesem ursprünglichen Pfad, indem sie dem Namen der Ressource vorangestellt wird. Dies wird in der Regel beim Indizieren von Klassenbibliotheksressourcen verwendet. Der Standardwert lautet „blank“.