Entendiendo ensamblados de recursos con C# y MonoDevelop



Comments



Description

Entendiendo ensamblados de recursos (Satellite Assemblies) usando MonoDeveloppor 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 SingleFile 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 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 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: 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 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 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 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 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»
Copyright © 2024 DOKUMEN.SITE Inc.