Como posso visualizar o MSIL / CIL gerado pelo compilador C #? Por que isso é chamado de montagem?

130

Eu sou novo na programação .NET C #. Eu estou seguindo alguns livros. Diz-se que, em vez de compilá-lo diretamente no código binário (código nativo). O código de alto nível é convertido em idioma intermediário (chamado MSIL, também conhecido como CIL). Mas quando eu compilar, recebo um arquivo exe / Dll.

  1. Este MSIL / CIL está contido nesse arquivo exe / dll?
  2. Eu quero ver esse código de idioma intermediário. Apenas para sentir sua existência. Como vê-lo?
  3. Eles estão chamando esse arquivo exe / dll de an assembly. Eles estão usando essa "palavra chique" apenas para diferenciá-los dos arquivos exe / dll que contêm código binário (código nativo)?
starblue
fonte

Respostas:

95
  1. Sim, é mais exatamente na .textseção do arquivo PE (executável portátil = * .exe ou * .dll). Mais informações podem ser encontradas aqui .
  2. A melhor opção é usar o ILSpy (o Refletor não é mais gratuito). É um desmontador gratuito que pode desmontar sua montagem no MSIL, mas também em C #, VB (até certo ponto). O .NET Framework SDK contém ILDasm, que é o desmontador oficial do MSIL.
  3. Basicamente sim. Um assembly é um arquivo que contém o código MSIL e os metadados correspondentes. Isso não é restrito aos arquivos PE, mas todas as implementações atuais do CLR os usam.

Se também posso recomendar um bom livro sobre esse assunto, é o Expert .NET 2.0 IL Assembler de Serge Lidin. Ele é o cara que projetou o MSIL.

Johannes Rudolph
fonte
Esperar! Não está localizado em .textsextion? Caso contrário, o que .textcontém? e o que há com as #seções que eu pensei que são nomeadas começando com .. Então, não deveria ser.strings
Estou curioso, por que o ILDasm não é recomendado? Ele está incluído apenas no (algumas versões do) Visual Studio?
Sinjai 26/07/17
2
Ambos têm seus lugares, mas para a maioria (> 99,99%) dos usuários, o ILSpy é a escolha certa. Sua capacidade de descompilar o código IL de volta ao C # é inestimável para navegação rápida e montagem de engenharia reversa. Se você estiver fazendo alguma coisa que emita IL bruta (por exemplo, você está escrevendo um IL de compilador ou reescrito de montagem, por exemplo, com Mono.Cecil), o ILDasm é útil porque pode mostrar a estrutura bruta de IL, tabelas de tokens etc. , a maioria dos especialistas que não são de IL ficará confusa com eles, portanto o ILSpy é provavelmente tudo que você deseja e precisa.
Johannes Rudolph
3
Uau, resposta rápida 7 anos depois! Não brinquei muito com IL ou comparei todas as opções (é por isso que estou perguntando em primeiro lugar), mas o LINQPad não possui esse recurso de descompilação?
Sinjai 26/07
Eu o instalei no VS 2017, nada acontece quando clico em ver o código no ILSPY.
Anirudha Gupta
46

Uma das minhas maneiras favoritas de ver IL para um trecho de C # é usar a ferramenta gratuita LINQPad . Após digitar algum código e escolher "Instruções C #" na parte superior (ou "Programa C #", o que for adequado), clique no botão "IL" na área de entrada de código e você verá a IL gerada.

Usar o LINQPad para isso é muito mais conveniente do que carregar o Visual Studio ou executar o compilador na linha de comando, carregar o ILDASM e abrir o arquivo .il com um editor de texto.

Mark Rushakoff
fonte
Outra boa ferramenta é o Snippy add-in para o refletor: jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx
Thomas Levesque
Agradável! Votei positivamente, mas é um pouco mais complicado se você precisar incluir alguma classe personalizada. Ainda assim, eu realmente gosto deste!
Andrew Steitz
28

Se você quiser online, o .NET Fiddle é excelente. Basta colar o seu código e clicar View ILna opção no canto superior direito.

nawfal
fonte
2
Parece estar quebrado agora.
Luke Maurer
@nawfal quebrou aqui também. Eu costumava usá-lo.
aloisdg movendo-se para codidact.com 7/03
Existe outra solução online: sharplab.io . Verifique esta resposta para obter mais informações: stackoverflow.com/a/51457583/1248177
aloisdg movendo-se para codidact.com
Não tenho certeza qual é o problema, funciona bem para mim .. @ aloisdgmovingtocodidact.com. Dito isto, sharplab.io parece liso, obrigado por apontar :)
nawfal
16

Outra opção: Use ReSharper

insira a descrição da imagem aqui Visualização fonte / IL sincronizada: a linha de fundo azul esquerda corresponde ao bloco IL direito

No Visual Studio:

  • Escolha ReSharper | Windows IL Viewer
  • ou Menu de contexto: Navegue | Código IL

