El Segundo Aire del Pelos

Sunday, March 05, 2006

Tarea 2 - 2 Que es un assemby?

Este también esta chido...
Si queremos hacerlo fácil, un assembly es básicamente el DLL o EXE que se genera del código que se escribe en Visual Studio.
Sin embargo, no queremos hacerlo tan fácil, así que lo vamos a desmenuzar un poco más. Efectivamente, un assembly es el DLL o el EXE, pero puede contener más archivos también, como imágenes, archivos de texto, etc. Un assembly debe contener también información sobre sí mismo (como la versión, la lista de los archivos que lo constituyen, etc.), la cual es llamada Manifiesto, o "Assembly Manifest".
Los assemblies se pueden categorizar en dos tipos: privados (private) o compartidos (shared). La descripción de ambos se encuentran a continuación:
  • Assembly Privado: Es el assembly que será utilizado solamente por una aplicación en específico. Por ejemplo, supongamos que se desarrolla una aplicación de una casa de cambio, y se desea encapsular la lógica de los procesos de la casa de cambio en un DLL. Solo la aplicación que maneja la casa de cambio va a accesar este DLL, Inclusive, este DLL será instalado en el mismo folder donde se instalará la aplicación.
  • Assembly Compartido: Este tipo de assemblies, por lo contrario, son accesados por diversas aplicaciones al mismo tiempo. Un muy buen ejemplo seria encapsular en un DLL el acceso a datos. En este caso, independientemente del tipo de aplicación, todas utilizarán este DLL para accesar los datos, así que se pondrá en el "Global Assembly Cache", el cual es un folder especial, el cual se encuentra físicamente en :\WinNT\Assembly.
Ahora, esta nueva organización ayuda a desaparecer el "DLL Hell" que existia anteriormente. Para aquellos que no saben exactamente que significa el "DLL Hell", vamos a hacer un paréntesis aquí. Anteriormente, la mayoria de las aplicaciones dependian de archivos DLL para funcionar. Muchas veces, estas DLL podrian tener el mismo nombre (porque eran la misma con diferente versión, o porque dos compañias habian decidido ponerle el mismo nombre a su DLL). Esto causaba grandes problemas, ya que al instalar una aplicación dejaba de funcionar la primera, ya que físicamente se tenian que instalar en el mismo path. Por ejemplo... supongamos que la Aplicación A utiliza el DLL "myFile.dll" y esta funcionando perfectamente. Sin embargo, en la misma máquina se instala la la aplicación B, la cual también utiliza un DLL llamado "myFile.dll". Al instalar la aplicación B, el archivo "myFile.dll" sera remplazado, y muy probablemente la aplicación A dejará de funcionar. Y esto puede suceder aún cuando el archivo "myFile.dll" sea el mismo, pero de una versión diferente.
Bueno, entonces como funciona esto ahora??? Como mencionamos anteriormente, cuando un assembly es privado, el DLL será grabado en la misma ubicación de la aplicación. En este esquema, la mayoria de los assemblies serán privados, así que aun cuando dos aplicaciones utilicen un DLL con el mismo nombre, la ubicación física será siempre diferente. Volviendo al ejemplo anterior, la aplicación A tendrá su DLL "myFile.dll" en su ruta particular, y cuando la aplicación B se instale, su DLL "myFile.dll" será en otra ruta diferente, por lo cual ambos archivos "myFile.dll" existirán al mismo tiempo, y serán referenciados por sus "dueños" solamente.
Ahora, en caso de que se este utilizando un assembly compartido, es necesario saber que estos son marcados con un número de versión de la siguiente manera:

major.minor.build.revision

Es decir, cada vez que se genera una nueva versión del assembly, esta es marcada con su número de versión, por lo cual varias versiones del mismo assembly pueden coexistir juntas, y las diferentes aplicaciones que los accesen sabrán accesar la versión correspondiente.
Entonces, cuales son los pasos para crear un assembly???
  1. Crear el código fuente del DLL o EXE
  2. Generar el nombre único del assembly, utilizando SN Utility (SN.exe). Esta utileria generará un par de llaves privadas
  3. Firmar el DLL/EXE con la llave privada generada anteriormente, modificando el archivo AssemblyInfo. Para esto, es necesario modificar este archivo e incluir la siguiente linea [assembly:AssemblyKeyFile("file_path")]
  4. Compilar el DLL/EXE
  5. Copiar el DLL/EXE resultante al "Global Assembly Cache" usando AL Utility
Espero que esta información les haya ayudado a conocer mejor los assemblies, para que sirven, y como se usan... si desean mas información, chequense este artículo. Ahí viene un ejercicio para profundizar en este tema.

0 Comments:

Post a Comment

<< Home