Ilasm.exe (Assemblador IL)

O Assemblador IL gera um ficheiro executável portátil (PE) a partir da assemblagem de idioma intermédio (IL). (Para obter mais informações sobre o IL, veja Processo de Execução Gerida.) Pode executar o executável resultante, que contém IL e os metadados necessários, para determinar se o IL funciona conforme esperado.

Esta ferramenta é instalada automaticamente com o Visual Studio. Para executar a ferramenta, utilize a Linha de Comandos do Programador do Visual Studio ou o PowerShell para Programadores do Visual Studio.

Na linha de comandos, escreva o seguinte:

Sintaxe

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

Parâmetros

Argumento Description
filename O nome do ficheiro de origem .il. Este ficheiro consiste em diretivas de declaração de metadados e instruções IL simbólicas. Podem ser fornecidos vários argumentos de ficheiro de origem para produzir um único ficheiro PE com Ilasm.exe. Nota: Certifique-se de que a última linha de código no ficheiro de origem .il tem um espaço em branco à direita ou um caráter de fim de linha.
Opção Descrição
/32bitpreferred Cria uma imagem preferencial de 32 bits (PE32).
/alinhamento:integer Define FileAlignment para o valor especificado por integer no cabeçalho NT Opcional. Se a diretiva .alignment IL for especificada no ficheiro, esta opção substitui-a.
/appcontainer Produz um ficheiro.dll ou .exe que é executado no contentor da aplicação Windows, como saída.
/arm Especifica a Máquina RISC Avançada (ARM) como o processador de destino.

Se não for especificada nenhuma bitness da imagem, a predefinição é /32bitpreferred.
/base:integer Define ImageBase para o valor especificado por integer no cabeçalho NT Opcional. Se a diretiva IL .imagebase estiver especificada no ficheiro, esta opção substitui-a.
/clock Mede e reporta os seguintes tempos de compilação em milissegundos para o ficheiro de origem .il especificado:

Execução Total: o tempo total despendido a executar todas as operações específicas que se seguem.

Arranque: carregar e abrir o ficheiro.

Emitir MD: emitir metadados.

Ref para Resolução de Def: Resolver referências a definições no ficheiro.

Geração de Ficheiros CEE: gerar a imagem de ficheiro na memória.

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

/debug with no additional value disables JIT optimization and uses sequence points from the PDB file.

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

O OPT ativa a otimização do JIT e utiliza pontos de sequência implícitos.
/dll Produz um ficheiro .dll como saída.
/enc:file Cria deltas edit-and-continue a partir do ficheiro de origem especificado.

Este argumento destina-se apenas à utilização académica e não é suportado para utilização comercial.
/exe Produz um ficheiro executável como saída. Esta é a predefinição.
/flags:integer Define ImageFlags para o valor especificado por integer no cabeçalho de runtime de linguagem comum. Se a diretiva .corflags IL estiver especificada no ficheiro, esta opção substitui-a. Veja CorHdr.h, COMIMAGE_FLAGS para obter uma lista de valores válidos para números inteiros.
/fold Dobra corpos de método idênticos num só.
/highentropyva Produz um executável de saída que suporta a aleatoriedade do esquema de espaço de endereços de alta entropia (ASLR). (Predefinição para /appcontainer.)
/include:includePath Define um caminho para procurar ficheiros incluídos com #include.
/itanium Especifica Intel Itanium como o processador de destino.

Se não for especificada nenhuma bitness da imagem, a predefinição é /pe64.
/key:keyFile Compila filename com uma assinatura forte com a chave privada contida no keyFile.
/key: @keySource Compila filename com uma assinatura forte com a chave privada produzida em keySource.
/listing Produz um ficheiro de listagem na saída padrão. Se omitir esta opção, não é produzido nenhum ficheiro de listagem.

Este parâmetro não é suportado no .NET Framework 2.0 ou posterior.
/mdv:versionString Define a cadeia de versão de metadados.
/msv:major.minor Define a versão do fluxo de metadados, onde major e minor são números inteiros.
/noautoinherit Desativa a herança predefinida quando Object não é especificada nenhuma classe base.
/nocorstub Suprime a geração do stub CORExeMain.
/nologo Suprime o ecrã da faixa de arranque da Microsoft.
/output:file.ext Especifica o nome e a extensão do ficheiro de saída. Por predefinição, o nome do ficheiro de saída é o mesmo que o nome do primeiro ficheiro de origem. A extensão predefinida é .exe. Se especificar a opção /dll , a extensão predefinida é .dll. Nota: Especificar /output:myfile.dll não define a opção /dll . Se não especificar /dll, o resultado será um ficheiro executável com o nome myfile.dll.
/optimize Otimiza instruções longas para abreviar. Por exemplo, br para br.s.
/pe64 Cria uma imagem de 64 bits (PE32+).

