# Metadatos .NET

Los metadatos .NET, en la plataforma Microsoft .NET, se refieren a ciertas estructuras de datos embebidas en el código CIL que describen la estructura de alto nivel del código. Los metadatos describen todas las clases y los miembros de clase que se definen en el ensamblado, así como las clases y métodos de clase de otros ensamblados que son invocados por el ensamblado actual. Los metadatos de un método contienen su descripción completa, incluyendo la clase, el ensamblado que contiene la clase, el tipo de retorno y todos los parámetros.
Un compilador de un lenguaje .Net generará los metadatos y los almacenará en el ensamblado que contiene el CIL. Cuando el CLR ejecute el CIL comprobará que los metadatos del método llamado coinciden con los metadatos almacenados en el método llamante. Esto asegura que sólo se pueda invocar el método con el número y tipo de parámetros correctos.

## Atributos

Los desarrolladores pueden añadir metadatos a su código a través de atributos. Existen dos tipos de atributos, personalizados y pseudo personalizados, presentando ambos tipos la misma sintaxis de cara al desarrollador. Los atributos en el código son mensajes que indican al compilador que genere metadatos. En el CIL, los metadatos tales como modificadores de herencia, los modificadores de alcance, y prácticamente cualquier cosa que no sea un código de operación o un flujo de datos, son denominados también atributos.
Un atributo personalizado es una clase regular que hereda de una clase Atributte. Un atributo personalizado puede utilizarse sobre cualquier método, propiedad, clase, o incluso sobre el ensamblado completo, empleando la siguiente sintaxis: [Nombre del atributo(parámetro opcional, pares nombre=valor opcionales)] como en el siguiente ejemplo:
Los atributos personalizados se usan de forma generalizada en el .NET Framework. Windows Communication Framework emplea atributos para definir contratos de servicio, ASP.NET para exponer métodos en forma de servicios web, LINQ to SQL los emplea para definir el mapeo de clases al modelo relacional subyacente, Visual Studio los utiliza para agrupar propiedades de objetos, los desarrolladores de clases indican la categoría de la clase del objeto aplicando el atributo personalizado [Category]. Los atributos personalizados son interpretados por el código de aplicación y no por el CLR. Cuando el compilador observa un atributo personalizado, genera unos metadatos personalizados que no puede reconocer el CLR. El desarrollador tiene que proporcionar el código necesario para poder leer los metadatos y actuar sobre ellos. A modo de ejemplo, el atributo que se muestra a continuación podría ser manejado por el código:
El nombre de la clase se mapea al nombre del atributo. El compilador de C# añade automáticamente la cadena "attribute" al final del nombre del atributo. Por lo tanto, toda clase que implemente el manejo de un atributo debe finalizar con esta cadena, pero la utilización de esta cadena es opcional cuando se emplee el atributo. La utilización del atributo invoca el constructor de la clase. Se permiten constructores sobrecargados. Los pares Nombre-Valor se mapean a propiedades, siendo el nombre el de la propiedad y el valor proporcionado el establecido por la propiedad.
Un atributo pseudo-personalizado se emplea de la misma forma que un atributo personalizado convencional, pero no posee un manejador personalizado; en su lugar, el compilador percibe intrínsecamente estos atributos y maneja el código marcado con estos atributos de una forma diferente. Atributos tales como Serializable y Obsolete están implementados como atributos pseudo-personalizados.

## Almacenamiento de metadatos

Los ensamblados contienen tablas de metadatos, que están descritas por la especificación CIL. Cada tabla contiene varias entradas (o ninguna) cuyas posiciones determinan sus índices. Cuando el código CIL utiliza metadatos lo hace mediante un token de 32 bits, cuyos 8 primeros bits identifican la tabla y los 24 restantes contienen el índice del metadato.
El Kit de desarrollo de software de .NET contiene un método de ejemplo llamado metainfo que lista las tablas de metadatos de un ensamblado. Sin embargo, esta información no suele tener aplicación práctica para los desarrolladores. Los metadatos también se pueden consultar usando la herramienta ILDASM.

## Reflexión

Los metadatos .NET son leídos mediante reflexión. A diferencia del método metainfo, la API de reflexión proporciona una visión más lógica que literal de los metadatos. La reflexión incluida en la versión 1.1 de .NET puede utilizarse para inspeccionar las descripciones de las clases y de sus miembros, y para invocar métodos. Sin embargo, no permite acceso a métodos al CIL en tiempo de ejecución. A partir de la versión 2.0 de la plataforma .NET sí lo permite.

## Otras herramientas de metadatos

Al margen del espacio de nombres System.Reflection, existen otras herramientas disponibles para manejar metadatos. La plataforma .NET incorpora una biblioteca de manipulación de metadatos CLR, implementada en código nativo. También existen herramientas de terceros como PostSharp o Mono Cecil.