2012-01-14 10 views
29

Busqué en varios sitios para entender qué metadata está en .NET y significa.¿Qué son los metadatos en .NET?

Todavía soy nuevo en la programación de aplicaciones de escritorio C# WPF. Cuando era programador web, hay una metaetiqueta en el código HTML donde describimos el sitio con títulos, palabras clave y demás. ¿También es similar en la aplicación .NET? Leí wiki y busqué en Google pero todo lo que obtengo es una explicación conceptual.

Uno describe "metadata is data that describes the state of the assembly and a detailed description of each type, attribute within the assembly". ¿Los metadatos son solo un concepto o algo físico como una línea de códigos que escribí en algún lugar para describir mi código? Si es así, ¿mi recomendación se convierte en mis metadatos?

Leo los metadatos es "Within the Common Language Runtime (CLR)", pero código solo en C#, ¿cómo puedo codificar en CLR en los metadatos? ¿Los metadatos son recomendables en CLR? ¿Cómo puedo cambiarlo?

MSDN escribió que los metadatos son información binaria para el componente de software de otro idioma para entenderlo. Pensé que solo la descripción de las necesidades humanas (encomienda) en inglés para comprender qué es lo que hace un bloque de código. El componente de software simplemente ejecuta cualquier declaración que hayamos escrito: cuál es la necesidad de la información "binaria". ¿Cómo puede el compilador entender el significado de mi código de alto nivel para generar "Descripción del conjunto"? Si escribo un programa que convierte moneda, ¿los metadatos se generarán automáticamente sabiendo que el programa está convirtiendo moneda? ¿Dónde está esta inteligencia?

Estoy completamente confundido.

Respuesta

15

Desde otros ya dieron unas respuestas explicativas, sólo voy a mencionar cómo se puede ver metadatos sí mismo.

En el directorio de Microsoft SDK (más probables variaciones de C: \ Archivos de programa \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ netfx 4.0 Herramientas) hay programa llamado ildasm.exe - es desensamblador simple que le permite ver compilados .NET binarios.

Puede construir una aplicación de consola muy simple y usar ildasm.exe para ver los contenidos compilados. Ver/MetaInfo/¡Mostrar! El comando (o simplemente Ctrl + M) mostrará metadatos; puede verificar cómo se ven. Una parte de los metadatos de la aplicación de impresión Hello a la consola:

TypeDef #1 (02000002) 
------------------------------------------------------- 
TypDefName: Program (02000002) 
Flags  : [Public] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit](00100001) 
Extends : 01000001 [TypeRef] System.Object 
Method #1 (06000001) [ENTRYPOINT] 
------------------------------------------------------- 
    MethodName: Main (06000001) 
    Flags  : [Public] [Static] [HideBySig] [ReuseSlot] (00000096) 
    RVA  : 0x00002050 
    ImplFlags : [IL] [Managed] (00000000) 
    CallCnvntn: [DEFAULT] 
    ReturnType: Void 
    1 Arguments 
     Argument #1: SZArray String 
    1 Parameters 
     (1) ParamToken : (08000001) Name : args flags: [none] (00000000) 

Aquí se puede ver definición de tipo (Program) y uno de sus métodos (Main), que tiene un solo argumento de entrada y devuelve void. Esto es, naturalmente, solo una parte de los metadatos, incluso para los programas más simples hay mucho más.

+1

+1 Tengo que tomar esto como mi respuesta porque hace que la lectura de otras respuestas tenga sentido y aclare mi confusión. – KMC

14

Si está familiarizado con .NET Reflection puede pensar en los metadatos como "los datos a los que Reflection accede". Cada ensamblado .NET almacena información sobre qué tipos y métodos contiene, los atributos de esos métodos, etc. No sería necesario almacenar eso solo para ejecutar el código (los EXEs nativos no tienen ese tipo de información), pero lo necesita para otros fines, como la aplicación de la seguridad declarativa y la habilitación de Reflection.

Así que los metadatos son "algo físico", pero la mayor parte se genera automáticamente a partir del código que se escribe. Agregar atributos a sus clases o métodos es probablemente la única forma en que puede cambiar metadatos directamente. En particular, los comentarios de su código fuente no se almacenarán en el conjunto como metadatos (o de cualquier otra forma).

La página de Wikipedia sobre esto es bastante bueno: http://en.wikipedia.org/wiki/.NET_metadata

