Ildasm.exe (IL Disassembler)

O IL Disassembler é uma ferramenta complementar ao IL Assembler (Ilasm.exe). O Ildasm.exe usa um arquivo PE que contém o código IL (linguagem intermediária) e cria um arquivo de texto adequado como entrada para Ilasm.exe.

Essa ferramenta é instalada automaticamente com o Visual Studio. Para executar a ferramenta, use o Prompt de Comando do Desenvolvedor do Visual Studio ou o PowerShell do Desenvolvedor do Visual Studio.

No prompt de comando, digite o seguinte:

Sintaxe

ildasm [options] [PEfilename] [options]

Parâmetros

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

Opção Descrição
/out=filename Cria um arquivo de saída com o filename especificado, em vez de exibir os resultados em uma interface gráfica do usuário.
/rtf Produz saída em formato rich text. Inválido com a opção /text.
/text Exibe os resultados na janela de console, e não em uma interface gráfica do usuário ou como um arquivo de saída.
/html Produz saída em formato HTML. Válido apenas com a opção /output.
/? Exibe a sintaxe de comando e as opções para a ferramenta.

As opções adicionais a seguir estão disponíveis para arquivos .exe, .dll e .winmd.

Opção Descrição
/bytes Mostra bytes reais, em formato hexadecimal, como comentários de instrução.
/caverbal Produz blobs de atributo personalizado em forma verbal. O padrão é a forma binária.
/linenum Inclua referências para linhas de origem.
/nobar Suprime a janela pop-up do indicador de andamento da desmontagem.
/noca Suprime a saída de atributos personalizados.
/project Exibe metadados da maneira como são exibidos para o código gerenciado, e não da maneira como são exibidos no Windows Runtime nativo. Se PEfilename não for um arquivo de metadados do Windows (.winmd), esta opção não terá nenhum efeito. Consulte Suporte do .NET Framework para aplicativos da Windows Store e Windows Runtime.
/pubonly Desmonta apenas tipos e membros públicos. Equivalente a /visibility:PUB.
/quoteallnames Inclui todos os nomes entre aspas simples.
/raweh Mostra cláusulas de tratamento de exceções na forma bruta.
/source Mostra linhas de origem como comentários.
/tokens Mostra tokens de metadados de classes e membros.
/visibility:vis[+vis...] Desmonta apenas tipos ou membros com a visibilidade especificada. A seguir estão os valores válidos para vis:

PUB — Público

PRI — Privado

FAM — Família

ASM — Assembly

FAA — Família e Assembly

FOA — Família ou Assembly

PSC — Escopo Privado

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

