Compartir a través de


Recursos de cadenas

Para crear recursos de cadenas, basta con realizar estos tres pasos:

  1. Crear un archivo de texto que contenga una entrada de nombre y valor para cada cadena.

  2. Convertir el archivo de texto en un archivo de recursos con Resgen.exe.

  3. Crear una biblioteca DLL e incrustar el archivo de recursos con la herramienta Generación de ensamblados (AL) o uno de los compiladores de lenguaje que se suministra con .NET Framework SDK.

    Nota Para obtener más información acerca de AL, vea Apéndice B: Herramientas de recursos.

Si las cadenas están localizadas en referencias culturales que no son las predeterminadas, debe seguir los tres pasos anteriores para cada una de las referencias culturales así como para una referencia cultural, neutra y predeterminada. También debe especificar la referencia cultural al utilizar AL.

Lista 1. Ejemplo de archivo de texto de cadenas (MyStrings.txt)

; Sample strings for the calculator – Default locale
;
Math_Greeting = Welcome – Integer Calculator
Math_Formula_Label = Formula and Results:
Math_Clear_Button = Clear
Math_Calc_Button = Calculate
Math_Calc_Error = Invalid Formula. Please try again.

El programa Resgen.exe realiza conversiones entre los tres formatos de archivo de recursos: cadenas (archivo .txt), recursos XML (archivo .resx) y compilados (archivo .resources). Para compilar el archivo de recursos MyStrings.txt, use la siguiente línea de comandos con el fin de generar un archivo intermedio y compilado que contenga varios recursos:

resgen MyStrings.txt MyStrings.resources

En este punto, tiene tres opciones de empaquetado: incrustar los recursos en el ensamblado ejecutable, crear ensamblados satélite que solamente contengan los recursos o dejar los recursos en el archivo de recursos y tener acceso a los mismos directamente. La última opción se utiliza sobre todo para herramientas; las verdaderas aplicaciones deben utilizar ensamblados para aprovechar las ventajas de la comprobación de firmas y versiones.

En muchas aplicaciones, particularmente en las que no están localizadas, basta con incrustar los recursos en el ensamblado ejecutable. Esto se realiza en tiempo de compilación con el modificador /res y la sintaxis siguiente:

(csc|vbc) ... /out:WorldCalc.exe /res:MyStrings.resources WorldCalc.cs

Nota Para lograr una claridad mayor, en la línea anterior se omitieron los parámetros /target, /addmodule, /a y /r.

La línea de comandos anterior compila WorldCalc.cs en WorldCalc.exe e incrusta los recursos del archivo MyStrings.resources. Si hubiera deseado colocar los recursos en una DLL independiente, podría haber usado una línea de comandos como la siguiente:

al /out:WorldCalc.Resources.DLL /embed:MyStrings.resources,MyStrings.resources,Private

El parámetro /embed utiliza la sintaxis siguiente:

/embed:<filename>[,<name>[,Private]

Estos parámetros se describen en la tabla siguiente.

  • <filename>: nombre del archivo .resources.

  • <name>: nombre interno de los recursos. Normalmente se utiliza al construir un ResourceManager. Suele incluir un espacio de nombres.

  • Private: especifica si los recursos son visibles para los demás ensamblados. El valor predeterminado es no.

    Nota Puede usar el parámetro /link en lugar de /embed. De esta forma se genera la biblioteca DLL de ensamblado de recursos (que contiene el manifiesto), pero se incluye un vínculo al archivo .resources en lugar de incrustar los propios recursos.

Crear recursos mediante código

Puede usar código para crear directamente archivos .resource. Esta técnica resulta útil al automatizar la generación de los recursos con el formato apropiado, específicamente, cuando los recursos están almacenados en una base de datos o se han migrado desde un sistema diferente por ejemplo, uno que utiliza tablas de recursos de cadena anteriores de Win32. Para crear un archivo de recursos, se crea un ResourceWriter con un nombre de archivo único, se llama a AddResource al menos una vez y, a continuación, se llama a Close (que implícitamente llama a Generate) para cerrar el archivo. En el pequeño programa siguiente se ilustra cómo utilizar ResourceWriter para crear un archivo de recursos con cinco entradas.

Lista 2a. Crear y leer archivos de recursos (ResWrite.cs)

using System;
using System.Collections;
using System.Resources;

class MainApp {
   public static void Main() {
      // First create the resource file and add strings.
      IResourceWriter rw = new ResourceWriter("sample.resources");
      rw.AddResource("test1", "one");
      rw.AddResource("test2", "two");
      rw.AddResource("test3", "three");
      rw.AddResource("test4", "four");
      rw.AddResource("test5", 512341234);
      rw.Close();
      ...
   }
}

Lista 2b. Crear y leer archivos de recursos (ResWrite.vb)

Imports System
Imports System.Collections
Imports System.Resources

Class MainApp
    
   Public Shared Sub Main()
      ' First create the resource file and add strings.
      Dim rw As ResourceWriter = New ResourceWriter("sample.resources")
      rw.AddResource("test1", "one")
      rw.AddResource("test2", "two")
      rw.AddResource("test3", "three")
      rw.AddResource("test4", "four")
      rw.AddResource("test5", 512341234)
      rw.Close()
      ...
   End Sub
End Class

Nota Debe asignarlo a IResourceWriter para asegurarse de que el código funciona con otras clases ResourceWriter que admitan las mismas interfaces.

La forma más sencilla de recuperar los recursos de un archivo consiste en iterarlos con la clase ResourceReader. Según el código anterior, el código mínimo necesario para enumerar los recursos escritos es el siguiente (que se ha tomado de los archivos de programa ResWrite.cs y ResWrite.vb):

Lista 3a. Recorrer el archivo con ResourceReader (ResWrite.cs)

      ...
      // Iterate through the resources.
      IResourceReader rr = new ResourceReader("sample.resources");
      IDictionaryEnumerator de = rr.GetEnumerator();
      while (de.MoveNext()) {
            Console.WriteLine(de.Key + " " + de.Value);
      }
      rr.Close();
      ...

Lista 3a. Recorrer el archivo con ResourceReader (ResWrite.vb)

      ...
      ' Iterate through the resources.
      Dim rr As ResourceReader = New ResourceReader("sample.resources")
      Dim de As IDictionaryEnumerator = rr.GetEnumerator()
      While de.MoveNext()
         Console.WriteLine((de.Key.ToString() + " " + de.Value.ToString()))
      End While
      rr.Close()
      ...

En este pequeño ejemplo, primero creó ResourceReader para el mismo archivo de recursos creado anteriormente. Como hizo al escribir los recursos, lo asignó a IResourceReader para tener más flexibilidad. A continuación, usó DictionaryEnumerator para recorrer los recursos e imprimir el nombre del recurso y su valor correspondiente en la consola.

Aunque utilizar directamente ResourceReader le permite enumerar los recursos, no le permite recuperar directamente recursos concretos al especificar una entrada con nombre. Puede usar el eficaz ResourceManager de la sección Recuperar recursos mediante código para llevarlo a cabo.

Vea también

Recursos de imagen | Empaquetar recursos | Recuperar recursos mediante código | Resumen de recursos | Apéndice A: Información adicional de recursos | Apéndice B: Herramientas de recursos