2012-01-14 17 views
29

Ho cercato su Google diversi siti per capire cosa sia metadata in .NET e ciò significa.Che cosa sono i metadati in .NET?

Sono ancora nuovo alla programmazione di applicazioni desktop C# WPF. Quando ero alla programmazione web, ci sono meta tag nel codice HTML dove descriviamo il sito con titoli, parole chiave e così via. È simile anche nell'applicazione .NET? Leggo il wiki e su Google, ma tutto quello che ottengo è una spiegazione concettuale.

Uno descrive "metadata is data that describes the state of the assembly and a detailed description of each type, attribute within the assembly". I metadati sono solo un concetto o qualcosa di fisico come una linea di codici che ho digitato da qualche parte per descrivere il mio codice? Se è così, il mio elogio diventa il mio metadata?

Ho letto i metadati è "Within the Common Language Runtime (CLR)", ma codice solo in C#, come posso codificare in CLR nei metadati? I metadati sono elogiati in CLR? Come posso cambiarlo.

MSDN ha scritto che i metadati sono informazioni binarie per il componente software di un'altra lingua per capirlo. Ho pensato solo a una descrizione dei bisogni umani (encomio) in inglese per capire cosa fa un blocco di codice. Il componente software esegue semplicemente qualsiasi dichiarazione che abbiamo scritto - qual è la necessità delle informazioni "binarie". Come può il compilatore capire il significato del mio codice di alto livello per generare "Descrizione dell'assemblaggio"? Se scrivo un programma che converte la valuta, i metadati generati automaticamente sapendo che il programma sta convertendo valuta? Dov'è questa intelligenza?

Sono completamente confuso.

risposta

15

Dal altri già fornito ottimi risposte esplicative, mi limiterò a ricordare come è possibile visualizzare i metadati da soli.

Nella directory di Microsoft SDK (molto probabilmente variazioni di C: \ Program Files \ Microsoft SDK \ Windows \ v7.0A \ Bin \ netfx 4.0 Strumenti) c'è programma chiamato ildasm.exe - è semplice disassembler che permette di visualizzare binari compilati .NET.

È possibile creare un'applicazione console molto semplice e utilizzare ildasm.exe per visualizzare il contenuto compilato. Visualizza/MetaInfo/Mostra! Il comando (o semplicemente Ctrl + M) visualizzerà i metadati: è possibile verificare come sono. Parte dei metadati dall'applicazione stampa Hello consolare:

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) 

Qui potete vedere definizione del tipo (Program) e uno dei suoi metodi (Main), che prende argomento di input singolo e restituisce void. Questa è naturalmente solo una parte dei metadati, anche per i programmi più semplici c'è molto di più.

+1

+1 Devo prendere questa come risposta perché rende la lettura di altre risposte sensata e chiara la mia confusione. – KMC

14

Se hai familiarità con .NET Reflection puoi pensare ai metadati come "i dati a cui Reflection accede". Ogni assembly .NET memorizza informazioni sui tipi e sui metodi che contiene, gli attributi su quei metodi, ecc. Non sarebbe necessario memorizzarlo solo per eseguire il codice (gli EXE nativi non hanno quel tipo di informazioni), ma ne ha bisogno per altri scopi, come l'applicazione della sicurezza dichiarativa e l'attivazione di Reflection.

Quindi i metadata sono "qualcosa di fisico", ma la maggior parte viene generata automaticamente dal codice che scrivi. L'aggiunta di attributi alle tue classi o ai tuoi metodi è probabilmente l'unico modo per cambiare direttamente i metadati. In particolare, i commenti del codice sorgente non verranno memorizzati nell'assembly come metadati (o in altro modo).

La pagina di Wikipedia su questo è abbastanza buono: http://en.wikipedia.org/wiki/.NET_metadata

Edit: No, i metadati non è come commenti. È semplicemente "dati sul codice", che non fa parte del codice stesso (non è necessario per eseguire il programma). Non è affatto come i metadati HTML. Un esempio di metadati è il fatto che l'assembly contiene una classe denominata "MyClass" e quella classe contiene un metodo chiamato "DoSomething" con determinati parametri, ecc. Quindi non è niente di misterioso - solo cose "ovvie" principalmente.

+0