Oferece suporte à exibição sincronizada do código-fonte e da IL - quando você clica em uma instrução na fonte, o bloco correspondente na IL é destacado (e vice-versa). Exibe descrições para IL da Microsoft Developer Network e "Conjunto de instruções CIL (Common Intermediate Language)" da especificação padrão da ECMA.

consulte Visualizando o idioma intermediário (IL) na Ajuda do Resharper. A figura acima é da Ajuda do Resharper.

A opção gratuita é usar o Jetbrains dotPeek

veja também: "Explorando a linguagem intermediária (IL) com ReSharper e dotPeek", por Maarten Balliauw, 19 de janeiro de 2017 - Jetbrains Blog

Michael Brux
fonte
Votou erroneamente na sua resposta. Editá-lo para que eu possa upvote
Rudresha Parameshappa
O IL Viewer no ReSharper é ótimo. Se você passar o mouse sobre a sintaxe da IL, serão exibidas dicas bastante descritivas que explicam o que cada palavra-chave está fazendo. Ótimo para pessoas que são novas na IL!
InvalidBrainException
12
  1. Sim, está em montagem.
  2. Você precisa do .NET Reflector ou ILDasm .
  3. Mais detalhes sobre a montagem, confira AQUI .

PS: Como você está seguindo alguns livros, eu recomendo o CLR via C # .

Incógnito
fonte
11

Eu acredito que eles são chamados de "assemblies" porque um assembly é um conjunto de módulos, reunidos por um manifesto.

montagem de vários arquivos
(fonte: microsoft.com )

Consulte Conteúdo da montagem para obter detalhes.

John Saunders
fonte
9

Sharplab O sharplab é uma ferramenta online, excelente para casos de uso simples. Digite seu código à esquerda, IL aparece à direita.

Colin
fonte
A melhor ferramenta de todos os tempos +1
Emad 5/01
7

Em muitos aspectos, os assemblies .NET são semelhantes aos pacotes de bytecode Java.

  1. Sim. Eles também contêm manifestos e outros dados, mas o CIL faz parte do exe / dll.
  2. Use ILDasm ou Reflector - a maioria das pessoas diria Refletor, pois é muito mais poderoso. Ambos mostrarão o que o CIL foi produzido. A Wikipedia tem uma lista de todas as instruções do CIL , para uma sensação melhor (é como uma montagem).
  3. Eu acho que é um conjunto de códigos. Uma boa maneira de diferenciá-lo do nativo.
Oded
fonte
7

Passei algumas horas pesquisando a melhor ferramenta que me permitia exibir o código de IL diretamente no Visual Studio.

A única solução que encontrei até agora é o Msiler https://visualstudiogallery.msdn.microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

funciona muito bem!

Caso contrário, a segunda melhor solução, mas sem a integração do visual studio, é o JetBrains dotPeek, que é incrível demais para ser honesto.

sebas
fonte
5

Sei que essa é uma pergunta antiga e prefiro qualquer uma das ferramentas acima. No entanto, em uma pitada, houve um visualizador MSIL na caixa com o Visual Studio desde pelo menos a Versão 2005.

A ferramenta é nomeada ildasm.exee está localizada nas seguintes pastas após as instalações padrão do Visual Studio:

Visual Studio 2005 "C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\ildasm.exe"

Visual Studio 2008 " C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm.exe"

Visual Studio 2010 " C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\ildasm.exe"

Para obter mais informações, consulte: " Como: exibir o conteúdo do assembly " na Biblioteca do MSDN.

bopapa_1979
fonte
2

Pela minha experiência, a melhor fonte de conhecimento relacionado à IL é Andrew Troelsen, “Pro C # e .NET Platform”. A partir da 3ª edição, ele tem um capítulo realmente excelente (aproximadamente 50 páginas) sobre como entender a IL e até escrever seu próprio código e usar o ILAsm. Empreguei essas informações para investigar se existe herança múltipla no mundo .NET. Além disso, você pode tentar empregar alguns recursos muito interessantes na IL (por exemplo, filtragem de exceções que só existem no VB, mas não no C #).

Eu recomendo ler esse capítulo.

Eventualmente, o .NET Reflector é um padrão corporativo para investigar o código de assemblagens IL e o livro de Richter é definitivamente "coisas de leitura obrigatória". Mas de outros livros como os mencionados acima, você pode revelar coisas realmente úteis :)

Sim, cada assembly no mundo .NET possui algum código IL (junto com o manifesto) que pode ser visualizado através do Reflector ou ILDasm. Ainda mais, o Reflector pode mostrar o código otimizado em C # e VB. Isso significa que qualquer pessoa pode visualizar o código fonte de uma montagem e é por isso que em produtos comerciais são usados ​​ofuscadores.

xenn_33
fonte
2

Se você deseja visualizar o idioma intermediário, tente baixar o JustDecompile da Telerik (que atualmente é gratuito, requer uma inscrição).

Arraste sua DLL e escolha ILna caixa suspensa na parte superior!

Lucas
fonte