stringtranslate.com

Metadatos (CLI)

Metadatos , en Common Language Infrastructure (CLI), se refiere a ciertas estructuras de datos integradas dentro del código de 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 están definidos 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 las interfaces de los componentes para el código escrito en cualquiera de los lenguajes de programación compatibles . Una diferencia de uso dentro de Common Language Runtime es que un ensamblado normalmente no contiene instrucciones CIL. [1]

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 tienen la misma sintaxis . Los atributos en el código son mensajes al compilador para generar metadatos. En CIL, los metadatos, como los modificadores de herencia, los modificadores de alcance y casi cualquier cosa que no sean códigos de operación ni flujos, también se denominan atributos.

Un atributo personalizado es una clase normal que hereda de la Attributeclase. Se puede utilizar un atributo personalizado en cualquier método, propiedad, clase o conjunto completo con la sintaxis: como en:[AttributeName(optional parameter, optional name=value pairs)]

[Personalizado] [Personalizado(1)] [Personalizado(1, Comentario="sí")]

CLI utiliza ampliamente los atributos personalizados. Windows Communication Framework usa atributos para definir contratos de servicios, ASP.NET los usa para exponer métodos como servicios web , LINQ to SQL los usa para definir el mapeo 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 son interpretados por el código de la aplicación y no por el CLR. Cuando el compilador ve un atributo personalizado, generará metadatos personalizados que el CLR no reconoce. El desarrollador debe 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:

clase CustomAttribute : Atributo { private int paramNumber = 0 ; comentario de cadena privada = "" ;              public CustomAttribute () { } public CustomAttribute ( int num ) { paramNumber = num ; }            Comentario de cadena pública { set { comentario = valor ; } } }          

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 Attributesufijo -. Al agregar un atributo a un elemento, el compilador buscará tanto el nombre literal como el nombre agregado Attributeal final, es decir. mi. si escribieras, [Custom]el compilador buscaría ambos Customy CustomAttribute. Si ambos existen, el compilador falla. El atributo puede tener el prefijo " @" si no quiere correr el riesgo de 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 nombre-valor se asignan a 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 qué se está colocando en el atributo. Considere el siguiente código:

[Naranja] public int EjemploMetodo ( entrada de cadena ) { //el cuerpo del método va aquí }    

¿Qué se ha marcado como naranja? ¿Es el ExampleMethodvalor de retorno o quizás el conjunto completo? En este caso, el compilador tomará el valor predeterminado 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 objetivo de atributo . La escritura [return: Orange]marcará el valor de retorno en naranja, [assembly: Orange]marcará todo el ensamblaje. Los objetivos válidos son assembly, field, event, method, module, param, propertyy return.type

Un atributo pseudopersonalizado se utiliza igual que los atributos personalizados normales, 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 dichos atributos de manera diferente. Atributos como Serializabley Obsoletese implementan como atributos pseudopersonalizados. ILAsm nunca debe utilizar atributos pseudopersonalizados , ya que tiene una sintaxis adecuada para describir los metadatos. [ se necesita aclaración ]

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 utiliza 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 brindan el índice de los metadatos en la tabla. El SDK de Framework contiene un ejemplo llamado metainfoque enumerará las tablas de metadatos en un ensamblado; sin embargo, esta información rara vez es de utilidad para un desarrollador. Los metadatos de un ensamblado se pueden ver utilizando la herramienta ILDASM proporcionada por el SDK de .NET Framework .

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 utilizada para leer metadatos CLI. La API de reflexión proporciona una vista lógica de los metadatos en lugar de la vista literal proporcionada por herramientas como metainfo. 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 de 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.Reflectionespacio de nombres, también hay disponibles otras herramientas que se pueden utilizar 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, incluidas PostSharp y Mono Cecil.

Ver también

Referencias

  1. ^ "Archivos de metadatos de Windows (WinMD)". Aplicaciones para UWP de Windows .