Ildasm.exe (Il Disassembler)

O Il Disassembler é uma ferramenta complementar para o Assemblador IL (Ilasm.exe). Ildasm.exe utiliza um ficheiro executável portátil (PE) que contém código de idioma intermédio (IL) e cria um ficheiro de texto adequado como entrada para Ilasm.exe.

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

ildasm [options] [PEfilename] [options]

Parâmetros

As seguintes opções estão disponíveis para ficheiros.exe, .dll, .obj, .lib e .winmd .

Opção Descrição
/out=filename Cria um ficheiro de saída com o especificado filename, em vez de apresentar os resultados numa interface gráfica.
/rtf Produz a saída em formato rtf. Inválido com a opção /text .
/text Apresenta os resultados na janela da consola, em vez de numa interface gráfica ou como um ficheiro de saída.
/html Produz a saída no formato HTML. Válido apenas com a opção /output .
/? Apresenta a sintaxe do comando e as opções da ferramenta.

As seguintes opções adicionais estão disponíveis para os ficheiros .exe, .dlle .winmd .

Opção Descrição
/bytes Mostra bytes reais, em formato hexadecimal, como comentários de instruções.
/caverbal Produz blobs de atributos personalizados em formato verbal. A predefinição é o formulário binário.
/linenum Inclui referências a linhas de origem originais.
/nobar Suprime a janela de pop-up do indicador de progresso desmontado.
/noca Suprime a saída de atributos personalizados.
/project Apresenta metadados da forma como aparece no código gerido, em vez da forma como é apresentado no Windows Runtime nativo. Se PEfilename não for um ficheiro de metadados do Windows (.winmd), esta opção não tem qualquer efeito. Consulte .NET Framework Suporte para Aplicações e Windows Runtime da Loja Windows.
/pubonly Desmonta apenas os tipos e membros públicos. Equivalente a /visibility:PUB.
/quoteallnames Inclui todos os nomes entre plicas.
/raweh Mostra cláusulas de processamento de exceções na forma não processada.
/source Mostra as linhas de origem originais como comentários.
/tokens Mostra tokens de metadados de classes e membros.
/visibility:vis [+vis...] Desmonta apenas tipos ou membros com a visibilidade especificada. Seguem-se valores válidos para vis:

PUB — Público

PRI — Privado

FAM — Família

ASM – Assemblagem

FAA — Família e Assemblagem

FOA — Família ou Assemblagem

PSC – Âmbito Privado

Para obter definições destes modificadores de visibilidade, consulte MethodAttributes e TypeAttributes.

As seguintes opções são válidas para ficheiros.exe, .dlle .winmd apenas para saídas de ficheiros ou consolas.

