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
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários