Entendiendo ensamblados de recursos con C# y MonoDevelop

12
Entendiendo ensamblados de recursos (Satellite Assemblies) usando MonoDevelop por Martin Marquez <[email protected]> Introducción Una de las caracteristicas mas atractivas que .NET ofrece para el desarrollo de software es la capacidad de crear componentes en diferentes lenguajes de programación, esto es posible por que el objetivo de cada compilador existente para .NET es producir un assembly (ensamblado) el cual por definición es: La unidad funcional de distribuición, versionamiento y de identidad de la plataforma .NET. Además de clasificar los assemblies en Strong-Named o privados dependiendo de su instalación o en Single- File y Multi-File si contienen un archivo o varios, pueden también clasificarse en base a su contenido en donde tenemos a los ensamblados que contienen código 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 automática, aunque también existe la opción de hacerlo de forma programática con las clases contenidas en el namespace System.Resources. ResourceManager Permite tener acceso a los archivos de recursos de forma programatica. ResourceReader Lee los archivos binarios de recursos. ResourceWriter Escribe los archivos binarios de recursos. ResXResourceReader Lee los archivos XML de recursos. ResXResourceWriter 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 solución GTK#, una vez creada nuestra solución, utilizando el diseñador de la interfaz gráfica, creamos una GUI similar a como se muestra en la siguiente imagen:

description

Un documento que muestra como consumir recursos desde MonoDevelop

Transcript of Entendiendo ensamblados de recursos con C# y MonoDevelop

Page 1: Entendiendo ensamblados de recursos con C# y MonoDevelop

Entendiendo ensamblados de recursos (Satellite Assemblies) usando MonoDevelop

por Martin Marquez <[email protected]>

Introducción

Una de las caracteristicas mas atractivas que .NET ofrece para el desarrollo de software es la capacidad de

crear componentes en diferentes lenguajes de programación, esto es posible por que el objetivo de cada

compilador existente para .NET es producir un assembly (ensamblado) el cual por definición es: La unidad

funcional de distribuición, versionamiento y de identidad de la plataforma .NET.

Además de clasificar los assemblies en Strong-Named o privados dependiendo de su instalación o en Single-

File y Multi-File si contienen un archivo o varios, pueden también clasificarse en base a su contenido en donde

tenemos a los ensamblados que contienen código 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 automática, aunque también existe la opción de hacerlo de forma programática con las clases

contenidas en el namespace System.Resources.

ResourceManager Permite tener acceso a los archivos de recursos de forma programatica.

ResourceReader Lee los archivos binarios de recursos.

ResourceWriter Escribe los archivos binarios de recursos.

ResXResourceReader Lee los archivos XML de recursos.

ResXResourceWriter 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 solución GTK#, una vez creada nuestra solución, utilizando el diseñador

de la interfaz gráfica, creamos una GUI similar a como se muestra en la siguiente imagen:

Page 2: Entendiendo ensamblados de recursos con C# y MonoDevelop
Page 3: Entendiendo ensamblados de recursos con C# y MonoDevelop

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

Page 4: Entendiendo ensamblados de recursos con C# y MonoDevelop
Page 5: Entendiendo ensamblados de recursos con C# y MonoDevelop
Page 6: Entendiendo ensamblados de recursos con C# y MonoDevelop
Page 7: Entendiendo ensamblados de recursos con C# y MonoDevelop
Page 8: Entendiendo ensamblados de recursos con C# y MonoDevelop

Ahora ya tenemos listo el Satellite Assembly para que sea consumido por cualquier otra aplicación en .NET. En

el siguiente listado se mostrará el código de un programa que nos mostrará los pasos de como consumir los

ensamblados satélite o bien llamados ensamblado de recursos en una aplicación GTK#.

using System;using Gtk;using System.IO;using System.Resources;using Gdk;using 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); }

Page 9: Entendiendo ensamblados de recursos con C# y MonoDevelop

void LoadResources(){try{

//find the assemblystring 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 resourcelabel1.Text += rm.GetString("query1");

//get the image for the resourceSystem.Drawing.Bitmap bitmap = (System.Drawing.Bitmap)rm.-

GetObject("pugme");bitmap.Save("pugme.png",System.Drawing.Imaging.Image-

Format.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 método LoadResources() , este método comienza primeramente

con la carga en tiempo de ejecución del ensamblado que contiene los recursos utilizando las líneas siguientes:

string assem = "demo.resources.dll";Assembly assembly = Assembly.LoadFrom(assem);

A continuación creamos una instancia de la clase ResourceManager en la cual se encuentran los métodos para

Page 10: Entendiendo ensamblados de recursos con C# y MonoDevelop
Page 11: Entendiendo ensamblados de recursos con C# y MonoDevelop
Page 12: Entendiendo ensamblados de recursos con C# y MonoDevelop

Los ejemplos pueden ser descargados de http://www.humansharp.com/

Este documento está protegido bajo la licencia de documentación 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 según los puntos establecidos en la «Licencia FDL»