Partilhar via


Ilasm.exe (IL Montador)

O IL Assembler gera um arquivo executável portátil (PE) a partir do assembly de linguagem intermediária (IL). (Para mais informações sobre a IL, ver Processo de Execução Gerenciado.) Você pode executar o executável resultante, que contém IL e os metadados necessários, para determinar se o IL tem o desempenho esperado.

Esta ferramenta é instalada automaticamente com o Visual Studio. Para executar a ferramenta, use o Visual Studio Developer Command Prompt ou o Visual Studio Developer PowerShell.

Na linha de comandos, escreva o seguinte:

Sintaxe

ilasm [options] filename [[options]filename...]

Parâmetros

Argumento Description
filename O nome do arquivo de origem .il. Este arquivo consiste em diretivas de declaração de metadados e instruções IL simbólicas. Vários argumentos de arquivo de origem podem ser fornecidos para produzir um único arquivo PE com Ilasm.exe. Nota: Certifique-se de que a última linha de código no arquivo de origem .il tenha espaço em branco à direita ou um caractere de fim de linha.
Opção Description
/32bitpreferred Cria uma imagem preferida de 32 bits (PE32).
/alinhamento: integer Define FileAlignment com o valor especificado pelo integer cabeçalho NT Optional. Se a diretiva .alignment IL for especificada no arquivo, essa opção a substituirá.
/appcontainer Produz um arquivo .dll ou .exe que é executado no contêiner de aplicativos do Windows, como saída.
/braço Especifica a máquina RISC avançada (ARM) como o processador de destino.

Se nenhum bitness de imagem for especificado, o padrão será /32bitpreferred.
/base: integer Define ImageBase como o valor especificado pelo integer cabeçalho NT Optional. Se a diretiva IL .imagebase for especificada no arquivo, essa opção a substituirá.
/relógio Mede e relata os seguintes tempos de compilação em milissegundos para o arquivo de origem .il especificado:

Total Run: O tempo total gasto executando todas as operações específicas que se seguem.

Inicialização: Carregando e abrindo o arquivo.

MD emissor: Emissão de metadados.

Ref to Def Resolution: Resolvendo referências a definições no arquivo.

Geração de arquivos CEE: Gerando a imagem do arquivo na memória.

Gravação de arquivo PE: Gravando a imagem em um arquivo PE.
/debug[:IMPL|OPT] Inclui informações de depuração (nomes de variáveis e argumentos locais e números de linha). Cria um arquivo PDB.

/debug sem valor adicional desativa a otimização JIT e usa pontos de sequência do arquivo PDB.

IMPL desativa a otimização JIT e usa pontos de sequência implícitos.

O OPT permite a otimização JIT e usa pontos de sequência implícitos.
/dll Produz um arquivo .dll como saída.
/enc: file Cria deltas de Edição e Continuação a partir do arquivo de origem especificado.

Este argumento é apenas para uso académico e não é suportado para uso comercial.
/exe Produz um arquivo executável como saída. Esta é a predefinição.
/bandeiras: integer Define ImageFlags com o valor especificado pelo integer cabeçalho do common language runtime. Se a diretiva IL .corflags for especificada no arquivo, essa opção a substituirá. Consulte CorHdr.h, COMIMAGE_FLAGS para obter uma lista de valores válidos para inteiros.
/dobrar Dobra corpos de método idênticos em um.
/Altaentropia Produz um executável de saída que suporta ASLR (randomização de layout de espaço de endereçamento) de alta entropia. (Padrão para /appcontainer.)
/inclui: includePath Define um caminho para procurar ficheiros incluídos no #include.
/Itânio Especifica Intel Itanium como o processador de destino.

Se nenhum bitness de imagem for especificado, o padrão será /pe64.
/chave: keyFile Compila filename com uma assinatura forte usando a chave privada contida no keyFile.
/chave: @keySource Compila filename com uma assinatura forte usando a chave privada produzida em keySource.
/listagem Produz um arquivo de listagem na saída padrão. Se você omitir essa opção, nenhum arquivo de listagem será produzido.

