Articulo de referencia

Ensamblaje (CLI)

Un ensamblado en la Infraestructura de Lenguaje Común (CLI) es una biblioteca de código compilado que se utiliza para la implementación, el control de versiones y la seguridad. ...

Un ensamblado en la Infraestructura de Lenguaje Común (CLI) es una biblioteca de código compilado que se utiliza para la implementación, el control de versiones y la seguridad. Existen dos tipos: ensamblados de proceso ( EXE ) y ensamblados de biblioteca ( DLL ). Un ensamblado de proceso representa un proceso que utilizará clases definidas en ensamblados de biblioteca. Los ensamblados CLI contienen código en CIL , que generalmente se genera a partir de un lenguaje CLI y luego se compila a lenguaje máquina en tiempo de ejecución mediante el compilador justo a tiempo . En la implementación de .NET Framework , este compilador forma parte del Entorno de Ejecución de Lenguaje Común (CLR).

Un ensamblado puede constar de uno o más archivos. Los archivos de código se denominan módulos. Un ensamblado puede contener más de un módulo de código. Y dado que es posible usar diferentes lenguajes para crear módulos de código, técnicamente es posible usar varios lenguajes diferentes para crear un ensamblado. Sin embargo, Visual Studio no admite el uso de diferentes lenguajes en un mismo ensamblado.

Nombres de ensamblaje

El nombre de un conjunto consta de cuatro partes.

  1. El nombre corto. En Windows, este es el nombre del archivo ejecutable portátil (PE) sin la extensión.
  2. La cultura. Este es un identificador RFC 1766 de la configuración regional para el ensamblado. En general, los ensamblados de bibliotecas y procesos deben ser neutrales en cuanto a la cultura; la cultura solo debe usarse para los ensamblados satélite .
  3. La versión. Se trata de un número con puntos compuesto por cuatro valores: principal, secundario, compilación y revisión.
  4. Un token de clave pública . Este es un hash de 64 bits de la clave pública que corresponde a la clave privada utilizada para firmar [ 1 ] el ensamblaje. Se dice que un ensamblaje firmado tiene un nombre fuerte .

El token de clave pública se utiliza para que el nombre del ensamblado sea único. Por lo tanto, dos ensamblados con nombre seguro pueden tener el mismo nombre de archivo PE y, aun así, la CLI los reconocerá como ensamblados diferentes. El sistema de archivos de Windows ( FAT32 y NTFS ) solo reconoce el nombre del archivo PE, por lo que dos ensamblados con el mismo nombre de archivo PE (pero con diferente configuración regional, versión o token de clave pública) no pueden existir en la misma carpeta de Windows. Para solucionar este problema, la CLI introduce la GAC ​​( Caché Global de Ensamblados ), que se trata como una sola carpeta en tiempo de ejecución, pero que en realidad se implementa utilizando carpetas anidadas del sistema de archivos.

Para prevenir ataques de suplantación de identidad , en los que un atacante intentaría hacer pasar un ensamblado por otra cosa, este se firma con una clave privada. El desarrollador del ensamblado mantiene la clave privada en secreto, por lo que un atacante no puede acceder a ella ni adivinarla. De esta forma, el atacante no puede suplantar la identidad de otro ensamblado, ya que carece de la posibilidad de firmarlo correctamente después de la modificación. La firma del ensamblado implica generar un hash de las partes importantes del mismo y luego cifrarlo con la clave privada. El hash firmado se almacena en el ensamblado junto con la clave pública. La clave pública descifra el hash firmado. Cuando el CLR carga un ensamblado con nombre seguro, genera un hash a partir del ensamblado y lo compara con el hash descifrado. Si la comparación es exitosa, significa que la clave pública en el archivo (y, por lo tanto, el token de clave pública) está asociada con la clave privada utilizada para firmar el ensamblado. Esto significa que la clave pública en el ensamblado es la clave pública del editor del ensamblado y, por lo tanto, se previene un ataque de suplantación de identidad.

Versiones de ensamblaje

Los ensamblados CLI pueden tener información de versión, lo que permite eliminar la mayoría de los conflictos entre aplicaciones causados ​​por ensamblados compartidos. [ 2 ] Sin embargo, esto no elimina todos los posibles conflictos de versiones entre ensamblados. [ 3 ]

Ensamblajes y seguridad de la CLI

La seguridad de acceso al código de la CLI se basa en ensamblados y evidencia . La evidencia puede ser cualquier dato deducido del ensamblado, pero normalmente se crea a partir del origen del ensamblado, ya sea que se haya descargado de Internet, una intranet o se haya instalado en la máquina local (si el ensamblado se descarga de otra máquina, se almacenará en una ubicación aislada dentro de la GAC ​​y, por lo tanto, no se tratará como si estuviera instalado localmente). Los permisos se aplican a ensamblados completos, y un ensamblado puede especificar los permisos mínimos que requiere mediante atributos personalizados (consulte los metadatos de la CLI ). Cuando se carga el ensamblado, el CLR utilizará la evidencia del ensamblado para crear un conjunto de permisos de uno o más permisos de acceso al código. A continuación, el CLR comprobará que este conjunto de permisos contenga los permisos requeridos especificados por el ensamblado.