Opção Descrição
/all Especifica uma combinação das opções /header, /bytes, /stats, /classlist e /tokens .
/classlist Inclui uma lista de classes definidas no módulo.
/forward Utiliza a declaração de classe reencaminhada.
/headers Inclui informações de cabeçalho de ficheiro na saída.
/item:class [::member [(sig]] Desmonta o seguinte consoante o argumento fornecido:

- Desmonta o especificado class.
- Desmonta a especificação member de class.
- Desmonta o member do class com a assinatura sigespecificada . O formato de sig é:
[instance] returnType(parameterType1, parameterType2, …, parameterTypeN)
Nota No .NET Framework versões 1.0 e 1.1, sig tem de ser seguido de um parêntese de fecho: (sig). A partir do Net Framework 2.0, o parêntese de fecho tem de ser omitido: (sig.
/noil Suprime a saída do código de assemblagem IL.
/stats Inclui estatísticas na imagem.
/typelist Produz a lista completa de tipos, para preservar a ordenação de tipos numa viagem de ida e volta.
/unicode Utiliza a codificação Unicode para a saída.
/utf8 Utiliza a codificação UTF-8 para a saída. ANSI é a predefinição.

As seguintes opções são válidas para ficheiros.exe, .dll, .obj, .lib e .winmd apenas para saídas de ficheiros ou consolas.

Opção Descrição
/metadata[=specifier] Mostra metadados, onde specifier está:

MDHEADER – mostrar as informações e tamanhos do cabeçalho de metadados.

HEX – mostrar informações em hexadecim e em palavras.

CSV – mostrar as contagens de registos e os tamanhos da área dinâmica para dados.

UNREX – mostrar externos não resolvidos.

SCHEMA – mostrar as informações de esquema e cabeçalho de metadados.

RAW — Mostrar as tabelas de metadados não processados.

HEAPS – mostrar as áreas dinâmicas para dados não processados.

VALIDATE — Valide a consistência dos metadados.

Pode especificar /metadados várias vezes, com valores diferentes para specifier.

As seguintes opções são válidas para ficheiros .lib apenas para saídas de ficheiros ou consolas.

Opção Descrição
/objectfile=filename Mostra os metadados de um único ficheiro de objeto na biblioteca especificada.

Nota

Todas as opções para Ildasm.exe não são sensíveis a maiúsculas e minúsculas e são reconhecidas pelas três primeiras letras. Por exemplo, /quo é equivalente a /quoteallnames. 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:filename é equivalente a /output=filename.

Observações

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

O ficheiro de texto produzido por Ildasm.exe pode ser utilizado como entrada para o Assemblador IL (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 Assemblador IL para produzir um ficheiro executável final.

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++).

Pode utilizar a GUI predefinida no Desassemblador IL para ver os metadados e o código desmontado de qualquer ficheiro PE existente numa vista de árvore hierárquica. Para utilizar a GUI, escreva ildasm na linha de comandos sem fornecer o argumento PEfilename ou quaisquer opções. No menu Ficheiro , pode navegar para o ficheiro PE que pretende carregar para oIldasm.exe. Para guardar os metadados e o código desmontado apresentado para o PE selecionado, selecione o comando Captura no menu Ficheiro . Para guardar apenas a vista de árvore hierárquica, selecione o comando Capturar Vista de Árvore no menu Ficheiro . Para obter um guia detalhado sobre como carregar um ficheiro para oIldasm.exe e interpretar a saída, veja o Tutorial Ildasm.exe , localizado na pasta Exemplos que é fornecida com o SDK do Windows.

Se fornecer Ildasm.exe com um argumento PEfilename que contém recursos incorporados, a ferramenta produz vários ficheiros de saída: um ficheiro de texto que contém código IL e, para cada recurso gerido incorporado, um ficheiro .resources produzido com o nome do recurso a partir de metadados. Se um recurso não gerido estiver incorporado em PEfilename, é produzido um ficheiro .res com o nome de ficheiro especificado para a saída IL pela opção /output .

Nota

Ildasm.exe mostra apenas descrições de metadados para ficheiros de entrada .obj e .lib . O código IL para estes tipos de ficheiro não é desmontado.

Pode executar Ildasm.exe através de an.exe ou .dll ficheiro para determinar se o ficheiro é gerido. Se o ficheiro não for gerido, a ferramenta apresenta uma mensagem a indicar que o ficheiro não tem um cabeçalho de runtime de linguagem comum válido e que não pode ser desmontado. Se o ficheiro for gerido, a ferramenta é executada com êxito.

Informações sobre a Versão

A partir do .NET Framework 4.5, Ildasm.exe processa um BLOB de marshal não reconhecido (objeto binário grande) ao apresentar o conteúdo binário não processado. Por exemplo, o código seguinte mostra como um BLOB de marshal gerado por um programa C# é apresentado:

public void Test([MarshalAs((short)70)] int test) { }
// IL from Ildasm.exe output
.method public hidebysig instance void Test(int32  marshal({ 46 }) test) cil managed

A partir do .NET Framework 4.5, Ildasm.exe apresenta atributos que são aplicados às implementações da interface, conforme mostrado no seguinte excerto de Ildasm.exe saída:

.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 )
      …

Exemplos

O comando seguinte faz com que os metadados e o código desmontado para o ficheiro MyHello.exe PE seja apresentado na GUI predefinidaIldasm.exe .

ildasm myHello.exe

O comando seguinte desmonta o ficheiro MyFile.exe e armazena o texto do Assemblador IL resultante no ficheiro MyFile.il.

ildasm MyFile.exe /output:MyFile.il

O comando seguinte desmonta o ficheiro MyFile.exe e apresenta o texto do Assemblador IL resultante na janela da consola.

ildasm MyFile.exe /text

Se o ficheiro MyApp.exe contiver recursos geridos e não geridos incorporados, o seguinte comando produz quatro ficheiros: MyApp.il, MyApp.res, Icons.resources e Message.resources:

ildasm MyApp.exe /output:MyApp.il

O comando seguinte desmonta o método MyMethod dentro da classe MyClass em MyFile.exe e apresenta o resultado na janela da consola.

ildasm /item:MyClass::MyMethod MyFile.exe /text

No exemplo anterior, podem existir vários métodos denominados MyMethod com assinaturas diferentes. O comando seguinte desmonta o método MyMethod de instância com o tipo de retorno de vazio e os tipos de parâmetro int32 e cadeia.

ildasm /item:"MyClass::MyMethod(instance void(int32,string)" MyFile.exe /text

Nota

No .NET Framework versões 1.0 e 1.1, o parêntese esquerdo que segue o nome do método tem de ser equilibrado por um parêntese direito após a assinatura: MyMethod(instance void(int32)). A partir do .NET Framework 2.0, o parêntese de fecho tem de ser omitido: MyMethod(instance void(int32).

Para obter um static método (Shared método no Visual Basic), omita a palavra-chave instance. Os tipos de classe que não são tipos primitivos como int32 e string têm de incluir o espaço de nomes e têm de ser precedidos pela palavra-chave class. Os tipos externos têm de ser precedidos pelo nome da biblioteca entre parênteses retos. O comando seguinte desmonta um método estático com o nome MyMethod que tem um parâmetro do tipo AppDomain e tem um tipo de retorno de AppDomain.

ildasm /item:"MyClass::MyMethod(class [mscorlib]System.AppDomain(class [mscorlib]System.AppDomain)" MyFile.exe /text

Um tipo aninhado tem de ser precedido pela classe que contém, delimitado por uma barra para a frente. Por exemplo, se a MyNamespace.MyClass classe contiver uma classe aninhada chamada NestedClass, a classe aninhada é identificada da seguinte forma: class MyNamespace.MyClass/NestedClass.

Ver também