Este parâmetro não é suportado no .NET Framework 2.0 ou posterior.
/mdv: versionString Define a cadeia de caracteres de versão de metadados.
/msv: major.minor Define a versão do fluxo de metadados, onde major e minor são inteiros.
/noautoinherit Desabilita a herança padrão de Object quando nenhuma classe base é especificada.
/nocorstub Suprime a geração do stub CORExeMain.
/nologo Suprime a exibição do banner de inicialização da Microsoft.
/saída: file.ext Especifica o nome e a extensão do arquivo de saída. Por padrão, o nome do arquivo de saída é o mesmo que o nome do primeiro arquivo de origem. A extensão padrão é .exe. Se você especificar a opção /dll , a extensão padrão será .dll. Nota: Especificar /output:myfile.dll não define a opção /dll. Se você não especificar /dll, o resultado será um arquivo executável chamado myfile.dll.
/otimizar Otimiza instruções longas para curtas. Por exemplo, br para br.s.
/PE64 Cria uma imagem de 64 bits (PE32+).

Se nenhum processador de destino for especificado, o padrão será /itanium.
/AO Cria um arquivo PDB sem habilitar o rastreamento de informações de depuração.
/silencioso Especifica o modo silencioso; não relata o progresso da montagem.
/recurso: file.res Inclui o arquivo de recurso especificado no formato *.res no arquivo .exe ou .dll resultante. Apenas um arquivo .res pode ser especificado com a opção /resource .
/ssver: int.int Define o número da versão do subsistema no cabeçalho opcional do NT. Para /appcontainer e /arm , o número mínimo da versão é 6.02.
/pilha: stackSize Define o valor SizeOfStackReserve no cabeçalho NT Optional como stackSize.
/stripreloc Especifica que nenhuma realocação de base é necessária.
/subsistema: integer Define o subsistema para o valor especificado pelo integer cabeçalho NT Optional. Se a diretiva IL .subsystem for especificada no arquivo, esse comando a substituirá. Consulte winnt.h, IMAGE_SUBSYSTEM para obter uma lista de valores válidos para integer.
/x64 Especifica um processador AMD de 64 bits como o processador de destino.

Se nenhum bitness de imagem for especificado, o padrão será /pe64.
/? Exibe a sintaxe do comando e as opções da ferramenta.

Nota

Todas as opções para Ilasm.exe não diferenciam maiúsculas de minúsculas e são reconhecidas pelas três primeiras letras. Por exemplo, /lis é equivalente a /listing e /res:myresfile.res é equivalente a /resource:myresfile.res. As opções que especificam argumentos aceitam dois pontos (:) ou um sinal de igual (=) como separador entre a opção e o argumento. Por exemplo, /output:file.ext é equivalente a /output=file.ext.

Observações

O IL Assembler ajuda os fornecedores de ferramentas a projetar e implementar geradores IL. Usando Ilasm.exe, os desenvolvedores de ferramentas e compiladores podem se concentrar na IL e na geração de metadados sem se preocupar em emitir IL no formato de arquivo PE.

Semelhante a outros compiladores que visam o tempo de execução, como C# e Visual Basic, Ilasm.exe não produz arquivos de objeto intermediários e não requer um estágio de vinculação para formar um arquivo PE.

O IL Assembler pode expressar todos os metadados existentes e recursos de IL das linguagens de programação que visam o tempo de execução. Isso permite que o código gerenciado escrito em qualquer uma dessas linguagens de programação seja adequadamente expresso no IL Assembler e compilado com Ilasm.exe.

Nota

A compilação pode falhar se a última linha de código no arquivo de origem .il não tiver espaço em branco à direita ou um caractere de fim de linha.

Você pode usá Ilasm.exe em conjunto com sua ferramenta complementar, Ildasm.exe. Ildasm.exe pega um arquivo PE que contém código IL e cria um arquivo de texto adequado como entrada para Ilasm.exe. Isso é útil, por exemplo, ao compilar código em uma linguagem de programação que não suporta todos os atributos de metadados de tempo de execução. Depois de compilar o código e executar a saída através Ildasm.exe, o arquivo de texto IL resultante pode ser editado manualmente para adicionar os atributos ausentes. Em seguida, você pode executar esse arquivo de texto através do Ilasm.exe para produzir um arquivo executável final.