ho letto il Wiki, e io sono confuso. I metadati dovrebbero descrivere il mio codice come un encomio no? Come potrebbe il computer capire il mio scopo e generarlo per me? In HTML i meta tag sono digitati manualmente con parole chiave e titolo per descrivere la pagina, il browser non sarebbe abbastanza intelligente per comprendere il contenuto della pagina e generare parole chiave e titolo per me? uomo sono tutto confuso .. – KMC

+0

quindi i metadati acquisiscono identificatori per classe, metodi, variabili ecc. Qual è il punto di questo? Ottenere il nome dell'identificatore = descrivere i miei dati? Anche se la firma del metodo riassume anche le informazioni in un metodo ... ancora più confuso. scusa. per favore aiuto – KMC

+0

A destra, la firma del metodo fa parte dei metadati. Solo per chiamare il metodo sarebbe sufficiente conoscere l'offset binario del metodo e il suo numero e la dimensione dei parametri. Tuttavia, .NET memorizza la firma completa: nome del metodo, tipo di ritorno, tipo e nome esatti di ciascun parametro, eventuali attributi sul metodo o parametri, ecc. Questi sono i metadati. Il punto è di abilitare Reflection (e alcune altre cose). – EMP

4

Semplicemente, i metadati sono informazioni memorizzate sul tuo programma che puoi esaminare con un numero di mezzi uno, in.NET uno di questi metodi viene comunemente chiamato Reflection

I metadati descrivono tipi (ad esempio classi, interfacce, ...), metodi e parametri (nomi e tipi) e attributi che sono stati applicati. Puoi utilizzare queste informazioni in diversi modi, ad es. i sistemi di test come nunit e msstest (tra gli altri) usano i metadati per "scoprire" i test all'interno di un assembly; altri modi in cui i metadati possono essere utilizzati sono in database.

Ci sono tanti modi per utilizzarlo - hanno persino libri su di esso (ben sezioni almeno http://my.safaribooksonline.com/book/programming/csharp/9781449379629/reflection-and-metadata/729)

+0

Se ho un metodo "myMethod", come lo descrivono i metadati? Il compilatore non sa cosa significa il metodo e lo esegue solo, come potrebbe essere generata la descrizione se non manualmente digitata da me stesso? Confuso. – KMC

+0

Esattamente, i metadati sono informazioni come il nome del tipo, il nome del metodo, il nome dei parametri, il nome delle variabili locali ... –

+1

Dai un'occhiata a [ILSpy] (http://wiki.sharpdevelop.net/ ILSpy.ashx) per vedere i metadati che vengono utilizzati per interpretare IL e restituire il codice sorgente "equivalente". –

2

non rendono complicato è solo --- Dati (informazioni) sui dati.

basti pensare al tag Meta in HTML, contiene informazioni su pagina, parola chiave, autore, ultima modifica. significa che contiene informazioni su un dato che è la tua pagina html.

Quando parliamo in termini di C#, I metadati sono archiviati in una sezione di un file PE (eseguibile) portatile di .NET Framework, mentre il linguaggio intermedio Microsoft (MSIL) è archiviato in un'altra sezione del file PE. La parte dei metadati del file contiene una serie di strutture di dati della tabella e dell'heap. La parte MSIL contiene i token di MSIL e metadati che fanno riferimento alla parte dei metadati del file PE. Ogni tabella di metadati contiene informazioni sugli elementi del programma. Ad esempio, una tabella di metadati descrive le classi nel codice, un'altra tabella descrive i campi e così via. Se hai dieci classi nel tuo codice, la tabella delle classi avrà decine di righe, una per ogni classe. Le tabelle dei metadati fanno riferimento ad altre tabelle e heap. Ad esempio, la tabella dei metadati per le classi fa riferimento alla tabella per i metodi. I metadati memorizzano inoltre le informazioni in quattro strutture heap: stringa, blob, stringa utente e GUID. Tutte le stringhe utilizzate per denominare tipi e membri sono memorizzate nell'heap delle stringhe. Ad esempio, una tabella dei metodi non memorizza direttamente il nome di un particolare metodo, ma punta al nome del metodo memorizzato nell'heap delle stringhe.

se questo fa l'interesse in voi refer-- https://msdn.microsoft.com/en-us/library/xcd8txaw%28v=vs.110%29.aspx