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