Editar: No, no es como metadatos comentarios. Es simplemente "datos sobre el código", que no es parte del código en sí (no es necesario para ejecutar el programa). No es como los metadatos HTML en absoluto. Un ejemplo de metadatos es el hecho de que el ensamblaje contiene una clase llamada "MyClass" y esa clase contiene un método llamado "DoSomething" con ciertos parámetros, etc. Por lo tanto, no es nada misterioso, solo cosas "obvias" principalmente.

+0

leí el Wiki, y yo estoy confundido. Metadatos se supone que describen mi código como un recomendar no? ¿Cómo podría la computadora entender mi propósito y generarlo para mí? En HTML, las metaetiquetas se escriben manualmente con la palabra clave y el título para describir la página, el navegador no sería lo suficientemente inteligente como para comprender el contenido de la página y generar palabras clave y título para mí. hombre, estoy confundido ... – KMC

+0

para que los metadatos capturen los identificadores de clase, métodos, variables, etc. ¿De qué sirve esto? ¿Obtener el identificador name = describe mis datos? Pensé que la firma del método también resumía la información en un método ... una vez más, aún más confuso. lo siento. por favor ayuda – KMC

+0

Derecha, la firma del método es parte de los metadatos. Solo para llamar al método sería suficiente conocer el desplazamiento binario del método y su número y tamaño de parámetros. Sin embargo, .NET almacena la firma completa: nombre del método, tipo de devolución, el tipo y nombre exacto de cada parámetro, cualquier atributo en el método o los parámetros, etc. Eso es metadatos. El objetivo es habilitar la Reflexión (y algunas otras cosas). – EMP

4

Simplemente, los metadatos son información que se almacena sobre su programa que puede examinar por varios medios uno, en.NET uno de estos métodos se conoce comúnmente como Reflection

Metadata describe tipos (por ejemplo, clases, interfaces, ...), métodos y parámetros (nombres y tipos) y atributos que se han aplicado. Puede usar esta información de varias maneras, por ej. los sistemas de prueba como nunit y msstest (entre otros) utilizan los metadatos para 'descubrir' las pruebas dentro de un ensamblaje; otras formas en que se pueden usar los metadatos son en el enlace de datos.

Hay tantas maneras de usarlo - incluso tienen libros sobre el mismo (así al menos secciones http://my.safaribooksonline.com/book/programming/csharp/9781449379629/reflection-and-metadata/729)

+0

Si tengo un método "myMethod", ¿cómo lo describirían los metadatos? El compilador no sabe lo que significa el método y solo lo ejecuta, ¿cómo podría generarse la descripción que no sea mecanografiada manualmente por mí mismo? Confuso. – KMC

+0

Exactamente, los metadatos son información como el nombre del tipo, el nombre del método, el nombre de los parámetros, el nombre de las variables locales ... –

+1

Eche un vistazo a [ILSpy] (http://wiki.sharpdevelop.net/ ILSpy.ashx) para ver los metadatos que se utilizan para interpretar IL y devolver el código fuente "equivalente". –

2

no lo compliquen solo --- Datos (información) sobre los Datos.

solo piense en la etiqueta Meta en HTML, contiene información sobre la página, palabra clave, autor, última modificación. significa que contiene información sobre una información que es su página html.

Cuando hablamos en términos de C#, metadatos se almacenan en una sección de un archivo de .NET Framework ejecutable portable (PE), en tanto que lenguaje intermedio de Microsoft (MSIL) se almacena en otra sección del archivo PE. La parte de metadatos del archivo contiene una serie de estructuras de datos de tabla y montón. La porción MSIL contiene tokens de metadatos y MSIL que hacen referencia a la porción de metadatos del archivo PE. Cada tabla de metadatos contiene información sobre los elementos de su programa. Por ejemplo, una tabla de metadatos describe las clases en su código, otra tabla describe los campos, y así sucesivamente. Si tiene diez clases en su código, la tabla de clases tendrá decenas, una para cada clase. Las tablas de metadatos hacen referencia a otras tablas y montones. Por ejemplo, la tabla de metadatos para clases hace referencia a la tabla de métodos. Los metadatos también almacenan información en cuatro estructuras de montón: cadena, blob, cadena de usuario y GUID. Todas las cadenas utilizadas para nombrar tipos y miembros se almacenan en el montón de cadenas. Por ejemplo, una tabla de métodos no almacena directamente el nombre de un método en particular, sino que apunta al nombre del método almacenado en el montón de cadenas.

si esto hace que el interés en ti refer-- https://msdn.microsoft.com/en-us/library/xcd8txaw%28v=vs.110%29.aspx