As opções a seguir são válidas para arquivos .exe, .dll e .winmd apenas para saída de arquivo ou de console.

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 Usa declaração da classe de encaminhamento.
/headers Inclui informações de cabeçalho do arquivo na saída.
/item:class[::member[(sig]] Desmonta o seguinte, dependendo do argumento fornecido:

– Desmonta o class especificado.
– Desmonta o member especificado do class.
– Desmonta o member do class com a assinatura especificada sig. O formato de sig é:
[instance] returnType(parameterType1, parameterType2, …, parameterTypeN)
Observação No .NET Framework versões 1.0 e 1.1, sig deve ser seguido de um parêntese de fechamento: (sig). Desde o .NET Framework 2.0, o parêntese de fechamento deve ser omitido: (sig.
/noil Suprime saída de código do assembly IL.
/stats Inclui estatísticas na imagem.
/typelist Produz a lista completa de tipos, para preservar a ordenação de tipos em uma viagem de ida e volta.
/unicode Usa codificação Unicode para a saída.
/utf8 Usa codificação UTF-8 para a saída. ANSI é o padrão.

As opções a seguir são válidas para arquivos .exe, .dll, .obj, .lib e .winmd apenas para saída de arquivo ou de console.

Opção Descrição
/metadata[=specifier] Mostra metadados, em que specifier é:

MDHEADER — Mostra as informações de cabeçalho dos metadados e os tamanhos.

HEX — Mostra informações em hexadecimal, bem como em palavras.

CSV — Mostra as contagens de registros e os tamanhos de heap.

UNREX — Mostra externos não resolvidos.

SCHEMA — Mostra as informações de cabeçalho dos metadados e de esquema.

RAW — Mostra as tabelas de metadados brutos.

HEAPS — Mostra os heaps brutos.

VALIDATE — Valida a consistência dos metadados.

É possível especificar /metadata várias vezes, com valores diferentes para specifier.

As opções a seguir são válidas para arquivos .lib apenas para saída de arquivo ou de console.

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

Observação

Todas as opções de Ildasm.exe não diferenciam maiúsculas de 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 igualdade (=) como o separador entre a opção e o argumento. Por exemplo, /output:filename é equivalente a /output=filename.

Comentários

Ildasm.exe funciona apenas em arquivos PE no disco. Ele não funciona em arquivos instalados no cache de assembly global.

O arquivo de texto produzido por Ildasm.exe pode ser usado como entrada para o IL Assembler (Ilasm.exe). Isso é útil, por exemplo, durante a compilação do código em uma linguagem de programação que não dá suporte a todos os atributos de metadados do runtime. Depois de compilar o código e executar sua saída por meio de Ildasm.exe, o arquivo de texto IL resultante poderá ser editado manualmente para adicionar os atributos ausentes. Em seguida, é possível executar esse arquivo de texto por meio do IL Assembler para produzir um arquivo executável final.

Observação

Atualmente, não é possível usar essa técnica com arquivos PE que contenham código nativo inserido (por exemplo, arquivos PE produzidos por Visual C++).

É possível usar a GUI padrão no IL Disassembler para exibir os metadados e o código desmontado de qualquer arquivo PE existente em uma exibição de árvore hierárquica. Para usar a GUI, digite ildasm na linha de comando sem fornecer o argumento PEfilename ou nenhuma opção. No menu Arquivo, é possível navegar até o arquivo PE que você deseja carregar em Ildasm.exe. Para salvar os metadados e o código desmontado exibido para o PE selecionado, selecione o comando Despejo no menu Arquivo. Para salvar apenas o modo de exibição de árvore hierárquica, selecione o comando Despejar Modo de Exibição de Árvore no menu Arquivo. Para obter um guia detalhado para carregar um arquivo em Ildasm.exe e interpretar a saída, confira o Tutorial de Ildasm.exe, localizado na pasta Exemplos que acompanha o SDK do Windows.

Se você fornecer o Ildasm.exe com um argumento PEfilename que contenha recursos inseridos, a ferramenta produzirá vários arquivos de saída: um arquivo de texto contendo o código IL e, para cada recurso gerenciado inserido, um arquivo .resources produzido usando o nome do recurso dos metadados. Se um recurso não gerenciado for inserido em PEfilename, um arquivo .res será produzido usando o nome de arquivo especificado para a saída IL pela opção /output.

Observação

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

É possível executar Ildasm.exe em um arquivo .exe ou .dll para determinar se o arquivo é gerenciado. Se o arquivo não for gerenciado, a ferramenta exibirá uma mensagem informando que o arquivo não tem cabeçalho de Common Language Runtime válido e não pode ser desmontado. Se o arquivo for gerenciado, a ferramenta será executada com êxito.

Informações sobre versão

Do .NET Framework 4.5 em diante, o Ildasm.exe identifica um BLOB (objeto binário grande) de marshal não reconhecido exibindo o conteúdo binário bruto. Por exemplo, o código a seguir mostra como um BLOB de marshaling gerado por um programa C# é exibido:

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

Do .NET Framework 4.5 em diante, o Ildasm.exe exibe atributos aplicados a implementações de interface, conforme é mostrado no seguinte trecho da saída de Ildasm.exe:

.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 a seguir faz os metadados e o código desmontado do arquivo PE MyHello.exe serem exibidos na GUI padrão do Ildasm.exe.

ildasm myHello.exe

O comando a seguir desmonta o arquivo MyFile.exe e armazena o texto do IL Assembler resultante no arquivo MyFile.il.

ildasm MyFile.exe /output:MyFile.il

O comando a seguir desmonta o arquivo MyFile.exe e exibe o texto do IL Assembler resultante na janela do console.

ildasm MyFile.exe /text

Se o arquivo MyApp.exe contiver recursos gerenciados não gerenciados inseridos, o comando a seguir produzirá quatro arquivos: MyApp.il, MyApp.res, Icons.resources e Message.resources:

ildasm MyApp.exe /output:MyApp.il

O comando a seguir desmonta o método MyMethod dentro da classe MyClass em MyFile.exe e exibe a saída na janela do console.

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

No exemplo anterior, talvez haja vários métodos chamados MyMethod com assinaturas diferentes. O comando a seguir desmonta o método de instância MyMethod com o tipo de retorno de void e os tipos de parâmetro int32 e string.

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

Observação

No .NET Framework versões 1.0 e 1.1, o parêntese à esquerda que segue o nome do método deve ser acompanhado de um parêntese à direita após a assinatura: MyMethod(instance void(int32)). Desde o .NET Framework 2.0, o parêntese de fechamento deve ser omitido: MyMethod(instance void(int32).

Para recuperar um método static (método Shared no Visual Basic), omita a palavra-chave instance. Tipos de classe que não são tipos primitivos como int32 e string devem incluir o namespace e ser precedidos pela palavra-chave class. Os tipos externos devem ser precedidos pelo nome da biblioteca entre colchetes. O comando a seguir desmonta um método estático chamado MyMethod que tem um parâmetro de 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 deve ser precedido por sua classe de contenção, delimitada por uma barra. Por exemplo, se a classe MyNamespace.MyClass contiver uma classe aninhada chamada NestedClass, a classe aninhada será identificada da seguinte forma: class MyNamespace.MyClass/NestedClass.

Confira também