Compartir a través de


Indexadores específicos del formato de MakePri.exe

En este tema se describen los indexadores específicos del formato que usa la herramienta MakePri.exe para generar su índice de recursos.

Nota:

MakePri.exe se instala al comprobar la opción Windows SDK para aplicaciones administradas UWP al instalar el Kit de desarrollo de software de Windows. Se instala en la ruta de acceso %WindowsSdkDir%bin\<WindowsTargetPlatformVersion>\x64\makepri.exe (así como en carpetas denominadas para las demás arquitecturas). Por ejemplo, C:\Program Files (x86)\Windows Kits\10\bin\10.0.17713.0\x64\makepri.exe.

MakePri.exe se usa normalmente con los comandos new, versioned o resourcepack. Consulte Opciones de línea de comandos de MakePri.exe. En esos casos, indexa los archivos de origen para generar un índice de recursos. MakePri.exe usa varios indexadores individuales para leer diferentes archivos de recursos de origen o contenedores para recursos. El indexador más sencillo es el indexador de carpetas, que indexa el contenido de una carpeta, como imágenes .jpg o .png.

Los indexadores específicos del formato se identifican especificando elementos <indexer-config> dentro de un elemento <index> del archivo de configuración MakePri.exe. El atributo type identifica el indexador específico del formato que se usa.

Los contenedores de recursos encontrados durante la indexación suelen obtener su contenido indexado en lugar de agregarse al propio índice. Por ejemplo, los archivos .resjson que el indexador de carpetas encuentra pueden indizarse posteriormente por un indexador .resjson, en cuyo caso el propio archivo .resjson no aparece en el índice. Tenga en cuenta que un elemento <indexer-config> para el indexador asociado a ese contenedor debe incluirse en el archivo de configuración para que esto suceda.

Normalmente, los calificadores que se encuentran en una entidad contenedora (como una carpeta o un archivo .resw) se aplican a todos los recursos que contiene, como los archivos de la carpeta o las cadenas del archivo .resw.

Carpeta

El indexador de carpetas se identifica mediante un atributo type de FOLDER. Indexa el contenido de una carpeta y determina los calificadores de recursos de la carpeta y los nombres de archivo. Su elemento de configuración se ajusta al esquema siguiente.

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

El atributo qualifierDelimiter especifica el carácter después del cual se especifican calificadores en un nombre de archivo, omitiendo la extensión. El valor predeterminado es ".".

PRI

El indexador PRI se identifica mediante un atributo type de PRI. Indexa el contenido de un archivo PRI. Normalmente se usa al indexar el recurso contenido en otro ensamblado, DLL, SDK o biblioteca de clases en el PRI de la aplicación.

Todos los nombres de recursos, calificadores y valores contenidos en el archivo PRI se mantienen directamente en el nuevo archivo PRI. Sin embargo, el mapa de recursos de nivel superior no se mantiene en el PRI final. Los mapas de recursos se combinan.

<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

El indexador PriInfo se identifica mediante un atributo type de PRIINFO. Indexa el contenido de un archivo de volcado detallado. Para generar un archivo de volcado detallado, ejecute makepri dump con la opción /dt detailed. El elemento de configuración del indexador se ajusta al esquema siguiente.

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

Este elemento de configuración permite que los atributos opcionales configuren el comportamiento del indexador PriInfo. El valor predeterminado de emitStrings y emitPaths es true. Si emitStrings es true entonces los candidatos de recursos con el atributo type establecido en "String" se incluyen en el índice; de lo contrario, se excluyen. Si "emitPaths" es true, los candidatos de recursos con el atributo type establecido en "Path" se incluyen en el índice; de lo contrario, se excluyen.

Esta es una configuración de ejemplo que incluye tipos de recursos String, pero omite los tipos de recursos Path.

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

Para indizarse, un archivo de volcado de memoria debe terminar con la extensión .pri.xml y debe cumplir con el esquema siguiente.

<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 admite tipos de volcado de memoria "Basic", "Detailed", "Schema" y "Summary". Para configurar MakePri.exe para emitir el tipo de volcado de memoria que el indexador PriInfo puede leer, incluya "/DumpType Detailed" al usar el comando dump.

MakePri.exe omite varios elementos del archivo .pri.xml. Estos elementos se calculan durante la indexación o se especifican en el archivo de configuración MakePri.exe. Los nombres de recursos, los calificadores y los valores contenidos en el archivo de volcado se mantienen directamente en el nuevo archivo PRI. Sin embargo, el mapa de recursos de nivel superior no se mantiene en el PRI final. Los mapas de recursos se combinan como parte de la indexación.

Este es un ejemplo de un recurso de tipo String válido de un archivo de volcado de memoria.

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

Este es un ejemplo de un recurso de tipo Path válido con dos candidatos de un archivo de volcado de memoria.

<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

El indexador ResFiles se identifica mediante un atributo type de RESFILES. Indexa el contenido de un archivo .resfiles. Su elemento de configuración se ajusta al esquema siguiente.

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

Un archivo .resfiles es un archivo de texto que contiene una lista plana de rutas de acceso de archivo. Un archivo .resfiles puede contener comentarios "//". Por ejemplo:

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

ResJSON

El indexador ResJSON se identifica mediante un atributo type de RESJSON. Indexa el contenido de un archivo .resjson, que es un archivo de recursos de cadena. Su elemento de configuración se ajusta al esquema siguiente.

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

Un archivo .resjson contiene texto JSON (consulte El tipo de medio application/json para JavaScript Object Notation (JSON)). El archivo debe contener un único objeto JSON con propiedades jerárquicas. Cada propiedad debe ser otro objeto JSON o un valor de cadena.

Las propiedades JSON con nombres que comienzan con un carácter de subrayado ("_") no se compilan en el archivo PRI final, pero se mantienen en el archivo de registro.

El archivo también puede contener comentarios "//" que se omiten durante el análisis.

El atributo initialPath coloca todos los recursos en esta ruta de acceso inicial anteponiéndola al nombre del recurso. Normalmente lo usaría al indexar los recursos de la biblioteca de clases. El valor predeterminado es en blanco.

ResW

El indexador ResW se identifica mediante un atributo type de RESW. Indexa el contenido de un archivo .resw, que es un archivo de recursos de cadena. Su elemento de configuración se ajusta al esquema siguiente.

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

Un archivo .resw es un archivo XML que se ajusta al esquema siguiente.

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

El atributo convertDotsToSlashes convierte todos los caracteres de punto (".") que se encuentran en los nombres de recursos (atributos de nombre de elemento de datos) en una barra diagonal "/", excepto cuando los caracteres de punto están entre "[" y "]".

El atributo initialPath coloca todos los recursos en esta ruta de acceso inicial anteponiéndola al nombre del recurso. Normalmente se usa al indexar los recursos de la biblioteca de clases. El valor predeterminado es en blanco.