Se não for especificado nenhum processador de destino, a predefinição é /itanium.
/pdb Cria um ficheiro PDB sem ativar o controlo de informações de depuração.
/quiet Especifica o modo de sossego; não comunica o progresso da assemblagem.
/resource:file.res Inclui o ficheiro de recursos especificado no formato *.res no ficheiro de.exe ou .dll resultante. Só é possível especificar um ficheiro .res com a opção /resource .
/ssver:int.int Define o número da versão do subsistema no cabeçalho opcional NT. Para /appcontainer e /arm , o número mínimo da versão é 6,02.
/stack:stackSize Define o valor SizeOfStackReserve no cabeçalho NT Opcional como stackSize.
/stripreloc Especifica que não são necessárias reposicionamentos de base.
/subsistema:integer Define o subsistema para o valor especificado por integer no cabeçalho NT Opcional. Se a diretiva .subsystem IL estiver especificada no ficheiro, este comando substitui-a. Veja winnt.h, IMAGE_SUBSYSTEM para obter uma lista de valores válidos para integer.
/x64 Especifica um processador AMD de 64 bits como processador de destino.

Se não for especificada nenhuma bitness da imagem, a predefinição é /pe64.
/? Apresenta a sintaxe do comando e as opções da ferramenta.

Nota

Todas as opções para Ilasm.exe não são sensíveis a maiúsculas e 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 Assemblador IL ajuda os fornecedores de ferramentas a conceber e implementar geradores IL. A utilização deIlasm.exe, os programadores de ferramentas e compiladores podem concentrar-se na geração de IL e metadados sem se preocuparem com a emissão de IL no formato de ficheiro PE.

Semelhante a outros compiladores que visam o runtime, como C# e Visual Basic, Ilasm.exe não produz ficheiros de objetos intermédios e não requer uma fase de ligação para formar um ficheiro PE.

O Assemblador IL pode expressar todos os metadados existentes e as funcionalidades IL das linguagens de programação que visam o runtime. Isto permite que o código gerido escrito em qualquer uma destas linguagens de programação seja expresso adequadamente no Il Assembler e compilado com Ilasm.exe.

Nota

A compilação poderá falhar se a última linha de código no ficheiro de origem .il não tiver espaço em branco à direita ou um caráter de fim de linha.

Pode utilizar Ilasm.exe em conjunto com a respetiva ferramenta complementar ,Ildasm.exe. Ildasm.exe utiliza um ficheiro PE que contém código IL e cria um ficheiro de texto adequado como entrada para Ilasm.exe. Isto é útil, por exemplo, ao compilar código numa linguagem de programação que não suporta todos os atributos de metadados de runtime. Depois de compilar o código e executar a saída através doIldasm.exe, o ficheiro de texto IL resultante pode ser editado à mão para adicionar os atributos em falta. Em seguida, pode executar este ficheiro de texto através do Ilasm.exe para produzir um ficheiro executável final.

Também pode utilizar esta técnica para produzir um único ficheiro PE a partir de vários ficheiros PE gerados originalmente por compiladores diferentes.

Nota

Atualmente, não pode utilizar esta técnica com ficheiros PE que contenham código nativo incorporado (por exemplo, ficheiros PE produzidos pelo Visual C++).

Para tornar esta utilização combinada de Ildasm.exe e Ilasm.exe o mais precisa possível, por predefinição, o assemblador não substitui as codificações curtas por longas que possa ter escrito nas origens IL (ou que possam ser emitidas por outro compilador). Utilize a opção /optimize para substituir as codificações curtas sempre que possível.

Nota

Ildasm.exe opera apenas em ficheiros no disco. Não funciona em ficheiros instalados na cache de assemblagem global.

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

Informações sobre a Versão

A partir do .NET Framework 4.5, pode anexar um atributo personalizado a uma implementação de interface através de 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, pode especificar um BLOB de marshal arbitrário (objeto binário grande) utilizando a sua representação binária não processada, conforme mostrado no seguinte código:

.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 ficheiro asmparse.grammar no SDK do Windows.

Exemplos

O comando seguinte reúne o ficheiro IL myTestFile.il e produz o executávelmyTestFile.exe.

ilasm myTestFile

O comando seguinte reúne o ficheiro IL myTestFile.il e produz o ficheiro .dllmyTestFile.dll.

ilasm myTestFile /dll

O comando seguinte reúne o ficheiro IL myTestFile.il e produz o ficheiro .dllmyNewTestFile.dll.

ilasm myTestFile /dll /output:myNewTestFile.dll

O exemplo de código seguinte mostra uma aplicação extremamente simples que apresenta "Hello World!" na consola. Pode compilar este código e, em seguida, utilizar a ferramenta Ildasm.exe para gerar um ficheiro IL.

using System;

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

O seguinte exemplo de código IL corresponde ao exemplo de código C# anterior. Pode compilar este código numa assemblagem com a ferramenta Assembler IL. Os exemplos de código IL e C# apresentam "Hello World!" na consola do .

// 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

Ver também