Partilhar via


Ildasm.exe (IL Desmontador)

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

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

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 Description
/out= filename Cria um arquivo de saída com o especificado filename, 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 .
/Texto Exibe os resultados na janela do console, em vez de 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 do comando e as opções da ferramenta.

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

Opção Description
/bytes Mostra bytes reais, em formato hexadecimal, como comentários de instrução.
/caverbal Produz blobs de atributos personalizados na forma verbal. O padrão é a forma binária.
/linenum Inclui referências a linhas de origem originais.
/nobar Suprime a janela pop-up do indicador de progresso da desmontagem.
/NOCA Suprime a saída de atributos personalizados.
/projeto Exibe metadados da maneira como aparecem para o código gerenciado, em vez da maneira como aparecem no Tempo de Execução do Windows nativo. Se PEfilename não for um ficheiro de metadados do Windows (.winmd), esta opção não tem efeito. Consulte Suporte do .NET Framework para aplicativos da Windows Store e Tempo de Execução do Windows.
/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ção em formato bruto.
/fonte Mostra as linhas de origem originais como comentários.
/tokens Mostra tokens de metadados de classes e membros.
/visibilidade: vis[+vis...] Desmonta apenas tipos ou membros com a visibilidade especificada. Os seguintes valores são válidos para vis:

PUB — Público

PRI — Privado

FAM — Família

ASM — Montagem

FAA — Família e Assembleia

FOA — Família ou Assembleia

CPS — Âmbito privado

Para obter 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 somente para saída de arquivo ou console.

Opção Description
/todos Especifica uma combinação das opções /header, /bytes, /stats, /classlist e /tokens.
/lista de classes Inclui uma lista de classes definidas no módulo.
/para a frente Usa a declaração de classe de encaminhamento.
/cabeçalhos Inclui informações de cabeçalho de arquivo na saída.
/artigo: class[:: member[(sig]] Desmonta o seguinte dependendo do argumento fornecido:

- Desmonta o especificado class.
- Desmonta o especificado member do class.
- Desmonta o member class do com a assinatura sigespecificada. O formato do sig é:
[instance] returnType(parameterType1, parameterType2, ..., parameterTypeN)
Observação No .NET Framework versões 1.0 e 1.1, sig deve ser seguido por um parêntese de fechamento: (sig). A partir do Net Framework 2.0, o parêntese de fechamento deve ser omitido: (sig.
/noil Suprime a saída do código de assembly IL.
/estatísticas Inclui estatísticas sobre a 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 somente para saída de arquivo ou console.

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

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

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

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

UNREX — Mostrar externos não resolvidos.

SCHEMA — Mostrar o cabeçalho dos metadados e as informações do esquema.

RAW — Mostrar as tabelas de metadados brutos.

HEAPS — Mostre as pilhas brutas.

VALIDAR — Valide a consistência dos metadados.

Você pode especificar /metadata várias vezes, com valores diferentes para specifier.

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

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

Nota

Todas as opções para 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 igual (=) como separador entre a opção e o argumento. Por exemplo, /output: filename é equivalente a /output= filename.

Observações

Ildasm.exe só opera em arquivos PE no disco. Ele não opera 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, 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 sua 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 IL Assembler para produzir um arquivo executável final.

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

Você pode 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 quaisquer opções. No menu Arquivo , você pode navegar até o arquivo PE que deseja carregar no Ildasm.exe. Para salvar os metadados e o código desmontado exibidos para o PE selecionado, selecione o comando Despejar no menu Arquivo. Para salvar somente a exibição de árvore hierárquica, selecione o comando Dump Treeview no menu Arquivo . Para obter um guia detalhado sobre como carregar um arquivo no Ildasm.exe e interpretar a saída, consulte o Tutorial de Ildasm.exe , localizado na pasta Exemplos que acompanha o SDK do Windows.

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

Nota

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

Você pode executar Ildasm.exe sobre an.exe ou .dll arquivo 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 a Versão

A partir do .NET Framework 4.5, Ildasm.exe manipula um BLOB marshal não reconhecido (objeto binário grande) exibindo o conteúdo binário bruto. Por exemplo, o código a seguir mostra como um BLOB marshal 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

A partir do .NET Framework 4.5, Ildasm.exe exibe atributos que são aplicados a implementações de interface, conforme mostrado no seguinte trecho 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 a seguir faz com que os metadados e o código desmontado do arquivo MyHello.exe PE sejam exibidos na GUI padrão do Ildasm.exe .

ildasm myHello.exe

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

ildasm MyFile.exe /output:MyFile.il

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

ildasm MyFile.exe /text

Se o arquivo MyApp.exe contiver recursos gerenciados e não gerenciados incorporados, 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 in MyFile.exe e exibe a saída para a janela do console.

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

No exemplo anterior, poderia haver vários métodos nomeados MyMethod com assinaturas diferentes. O comando a seguir desmonta o método MyMethod de instância 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

Nota

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

Para recuperar um static método (Shared método 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 devem 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 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 deve ser precedido por sua classe de contenção, delimitada por uma barra para frente. Por exemplo, se a MyNamespace.MyClass classe contiver uma classe aninhada chamada NestedClass, a classe aninhada será identificada da seguinte forma: class MyNamespace.MyClass/NestedClass.

Consulte também