Índice de la sección dedicada a .NET (en el Guille) Cómo... en .NET

Crear un ensamblado con nombre seguro
(strong name) y registrarlo en el GAC

Publicado el 06/Ene/2003
Actualizado el 07/Ene/2003

Este artículo también está publicado en MSDN España


Como sabrás, cuando creamos una librería de clases para usar con una aplicación generada por cualquiera de los lenguajes de .NET Framework, ésta se puede usar de dos formas distintas, copiándola en el mismo directorio del ejecutable o bien registrándola en el sistema e instalándola en el GAC (Global Assembly Cache, caché de ensamblados global).

La ventaja de registrar un ensamblado en la caché de ensamblados global, es que estará disponible para todas las aplicaciones que tengamos en el equipo en el que se ha instalado.
Si un ensamblado se utiliza de forma privada, siempre debe copiarse en el directorio de la aplicación que lo utiliza, por tanto si hay varias aplicaciones que utilicen un mismo ensamblado, éste se cargará varias veces en la memoria, con el consiguiente consumo extra de recursos.

Para poder registrar e instalar un ensamblado en el GAC, éste debe estar firmado con un nombre seguro.

En este artículo veremos cómo podemos crear un ensamblado con nombre seguro (strong name), así como los pasos que tendremos que dar para registrarlo en el sistema.

 

Para crear un ensamblado con nombre seguro, primero debemos crear un archivo de claves, para ello debemos usar la utilidad sn.exe, (strong name), la forma de usarla para crear ese archivo de claves, es la siguiente:
sn -k nombreArchivoClaves.snk

Una vez que tenemos el archivo con el par de claves, podemos usarlo para registrar un ensamblado de dos formas:
1- Usando la utilidad al.exe, (assembly linker).
2- Usando atributos de ensamblado.

Aquí vamos a ver la segunda opción: usando atributos de ensamblado.

Una vez que hemos creado el archivo de claves con la utilidad sn.exe, (para este ejemplo, el archivo de claves se llamará prueba.snk y se creará con: sn -k prueba.snk), dicho archivo lo copiaremos en el directorio de la solución con la librería de clases.
En el archivo AssemblyInfo.vb del proyecto de librería de clases, añadiremos el siguiente atributo:
<Assembly: AssemblyKeyFileAttribute("..\..\prueba.snk")>

Nota:
En la documentación de Visual Studio .NET indica que el nombre debe especificarse como "prueba.snk", pero si lo hacemos así, al compilarlo no encontrará dicho archivo de claves.
Otra forma de especificar el nombre del archivo de claves es indicar la ruta completa, con esto nos aseguraremos de que siempre se encuentre.

Una vez hecho esto, podemos compilar la librería de clases, la cual contendrá el par de claves que contiene el archivo de claves prueba.snk.

Con esto, hemos "firmado" el ensamblado para que tenga nombre seguro.

 

¿Para que sirve el archivo de claves?
Al compilar un ensamblado con un archivo de claves, nos aseguramos de que tenga un nombre único.
Por ejemplo, si distribuimos el código de ese ensamblado, pero no distribuimos el archivo de claves, y se compila con un archivo de claves distinto al que se utilizó originalmente, se creará un ensamblado que será "distinto" al original. Esto garantizará que las aplicaciones creadas utilizando el ensamblado original, siempre funcionarán, a pesar de que el ensamblado se haya modificado.
Por tanto, para poder "regenerar" un ensamblado con nombre seguro, (o crear una nueva versión), será necesario disponer del archivo de claves con el que se creó originalmente, en caso de que no sea así, el ensamblado generado se considerará distinto.

 

Ahora lo que necesitamos es poder registrarlo en el caché de ensamblados global (GAC).
Si creamos un programa de instalación, el instalador se encargará de registrar y copiar dicho ensamblado en dicho caché global.
Pero lo mejor, si queremos hacerlo de forma manual, es usar la utilidad gacutil.exe:
gacutil /i nombreEnsamblado.dll

Esta misma herramienta la podemos usar para quitar el ensamblado del GAC, para ello usaremos gacutil.exe con el parámetro /u:
gacutil /u nombreEnsamblado.dll

Y con estos tres sencillos pasos, tendremos registrado un ensamblado con nombre seguro, además de tenerlo instalado en el caché de ensamblados global.

Sólo me queda aclarar que los ensamblados con nombre seguro sólo debe hacer referencia a otros ensamblados que también hayan sido firmados con nombre seguro.

Una vez que un ensamblado está registrado en la caché de ensamblados global, éste no se podrá distribuir usando XCOPY, es decir, copiándolo en el mismo directorio que el ejecutable que lo utilice. Las nuevas versiones siempre deben instalarse en dicho caché global.

 

Para más información, revisa la documentación de Visual Studio .NET, aquí te muestro algunos links, aunque la lista podría ser casi interminable:

Nota:
Los siguientes links hacen referencia a la ayuda de Visual Studio .NET, lo marcado con negrita, es posible que tengas que modificarlo, todo dependerá de cómo tengas configurada la ayuda.
Para usarlos, simplemente cópialos en la dirección URL del navegador o en el IDE.

ms-help://MS.VSCC/MS.MSDNVS.3082/cpguide/html/cpconstrong-namedassemblies.htm
ms-help://MS.VSCC/MS.MSDNVS.3082/cpguide/html/cpconglobalassemblycache.htm
ms-help://MS.VSCC/MS.MSDNVS.3082/cpguide/html/cpconassigningassemblystrongname.htm
ms-help://MS.VSCC/MS.MSDNVS.3082/cpguide/html/cpconcreatingkeypairforuseincreatingstrongly-namedassembly.htm
ms-help://MS.VSCC/MS.MSDNVS.3082/cpguide/html/cpconworkingwithstrongly-namedassemblies.htm
ms-help://MS.VSCC/MS.MSDNVS.3082/cpguide/html/cpconstrongnamescenario.htm
 

Espero que con esta pequeña explicación tengas algo más claro todo esto de los nombres seguros y cómo poder registrarlos, y sobre todo, usarlos.

Nos vemos.
Guillermo


la Luna del Guille o... el Guille que está en la Luna... tanto monta...