Metadatos (CLI) - Metadata (CLI)

Metadatos CLI, representación en disco
Extensión de nombre de archivo
.exe , .dll , .winmd
número mágico 0x424A5342
Desarrollado por Microsoft ,
Ecma Internacional
Estándar ECMA-335 parte II

Los metadatos , en Common Language Infrastructure (CLI), se refieren a ciertas estructuras de datos incrustadas en el código Common Intermediate Language (CIL) que describe la estructura de alto nivel del código. Los metadatos describen todas las clases y miembros de clase que se definen en el ensamblado, y las clases y miembros de clase que el ensamblado actual llamará desde otro ensamblado. Los metadatos de un método contienen la descripción completa del método, incluida la clase (y el ensamblado que contiene la clase), el tipo de retorno y todos los parámetros del método .

Un compilador de lenguaje CLI generará los metadatos y los almacenará en el ensamblado que contiene el CIL . Cuando el tiempo de ejecución ejecuta CIL, verificará para asegurarse de que los metadatos del método llamado sean los mismos que los metadatos almacenados en el método de llamada. Esto garantiza que solo se pueda llamar a un método con exactamente el número correcto de parámetros y exactamente los tipos de parámetros correctos.

La plataforma de aplicaciones Windows Runtime , presente en Windows 8 y Windows Phone 8 , utiliza el formato de metadatos CLI para describir interfaces de componentes para código escrito en cualquiera de los lenguajes de programación admitidos . Una diferencia de uso dentro de Common Language Runtime es que un ensamblado normalmente no contiene instrucciones CIL.

Atributos

Los desarrolladores pueden agregar metadatos a su código a través de atributos . Hay dos tipos de atributos, atributos personalizados y pseudopersonalizados, y para el desarrollador estos tienen la misma sintaxis . Los atributos en el código son mensajes al compilador para generar metadatos. En CIL, los metadatos como modificadores de herencia, modificadores de alcance y casi cualquier cosa que no sea códigos de operación o flujos, también se denominan atributos.

Un atributo personalizado es una clase regular que hereda de la Attribute clase. Un atributo personalizado se puede usar en cualquier método, propiedad, clase o ensamblado completo con la sintaxis: como en: [AttributeName(optional parameter, optional name=value pairs)]

[Custom]
[Custom(1)]
[Custom(1, Comment="yes")]

La CLI utiliza ampliamente los atributos personalizados. Windows Communication Framework usa atributos para definir contratos de servicio, ASP.NET los usa para exponer métodos como servicios web , LINQ to SQL los usa para definir la asignación de clases al esquema relacional subyacente , Visual Studio los usa para agrupar propiedades de un objeto , el desarrollador de la clase indica la categoría de la clase del objeto aplicando el [Category] atributo personalizado. Los atributos personalizados se interpretan mediante el código de la aplicación y no el CLR. Cuando el compilador ve un atributo personalizado, generará metadatos personalizados que no son reconocidos por CLR. El desarrollador tiene que proporcionar código para leer los metadatos y actuar en consecuencia. Como ejemplo, el atributo que se muestra en el ejemplo puede ser manejado por el código:

class CustomAttribute : Attribute
{
   private int paramNumber = 0;
   private string comment = "";

   public CustomAttribute() { }
   public CustomAttribute(int num) { paramNumber = num; }

   public String Comment
   {
      set { comment = value; }
   }
}

El nombre de la clase se asigna al nombre del atributo. El compilador de Visual C # agrega automáticamente la cadena " Attribute " al final de cualquier nombre de atributo. En consecuencia, cada nombre de clase de atributo debe terminar con esta cadena, pero es legal definir un atributo sin el Attribute -sufijo. Al agregar un atributo a un elemento, el compilador buscará tanto el nombre literal como el nombre con el Attribute agregado al final, i. mi. si tuviera que escribir, [Custom] el compilador buscaría ambos Custom y CustomAttribute . Si ambos existen, el compilador falla. El atributo puede tener el prefijo " @ " si no quiere arriesgarse a la ambigüedad, por lo que la escritura [@Custom] no coincidirá CustomAttribute . El uso del atributo invoca al constructor de la clase. Se admiten constructores sobrecargados. Los pares de nombre-valor se asignan a las propiedades, el nombre indica el nombre de la propiedad y el valor proporcionado lo establece la propiedad.

A veces hay ambigüedad con respecto a lo que se le asigna al atributo. Considere el siguiente código:

[Orange]
public int ExampleMethod(string input)
{
    //method body goes here
}

¿Qué se ha marcado como naranja? ¿Es el ExampleMethod , su valor de retorno, o quizás el conjunto completo? En este caso, el compilador lo utilizará de forma predeterminada y tratará el atributo como si estuviera adjunto al método. Si esto no es lo que se pretendía, o si el autor desea aclarar su código, se puede especificar un atributo objetivo . La escritura [return: Orange] marcará el valor de retorno como naranja, [assembly: Orange] marcará todo el ensamblaje. Los objetivos son válidos assembly , field , event , method , module , param , property , return y type .

Un atributo pseudopersonalizado se utiliza como los atributos personalizados habituales, pero no tienen un controlador personalizado; más bien, el compilador tiene un conocimiento intrínseco de los atributos y maneja el código marcado con tales atributos de manera diferente. Los atributos como Serializable y Obsolete se implementan como atributos pseudo-personalizados. ILAsm nunca debe utilizar atributos pseudopersonalizados , ya que tiene una sintaxis adecuada para describir los metadatos.

Almacenamiento de metadatos

Los ensamblados contienen tablas de metadatos. Estas tablas se describen en la especificación CIL. Las tablas de metadatos tendrán cero o más entradas y la posición de una entrada determina su índice. Cuando el código CIL usa metadatos, lo hace a través de un token de metadatos. Este es un valor de 32 bits donde los 8 bits superiores identifican la tabla de metadatos apropiada y los 24 bits restantes dan el índice de los metadatos en la tabla. El Framework SDK contiene un ejemplo llamado metainfo que enumerará las tablas de metadatos en un ensamblado; sin embargo, esta información rara vez es útil para un desarrollador. Los metadatos en un ensamblado se pueden ver con la herramienta ILDASM proporcionada por .NET Framework SDK.

En el estándar CIL, los metadatos se definen en forma ILAsm (lenguaje ensamblador), una forma de representación en disco para almacenamiento y una forma que está incrustada en ensamblajes del formato Portable Executable (PE, .exe o .dll). El formulario PE se basa en el formulario en disco.

Reflexión

Reflection es la API que se utiliza para leer los metadatos de la CLI. La API de reflexión proporciona una vista lógica de los metadatos en lugar de la vista literal proporcionada por herramientas como metainformación. La reflexión en la versión 1.1 del marco .NET se puede utilizar para inspeccionar las descripciones de las clases y sus miembros, e invocar métodos. Sin embargo, no permite el acceso en tiempo de ejecución al CIL para un método. La versión 2.0 del marco permite obtener el CIL para un método.

Otras herramientas de metadatos

Además del System.Reflection espacio de nombres, también hay otras herramientas disponibles que se pueden usar para manejar metadatos. Microsoft .NET Framework incluye una biblioteca de manipulación de metadatos CLR que se implementa en código nativo . También se pueden utilizar herramientas de terceros para recuperar y manipular metadatos, como PostSharp y Mono Cecil .

Ver también

Referencias