Você também pode usar essa técnica para produzir um único arquivo PE a partir de vários arquivos PE originalmente gerados por diferentes compiladores.

Nota

Atualmente, você não pode usar essa técnica com arquivos PE que contêm código nativo incorporado (por exemplo, arquivos PE produzidos pelo Visual C++).

Para tornar esse uso combinado de Ildasm.exe e Ilasm.exe o mais preciso possível, por padrão, o assembler não substitui codificações curtas por codificações longas que você possa ter escrito em suas fontes IL (ou que possam ser emitidas por outro compilador). Use a opção /otimize para substituir codificações curtas sempre que possível.

Nota

Ildasm.exe só opera em arquivos no disco. Ele não opera em arquivos instalados no cache de assembly global.

Para obter mais informações sobre a gramática do IL, consulte o arquivo asmparse.grammar no SDK do Windows.

Informações sobre a Versão

A partir do .NET Framework 4.5, você pode anexar um atributo personalizado a uma implementação de interface usando um código semelhante ao seguinte:

.class interface public abstract auto ansi IMyInterface
{
  .method public hidebysig newslot abstract virtual
    instance int32 method1() cil managed
  {
  } // end of method IMyInterface::method1
} // end of class IMyInterface
.class public auto ansi beforefieldinit MyClass
  extends [mscorlib]System.Object
  implements IMyInterface
  {
    .interfaceimpl type IMyInterface
    .custom instance void
      [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 )
      …

A partir do .NET Framework 4.5, você pode especificar um BLOB marshal arbitrário (objeto binário grande) usando sua representação binária bruta, conforme mostrado no código a seguir:

.method public hidebysig abstract virtual
        instance void
        marshal({ 38 01 02 FF })
        Test(object A_1) cil managed

Para obter mais informações sobre a gramática do IL, consulte o arquivo asmparse.grammar no SDK do Windows.

Exemplos

O comando a seguir monta o arquivo IL myTestFile.il e produz o myTestFile.exe executável.

ilasm myTestFile

O comando a seguir monta o arquivo IL myTestFile.il e produz o arquivo .dll myTestFile.dll.

ilasm myTestFile /dll

O comando a seguir monta o arquivo IL myTestFile.il e produz o arquivo .dll myNewTestFile.dll.

ilasm myTestFile /dll /output:myNewTestFile.dll

O exemplo de código a seguir mostra um aplicativo extremamente simples que exibe "Hello World!" para o console. Você pode compilar esse código e, em seguida, usar a ferramenta Ildasm.exe para gerar um arquivo IL.

using System;

public class Hello
{
    public static void Main(String[] args)
    {
        Console.WriteLine("Hello World!");
    }
}

O exemplo de código IL a seguir corresponde ao exemplo de código C# anterior. Você pode compilar esse código em um assembly usando a ferramenta IL Monter. Os exemplos de código IL e C# exibem "Hello World!" no console.

// Metadata version: v2.0.50215
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}
.assembly sample
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
  .hash algorithm 0x00008004
  .ver 0:0:0:0
}
.module sample.exe
// MVID: {A224F460-A049-4A03-9E71-80A36DBBBCD3}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x02F20000

// =============== CLASS MEMBERS DECLARATION ===================

.class public auto ansi beforefieldinit Hello
       extends [mscorlib]System.Object
{
  .method public hidebysig static void  Main(string[] args) cil managed
  {
    .entrypoint
    // Code size       13 (0xd)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldstr      "Hello World!"
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  ret
  } // end of method Hello::Main

  .method public hidebysig specialname rtspecialname
          instance void  .ctor() cil managed
  {
    // Code size       7 (0x7)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0006:  ret
  } // end of method Hello::.ctor

} // end of class Hello

Consulte também