Está en la página 1de 12

Entendiendo ensamblados de recursos (Satellite Assemblies) usando MonoDevelop

por Martin Marquez <xomalli@gmail.com> Introduccin Una de las caracteristicas mas atractivas que .NET ofrece para el desarrollo de software es la capacidad de crear componentes en diferentes lenguajes de programacin, esto es posible por que el objetivo de cada compilador existente para .NET es producir un assembly (ensamblado) el cual por definicin es: La unidad funcional de distribuicin, versionamiento y de identidad de la plataforma .NET. Adems de clasificar los assemblies en Strong-Named o privados dependiendo de su instalacin o en SingleFile y Multi-File si contienen un archivo o varios, pueden tambin clasificarse en base a su contenido en donde tenemos a los ensamblados que contienen cdigo MSIL y recursos (imagenes, traducciones o archivos de texto,etc) y a los Satellite assemblies (ensamblados satelite) que nicamente contienen recursos. Para estos ltimos ensamblados existen herramientas como Visual Studio o SharpDevelop que nos permiten hacerlo de forma automtica, aunque tambin existe la opcin de hacerlo de forma programtica con las clases contenidas en el namespace System.Resources. ResourceManager ResourceReader ResourceWriter ResXResourceReader ResXResourceWriter Permite tener acceso a los archivos de recursos de forma programatica. Lee los archivos binarios de recursos. Escribe los archivos binarios de recursos. Lee los archivos XML de recursos. Escribe los archivos XML de recursos.

En el siguiente programa mostramos el uso de la clase ResourceWriter para crear un satellite asembly. Abrimos MonoDevelop y creamos una solucin GTK#, una vez creada nuestra solucin, utilizando el diseador de la interfaz grfica, creamos una GUI similar a como se muestra en la siguiente imagen:

Application.Quit (); a.RetVal = true; } protected void OnBtnAddClicked (object sender, System.EventArgs e) { //we add values, if they have values if(!string.IsNullOrEmpty(txtName.Text) && !string.IsNullOrEmpty(txtValue.Text)) { if(chkIsImage.Active) _imgValues.Add(txtName.Text,txtValue.Text); else _values.Add (txtName.Text,txtValue.Text); lbMsg.Text = "Item added"; Clear(false); } else lbError.Text = "Null values"; } protected void OnBtnBuildClicked (object sender, System.EventArgs e) { try { //Ok, we create the Object using(rw = new ResourceWriter("demo.resources")){ //iterate for the strings foreach(DictionaryEntry entry in _values) rw.AddResource(entry.Key.ToString(),entry.Value.ToString()); //iterate for the images foreach(DictionaryEntry entry in _imgValues) rw.AddResource(entry.Key.ToString(),new Bitmap(entry.Value.ToString())); //Generate rw.Generate(); Clear(true); lbError.Text = string.Empty; lbMsg.Text = "Resources file generated"; } }catch(Exception ex){ lbMsg.Text = string.Empty; lbError.Text = ex.Message; } } void Clear(bool clearMsg) { txtName.Text = txtValue.Text = string.Empty; chkIsImage.Active = false; if(clearMsg) lbMsg.Text = string.Empty; } }

Ahora ya tenemos listo el Satellite Assembly para que sea consumido por cualquier otra aplicacin en .NET. En el siguiente listado se mostrar el cdigo de un programa que nos mostrar los pasos de como consumir los ensamblados satlite o bien llamados ensamblado de recursos en una aplicacin GTK#.

using using using using using using

System; Gtk; System.IO; System.Resources; Gdk; System.Reflection;

namespace TestResource { class MainClass : Gtk.Window { DrawingArea darea = null; Label label1 = null; Button btnLoad = null; Pixmap pixmap; Pixbuf pngbuf; public MainClass():base("Test Resources"){ BorderWidth = 8; this.DeleteEvent += new DeleteEventHandler(OnWindowDelete); Frame frame = new Frame("Load"); Add(frame); VBox MainPanel = new VBox (false, 8); label1 = new Label("Query is: "); darea = new DrawingArea(); btnLoad = new Button("Load resources"); btnLoad.Clicked += AddResource_Clicked; darea.SetSizeRequest (200, 200); darea.ExposeEvent += Expose_Event; darea.ConfigureEvent += Configure_Event; MainPanel.Add(label1); MainPanel.PackStart(darea); MainPanel.Add(btnLoad); frame.Add (MainPanel); SetDefaultSize (320, 233); Resizable = false; ShowAll(); } public void OnWindowDelete(object o, DeleteEventArgs args) { Application.Quit(); } public static void Main (string[] args) { Application.Init(); new MainClass(); Application.Run(); } void PlacePixbuf (Gdk.Pixbuf buf) { pixmap.DrawPixbuf (darea.Style.BlackGC,buf, 0, 0, 0, 0,buf.Width, buf.Height,RgbDither.None, 0, 0); darea.QueueDrawArea (0, 0, buf.Width, buf.Height); }

void LoadResources(){ try{ //find the assembly string assem = "demo.resources.dll"; Assembly assembly = Assembly.LoadFrom(assem); if(File.Exists(assem)) { //Instance for resourcemanager ResourceManager rm = new ResourceManager("demo",assembly); //get the string for the resource label1.Text += rm.GetString("query1"); //get the image for the resource System.Drawing.Bitmap bitmap = (System.Drawing.Bitmap)rm.GetObject("pugme"); bitmap.Save("pugme.png",System.Drawing.Imaging.ImageFormat.Png); pngbuf = new Pixbuf("pugme.png"); } }catch(Exception e){ Console.WriteLine(e.Message); } } void Configure_Event (object obj, ConfigureEventArgs args) { Gdk.EventConfigure ev = args.Event; Gdk.Window window = ev.Window; Gdk.Rectangle allocation = darea.Allocation; pixmap = new Gdk.Pixmap (window, allocation.Width,allocation.Height, -1); pixmap.DrawRectangle (darea.Style.WhiteGC, true, 0, 0,allocation.Width, allocation.Height); } void Expose_Event (object obj, ExposeEventArgs args) { Gdk.Rectangle area = args.Event.Area; args.Event.Window.DrawDrawable (darea.Style.WhiteGC, pixmap,area.X, area.Y,area.X, area.Y,area.Width, area.Height); } void AddResource_Clicked (object obj, EventArgs args) { LoadResources(); PlacePixbuf (pngbuf); } } }

Toda esta funcionalidad se encuentra en el mtodo LoadResources() , este mtodo comienza primeramente con la carga en tiempo de ejecucin del ensamblado que contiene los recursos utilizando las lneas siguientes: string assem = "demo.resources.dll"; Assembly assembly = Assembly.LoadFrom(assem); A continuacin creamos una instancia de la clase ResourceManager en la cual se encuentran los mtodos para

Los ejemplos pueden ser descargados de http://www.humansharp.com/ Este documento est protegido bajo la licencia de documentacin libre Free Documentacion License del Proyecto GNU, para consulta ver el sitio http://www.gnu.org/licenses/fdl.txt , toda persona que lo desee est autorizada a usar, copiar y modificar este documento segn los puntos establecidos en la Licencia FDL