Uso de metadados em tempo de execução

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 para MSIL

Compilação MSIL para código nativo

Outros recursos

Estrutura e uso de metadados