El código CLI puede realizar una comprobación de seguridad de acceso al código. Esto significa que el código solo realizará una acción privilegiada si todos los ensamblados de todos los métodos en la pila de llamadas tienen el permiso especificado. Si un ensamblado no tiene el permiso, se genera una excepción de seguridad.

El código CLI también puede realizar una solicitud vinculada para obtener el permiso de la pila de llamadas. En este caso, el CLR examinará únicamente un método en la posición superior de la pila de llamadas para el permiso especificado. Aquí, el recorrido de la pila se limita a un método en la pila de llamadas, por lo que el CLR asume que todos los demás métodos en la pila de llamadas tienen el permiso especificado. El ensamblado es una combinación de metadatos y un archivo MSIL.

Ensamblajes de satélites

En general, los ensamblados deben contener recursos independientes de la cultura. Si desea localizar su ensamblado (por ejemplo, usar diferentes cadenas para diferentes configuraciones regionales), debe usar ensamblados satélite: ensamblados especiales que solo contienen recursos. Como su nombre indica, un satélite está asociado a un ensamblado llamado ensamblado principal. Ese ensamblado (por ejemplo, lib.dll) contendrá los recursos neutrales (que Microsoft indica que son inglés internacional , pero que implican que son inglés estadounidense). Cada satélite tiene el nombre de la biblioteca asociada seguido de .resources (por ejemplo, lib.resources.dll). Al satélite se le asigna un nombre de cultura no neutral, pero dado que los sistemas de archivos de Windows existentes (FAT32 y NTFS) lo ignoran, esto significaría que podría haber varios archivos con el mismo nombre PE en una misma carpeta. Como esto no es posible, los satélites deben almacenarse en subcarpetas dentro de la carpeta de la aplicación. Por ejemplo, un satélite con los recursos en inglés del Reino Unido tendrá un nombre de CLI de "lib.resources Version=0.0.0.0 Culture=en-GB PublicKeyToken=null", un nombre de archivo PE de lib.resources.dll, y se almacenará en una subcarpeta llamada en-GB.

Los satélites se cargan mediante una clase CLI llamada System.Resources.ResourceManager. El desarrollador debe proporcionar el nombre del recurso e información sobre el ensamblado principal (con los recursos neutros). La clase ResourceManager leerá la configuración regional de la máquina y utilizará esta información y el nombre del ensamblado principal para obtener el nombre del satélite y el nombre de la subcarpeta que lo contiene. ResourceManagerLuego, puede cargar el satélite y obtener el recurso localizado.

Ensamblajes de referencia

Se puede hacer referencia a una biblioteca de código ejecutable utilizando la bandera /reference del compilador de C#.

Firma diferida de un ensamblaje

Los ensamblados compartidos deben tener un nombre seguro para identificarlos de forma unívoca, ya que podrían ser compartidos entre aplicaciones. Este nombre seguro incluye el token de clave pública, la configuración regional, la versión y el nombre del archivo PE. Si un ensamblado compartido se va a utilizar para desarrollo, el procedimiento de nombre seguro solo incluye la generación de la clave pública. La clave privada no se genera en ese momento, sino únicamente cuando se implementa el ensamblado.

Lenguaje de una asamblea

El ensamblado se construye con código CIL, que es un lenguaje intermedio. El framework convierte internamente el CIL ( bytecode ) en código ensamblador nativo . Si tenemos un programa que imprime "Hola Mundo", el código CIL equivalente para el método es:

. método privado hidebysig estático void Main ( string [] args ) cil managed { . entrypoint . custom instance void [ mscorlib ] System . STAThreadAttribute ::. ctor () = ( 01 00 00 00 ) // Tamaño del código 11 (0xb) . maxstack 1 IL_0000 : ldstr "Hello World" IL_0005 : call void [ mscorlib ] System . Console :: WriteLine ( string ) IL_000a : ret } // fin del método Class1::Main

El código CIL carga la cadena en la pila, luego llama a la función WriteLine y regresa.

Véase también

Referencias

  1. "Cómo asignar un nombre seguro a un ensamblado .NET" . Archivado del original el 24 de febrero de 2012. Consultado el 29 de marzo de 2007 .
  2. Truche, Philippe (12 de agosto de 2008). "Ciclo de vida del versionado de ensamblados .NET" . Archivado del original el 24 de octubre de 2008. Recuperado el 21 de septiembre de 2008 .
  3. Pierson, Harry (17 de septiembre de 2008). "DLR Namespace Change Fire Drill" . Archivado del original el 1 de noviembre de 2008. Recuperado el 21 de septiembre de 2008 .