Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Para compreender melhor os metadados e sua função no Common Language Runtime, pode ser útil criar um programa simples e ilustrar como os metadados afetam sua própria vida em tempo de execução.O exemplo de código a seguir mostra dois métodos dentro de uma classe chamada MyApp.O método Main é o ponto de entrada do programa, enquanto o método Add simplesmente retorna a soma dos dois argumentos inteiros.
Public Class MyApp
Public Shared Sub Main()
Dim ValueOne As Integer = 10
Dim ValueTwo As Integer = 20
Console.WriteLine("The Value is: {0}", Add(ValueOne, ValueTwo))
End Sub
Public Shared Function Add(One As Integer, Two As Integer) As Integer
Return (One + Two)
End Function
End Class
using System;
public class MyApp
{
public static int Main()
{
int ValueOne = 10;
int ValueTwo = 20;
Console.WriteLine("The Value is: {0}", Add(ValueOne, ValueTwo));
return 0;
}
public static int Add(int One, int Two)
{
return (One + Two);
}
}
Quando o código é executado, o tempo de execução carrega o módulo na memória e consulta os metadados para esta classe.Quando carregado, o tempo de execução executa uma análise abrangente do fluxo MSIL do método para convertê-lo em instruções rápidas nativas da máquina.O tempo de execução usa um compilador just-in-time (JIT) para converter as instruções MSIL para código nativo máquina, um método de cada vez, conforme necessário.
O exemplo a seguir mostra parte do MSIL produzido a partir da função Main do código anterior.Você pode visualizar o MSIL e os metadados de qualquer aplicativo .NET Framework usando o Desassemblador do MSIL (ILDASM.exe).
.entrypoint
.maxstack 3
.locals ([0] int32 ValueOne,
[1] int32 ValueTwo,
[2] int32 V_2,
[3] int32 V_3)
IL_0000: ldc.i4.s 10
IL_0002: stloc.0
IL_0003: ldc.i4.s 20
IL_0005: stloc.1
IL_0006: ldstr "The Value is: {0}"
IL_000b: ldloc.0
IL_000c: ldloc.1
IL_000d: call int32 ConsoleApplication.MyApp::Add(int32,int32) /* 06000003 */
O compilador JIT lê o MSIL para o método inteiro, analisa-o completamente, e gera instruções nativas eficientes para o método.Em IL_000d, um token de metadados para o método Add (/* 06000003 */) é encontrado e o tempo de execução usa o token para consultar a terceira linha da tabela MethodDef.
A tabela a seguir mostra parte da tabela MethodDef referenciada pelo token de metadados que descreve o método Add.Enquanto outras tabelas de metadados existirem neste assembly e tiverem seus próprios valores exclusivos, somente esta tabela é examinada.
Linha |
Endereço virtual relativo (RVA) |
ImplFlags |
Sinalizadores |
Nome (Aponta para o heap de sequência de caracteres.) |
Assinatura (Aponta para o heap de blob.) |
|---|---|---|---|---|---|
1 |
0x00002050 |
IL Managed |
Público ReuseSlot SpecialName RTSpecialName .ctor |
.ctor (construtor) |
|
2 |
0x00002058 |
IL Managed |
Público Estático ReuseSlot |
Main |
String |
3 |
0x0000208c |
IL Managed |
Público Estático ReuseSlot |
Adicionar |
int, int, int |
Cada coluna da tabela contém informações importantes sobre seu código.A coluna RVA permite que o ambiente de tempo de execução calcule o endereço de memória inicial do MSIL que define este método.As colunas ImplFlags e Sinalizadores contêm máscaras de bits que descrevem o método (por exemplo, se o método é público ou privado).A coluna Nome indexa o nome do método a partir do heap de sequência de caracteres.A coluna Assinatura indexa a definição da assinatura do método no heap de blob.
O ambiente de tempo de execução calcula o endereço de deslocamento desejado a partir da coluna RVA na terceira linha e retorna este endereço para o compilador JIT, que depois passa para o novo endereço.O compilador JIT continua a processar o MSIL no novo endereço até encontrar outro token de metadados, e o processo é repetido.
Usando metadados, o ambiente de tempo de execução tem acesso a todas as informações necessárias para carregar seu código e processá-lo em instruções de máquina nativas.Desta maneira, os metadados permitem arquivos autodescritivos e, juntamente com o CTS, herança entre linguagens.
Consulte também
Conceitos
Compilação MSIL para código nativo