Compartir a través de


ResourceManager

La clase ResourceManager proporciona un acceso cómodo a los recursos de referencias culturales en tiempo de ejecución. ResourceManager administra varios recursos desde un origen común que tiene un nombre raíz determinado. Muchos constructores de clases proporcionan compatibilidad para diferentes escenarios, como el de recuperación de recursos de ensamblados y archivos de recursos. Otro método estático diferente permite la recuperación de recursos de archivos de recursos independientes, como imágenes. La implementación predeterminada carga todos los nombres de recursos y los valores, a medida que se solicitan, y los almacena para usarlos posteriormente. Esta clase utiliza menos memoria que la clase ResourceSet (que se explica más adelante en esta sección), siempre que no todos los recursos estén cargados, ya que recuperar inicialmente un recurso específico podría llevar más tiempo. Además, la implementación predeterminada de ResourceManager permite la serialización de objetos. Finalmente, los objetos de ResourceManager permiten la búsqueda de recursos de reserva de referencias culturales neutras e independientes de la región cuando no se proporcionan recursos localizados específicos.

Ya conoce un mecanismo sencillo, con ResourceReader, para enumerar recursos. Ahora utilizará el eficaz ResourceManager para realizar aproximadamente la misma tarea.

Lista 4a. Recursos con nombre con ResourceManager (ResWrite.cs)

...
ResourceManager rm = ResourceManager. 
    CreateFileBasedResourceManager("sample", ".", null);
Console.WriteLine(rm.GetString("test1"));
Console.WriteLine(rm.GetString("test2"));
Console.WriteLine(rm.GetString("test3"));
Console.WriteLine(rm.GetString("test4"));
Console.WriteLine(rm.GetObject("test5").ToString());
...

Lista 4b. Recursos con nombre con ResourceManager (ResWrite.vb)

...
Dim rm As ResourceManager = ResourceManager. 
   CreateFileBasedResourceManager ("sample", ".", Nothing)
Console.WriteLine(rm.GetString("test1"))
Console.WriteLine(rm.GetString("test2"))
Console.WriteLine(rm.GetString("test3"))
Console.WriteLine(rm.GetString("test4"))
Console.WriteLine(rm.GetObject("test5").ToString())
...

Lo primero que se observa es el método estático CreateFileBasedResourceManager, que acepta tres argumentos: el archivo, la ubicación y si se utilizará la clase ResourceSet no predeterminada. En el código se supone que la ubicación es el directorio base de la aplicación, que se denomina AppBase. Lo siguiente que se debe observar es la facilidad con que se recuperan recursos de cadena con el método GetString de la clase ResourceManager.

También puede usar el método GetObject para recuperar un recurso de imagen. En el ejemplo anterior simplemente se escribe el valor del nombre del recurso, pero en el siguiente se usan dos líneas de código (que proceden del archivo de ejemplo Graphic.cs) con el fin de explicar cómo se utiliza este método para recuperar y mostrar una imagen gráfica:

rm = new ResourceManager("Images", this.GetType().Assembly);
pictureBox1.Image = (System.Drawing.Image)rm.GetObject("flag");

A continuación, se muestra el código equivalente en Visual Basic del archivo de ejemplo Graphic.vb:

rm = New ResourceManager("Images", Me.GetType().Assembly)
pictureBox1.Image = CType(rm.GetObject("flag"), System.Drawing.Image)

En las dos instrucciones anteriores se carga el objeto denominado flag del archivo de recursos Images, se convierte en un tipo Image y se asigna el resultado a la propiedad Image del cuadro de imagen. Es evidente que lo que se cargue realmente dependerá de la referencia cultural que se esté utilizando. Los recursos de referencias culturales neutras proceden de lo que se haya especificado en la opción del compilador, como se muestra a continuación:

.../res:Images.resources,Images.resources...

En este caso en particular, la opción del compilador incrustaba el archivo Un.jpg. Para otras referencias culturales, el mapa de bits se incrustó en el ensamblado satélite correspondiente durante el proceso de generación.

La clase ResourceManager funciona con cualquier dato serializable, es decir, las clases que están marcadas con el atributo Serializable y que admiten la interfaz ISerializable. Los tipos integrados incluyen el tipo Image (y los tipos derivados Bitmap, Icon, Cursor y Metafile), así como los tipos de cadena. Observe que en los parámetros de cadena de ResourceManager se distinguen mayúsculas y minúsculas, lo que significa que en los nombres de los archivos de recursos y las claves de los recursos también se distinguen mayúsculas y minúsculas.

Los archivos pueden estar en subdirectorios o en archivos de recursos, o se pueden empaquetar en ensamblados. Para localizar un recurso en un ensamblado, ResourceManager obtiene el nombre del ensamblado que se ejecuta, agrega ".resources" y su propio número de versión Principal.Secundaria, agrega la configuración regional actual, agrega el hash de clave de firma del ensamblado ejecutado y solicita a la caché de ensamblado que localice este ensamblado. Para consultar la explicación de una herramienta útil para realizar el seguimiento de solicitudes de enlace de la caché de ensamblados, vea la documentación de la herramienta Visor de registro de enlaces de ensamblados (FusLogVW) en Apéndice B: Herramientas de recursos.

**Nota   **Si decide implementar recursos independientes en archivos individuales y ejecuta una aplicación Web, puede sufrir el bloqueo de los archivos por parte de los Servicios de Microsoft Internet Information Server (IIS), que le impedirán actualizar los archivos de recursos mientras se ejecuta la aplicación. Si, en cambio, coloca los recursos en ensamblados satélite en el subdirectorio \bin de la aplicación, el mecanismo de copia en segundo plano de IIS garantizará que los nuevos recursos se cargan automáticamente al crear un nuevo dominio de aplicación para controlar las siguientes solicitudes Web.