Tabla de Contenido
0. Introducción1. Problema
2. Solución
3. Discusión de la Solución
4. El Código C# y Uso
5. Conclusiones
6. Glosario
7. Referencias
0. Introducción
En esta receta voy a introducir conceptos nuevos como rendimiento y uso eficiente de memoria, también trataré el tema de la interoperabilidad de lenguajes (una característica muy interesante de la plataforma .NET); además, el uso de tipos de datos de lenguajes de programación diferentes a C#. Todo lo anterior gracias a la creación de archivos de ensamblado (assemblies).
1. Problema
El programador o desarrollador necesita llevar a cabo cualquier de los siguientes retos impuestos en el documento de diseño del proyecto de ingeniería:
- Mejorar el rendimiento y el uso eficiente de memoria ordenando a la CLR la carga de aquellos tipos de datos que son usados en pocas ocasiones, es decir, sólo cuando sean requeridos por una clase cliente u otro módulo.
- Uso de tipos de datos escritos en otros lenguajes compatibles con .NET sobre C# (interoperabilidad).
2. Solución
La creación de un bloque de construcción (building block, en inglés) usando C# se logra a través del uso de la opción /target:module. Después, este módulo puede ser incorporado en otro programa con la opción /addmodule.
Todo el proceso anterior es lo que voy a explicar ahora, y a mí consideración, es muy interesante debido al mecanismo de modularidad y reutilización que provee la plataforma .NET por medio de los assemblies [1].
3. Discusión de la Solución
Para empezar es necesario hacer algunas definiciones importantes de conceptos arquitecturales como es el de Módulo.
En resumen se está hablando de bloques de construcción o unidades lógicas que contiene, esencialmente, los siguientes elementos:
- Código Intermedio (Intermediate Language [3]) que se genera a partir del código fuente compilado.
- Descripción de los tipos de datos que hacen parte del módulo por medio de metadatos [4].
- Otros recursos de la aplicación: iconos, cadenas de caracteres, usados por los tipos integrales del módulo.
Así mismo, en [2] se encuentra una definición muy intersante de lo que es un assembly (en español, ensamblado):
Assemblies are the building blocks of .NET Framework applications; they form the fundamental unit of deployment, version control, reuse, activation scoping, and security permissions. An assembly is a collection of types and resources that are built to work together and form a logical unit of functionality.
Se puede ver a un assembly como una unidad lógica funcional, luego un assembly no es más que el conjunto de uno o más módulos, junto con el archivo de manifiesto (este archivo es la descripción de los tipos de datos, permisos, además, describe cómo los datos son almacenados en el assembly). En cuanto a almacenamiento, los assemblies pueden agruparse de dos maneras:
- Cuando se trata de un único módulo, éste y el manifiesto son, en la mayoría de los casos, construidos en un único archivo.
- Por conveniencia, si son dos o más módulos, el assembly se puede representar en uno o más archivos. Esto significa que para su despliegue se debe hacer un despliegue completo de todos los archivos integrales. Por su lado, el archivo de manifiesto puede contenerse en un en un archivo separado o en cualquiera de los demás archivos (acompañando a cualquiera de los módulos integrales).Según [5], el despliegue de un assembly en múltiples módulos, puede resultar en una difícil gestión y despliegue de este mismo, pero también representa, en ciertas circunstancias, la entrega de los siguientes beneficios:
- Carga de tipos según sea necesario (uso eficiente de memoria). Ventajas:
- Mejora de rendimiento (cuando la aplicación es distibuida).
- Minimiza el uso de memoria de trabajo.
- Interoperabilidad con el resto de los lenguajes de programación compatibles con .NET Framework.
4. Práctica: Código C#
Para facilitar la exposición de la utilidad de los módulos, se reutilizará la clase Utilidades.cs de la primera receta:
Archivo C# Utilidades.cs [enlace alternativo]:
Archivo C# Utilidades.cs [enlace alternativo]:
Esta clase la compilaremos utilizando la opción (o switch [6]). Así:
Cuando esta comendo se ejecute se generará un archivo con nombre Utilidades.netmodule. La extensión .netmodule corresponde para los módulos, el nombre del archivo es el mismo que el nombre del archivo de código fuente C#.
Desde luego también existe la posibilidad de crear un módulo a partir de varios archivos de código fuente:
Cuando se ejecute este comando de compilación, el resultado es un módulo con nombre de archivo Utilidades.netmodule. El nombre del módulo coincide con el primer archivo de código fuente C#. Para cambiar este comportamiento pasamos la siguiente opción al compilador de C#:
Esto creará un módulo con nombre de archivo ModuloUtilidades.netmodule.
Al finalizar la ejecución del comando anterior, se generará un assembly que consiste en los siguientes archivos:
Cuando esta comendo se ejecute se generará un archivo con nombre Utilidades.netmodule. La extensión .netmodule corresponde para los módulos, el nombre del archivo es el mismo que el nombre del archivo de código fuente C#.
Desde luego también existe la posibilidad de crear un módulo a partir de varios archivos de código fuente:
Cuando se ejecute este comando de compilación, el resultado es un módulo con nombre de archivo Utilidades.netmodule. El nombre del módulo coincide con el primer archivo de código fuente C#. Para cambiar este comportamiento pasamos la siguiente opción al compilador de C#:
Esto creará un módulo con nombre de archivo ModuloUtilidades.netmodule.
4.1 Assembly Compuesto por Múltiples Assemblies
Para crear un assembly a partir de varios módulos, utilizamos la opción o switch del compilador /addmodule, como viene:
El assembly adicionalmente puede ir compuesto por otras clases:
Al finalizar la ejecución del comando anterior, se generará un assembly que consiste en los siguientes archivos:
- PrimeraAplicacion.exe - contiene el archivo de manifiesto del assembly como también el código intermedio (o CIL [7]) de las clases en los archivos de código fuente C#: Ayudante.cs y DescargadorConsola.cs.
- También se incluyen, evidentemente, los archivos de los módulos UtilidadesWindows.netmodule y Utilidades.netmodule. En el momento del ensamblado debido a que éstos ya han sido compilados previamente, el comando de arriba no alterará internamente estos dos módulos en ningún grado.
En [5] advierten:
Caution If you attempt to run an assembly (such as PrimeraAplicacion.exe) without any required netmodules present, a System.IO.FileNotFoundException is thrown the first time any code tries to use types defined in the missing code module. This is a significant concern because the missing modules will not be identified until runtime. You must be careful when deploying multifile assemblies.
5. Conclusiones
Los assemblies compuestos por módulos permiten crear aplicaciones más robustas debido a las ventajas de rendimiento e interoperabilidad. El ensamblar código permite al programador hacer uso de piezas funcionales de otros desarrolladores, como también compartir sus propios ensamblados con otros.
6. Glosario
- Assembly .NET
- Ensamblado
- Multifile
7. Referencias
[1]: Ensamblado (informática) - Wikipedia, la enciclopedia libre - http://es.wikipedia.org/wiki/Ensamblado_(inform%C3%A1tica)[2]: Assemblies in the Common Language Runtime - http://msdn.microsoft.com/en-us/library/vstudio/k3677y81(v=vs.100).aspx
[3]: Common Intermediate Language - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Common_Intermediate_Language
[4]: Metadata - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Metadata
[5]: Visual C# 2010 Recibes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[6]: Command-line Building With csc.exe - http://msdn.microsoft.com/en-us/library/vstudio/78f4aasd.aspx
[7]: Common Intermediate Language - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Common_Intermediate_Language
O
No hay comentarios:
Publicar un comentario
Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.