Come posso visualizzare MSIL / CIL generato dal compilatore C #? Perché si chiama assembly?


130

Sono nuovo nella programmazione .NET C #. Sto seguendo alcuni libri. Si dice che invece di compilarlo direttamente in codice binario (codice nativo). Il codice di alto livello viene convertito in linguaggio intermedio (chiamato MSIL aka CIL). Ma quando compilo, ottengo un file exe / Dll.

  1. Questo MSIL / CIL è contenuto in questi file exe / dll?
  2. Voglio vedere quel codice di lingua intermedio. Solo per sentire la sua esistenza. Come visualizzarlo?
  3. Stanno chiamando questo file exe / dll un assembly. Stanno usando questa "parolaccia" solo per differenziarli dai file exe / dll che contengono codice binario (codice nativo)?

Risposte:


95
  1. Sì, lo è, più esattamente nella .textsezione del file PE (eseguibile portatile = * .exe o * .dll). Ulteriori informazioni possono essere trovate qui .
  2. La scelta migliore è usare ILSpy (Reflector non è più gratuito). È un disassemblatore gratuito che può disassemblare il tuo assieme in MSIL ma anche C #, VB (in una certa misura). .NET Framework SDK contiene ILDasm, che è il dissasembler ufficiale MSIL.
  3. Fondamentalmente sì. Un assembly è un file che contiene il codice MSIL e i metadati corrispondenti. Questo non è limitato ai file PE di per sé, ma tutte le attuali implementazioni CLR li usano.

Se posso consigliare un buon libro anche su questo argomento, è Expert .NET 2.0 IL Assembler di Serge Lidin. È il ragazzo che ha progettato MSIL.


Aspettare! Non si trova nella .textsessualità? In caso contrario, cosa .textcontiene? e come va con le #sezioni che pensavo fossero nominate a partire da .. Quindi non dovrebbe essere.strings

Sono curioso, perché ILDasm non è raccomandato? È incluso solo con (alcune versioni di?) Visual Studio?
Sinjai,

2
Entrambi hanno il loro posto, ma per la maggior parte degli utenti (> 99,99%) ILSpy è la scelta giusta. La sua capacità di decompilare il codice IL in C # è preziosa per la navigazione rapida e il reverse engineering degli assiemi. Se stai facendo qualcosa che emette IL grezzo (ad esempio stai scrivendo un compilatore o riscrivendo un assembly IL, ad esempio con Mono.Cecil), ILDasm è utile perché può mostrarti la struttura grezza di IL, le tabelle token ecc. Ancora , la maggior parte degli esperti non IL sarà confusa da quelli, quindi ILSpy è probabilmente tutto ciò che desideri e di cui hai bisogno.
Johannes Rudolph,

3
Caspita, risposta rapida 7 anni dopo! Non ho fatto molta confusione con IL o ho confrontato tutte le opzioni (motivo per cui lo sto chiedendo in primo luogo), ma LINQPad non ha questa funzione di decompilazione?
Sinjai,

L'ho installato in VS 2017, non succede nulla quando faccio clic su per vedere il codice in ILSPY.
Anirudha Gupta,

46

Uno dei miei modi preferiti per vedere IL per uno snippet di C # è usare lo strumento LINQPad gratuito . Dopo aver inserito del codice e aver scelto "Istruzioni C #" in alto (o "Programma C #", a seconda dei casi), fai clic sul pulsante "IL" nell'area di immissione del codice e vedrai l'IL generato.

Usare LINQPad per questo è molto più conveniente che caricare Visual Studio o eseguire il compilatore dalla riga di comando, quindi caricare ILDASM e aprire il file .il con un editor di testo.


Un altro buon strumento è il componente aggiuntivo Snippy per Reflector: jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx
Thomas Levesque

Ben fatto! Ho votato a favore, ma è leggermente più complicato se devi includere delle classi personalizzate. Comunque, mi piace davvero questo!
Andrew Steitz,

28

Se lo desideri online, .NET Fiddle è eccellente. Basta incollare il codice e fare clic View ILsull'opzione in alto a destra.


2
Sembra essere rotto ora.
Luke Maurer,

@nawfal si è rotto anche qui. Lo usavo.
aloisdg si trasferisce su codidact.com

Esiste un'altra soluzione online: sharplab.io . Controllare questa risposta per ulteriori informazioni: stackoverflow.com/a/51457583/1248177
aloisdg trasferirsi a codidact.com

Non sono sicuro di quale sia il problema, funziona bene per me .. @ aloisdgmovingtocodidact.com. Detto questo, sharplab.io sembra perfetto, grazie per
averlo

16

Un'altra opzione: utilizzare ReSharper

inserisci qui la descrizione dell'immagine Vista sincronizzata sorgente / IL: la linea di sfondo blu sinistra corrisponde al blocco IL destro

In Visual Studio:

  • Scegli ReSharper | Windows | Visualizzatore IL
  • o menu contestuale: navigare | Codice IL

Supporta la vista sincronizzata di codice sorgente e IL - quando si fa clic su un'istruzione in sorgente, viene evidenziato il blocco corrispondente in IL (e viceversa). Visualizza le descrizioni per IL da Microsoft Developer Network e "Set di istruzioni Common Intermediate Language (CIL)" dalle specifiche standard ECMA.

vedere Visualizzazione di Intermediate Language (IL) nella Guida di Resharper. L'immagine sopra è dalla Guida di Resharper.

L'opzione gratuita è di utilizzare Jetbrains dotPeek

vedi anche: "Exploring Intermediate Language (IL) con ReSharper e dotPeek", di Maarten Balliauw, 19 gennaio 2017 - Jetbrains Blog


Ha erroneamente annullato il voto della tua risposta. Modificalo in modo che io possa
votare

IL Viewer in ReSharper è fantastico. Se passi con il mouse sopra la sintassi di IL, mostra delle descrizioni piuttosto descrittive che spiegano cosa sta facendo ogni parola chiave. Ottimo per le persone che non conoscono IL!
InvalidBrainException il



9

Sharplab sharplab è uno strumento online, ottimo per casi d'uso semplici. Digita il codice a sinistra, IL viene visualizzato a destra.


Lo strumento migliore di sempre +1
Emad

7

Per molti aspetti, gli assembly .NET sono simili ai pacchetti bytecode Java.

  1. Sì. Contengono anche manifest e altri dati, ma il CIL fa parte di exe / dll.
  2. Usa ILDasm o Reflector - la maggior parte delle persone direbbe Reflector, in quanto è molto più potente. Entrambi ti mostreranno cosa è stato prodotto CIL. Wikipedia ha un elenco di tutte le istruzioni CIL , per una migliore sensazione (è come un assemblaggio).
  3. Immagino sia inteso come un assembly di codice. Un buon modo per differenziarlo da quello nativo.

7

Ho appena trascorso un paio d'ore alla ricerca dello strumento migliore che potrebbe farmi visualizzare il codice IL direttamente all'interno di Visual Studio.

L'unica soluzione che ho trovato finora è Msiler https://visualstudiogallery.msdn.microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

funziona abbastanza bene!

Altrimenti la seconda soluzione migliore, ma senza l'integrazione di Visual Studio, è JetBrains dotPeek, che è davvero fantastico per essere onesti.


5

So che questa è una vecchia domanda, e preferirei uno qualsiasi degli strumenti sopra. Tuttavia, in un pizzico, c'è stato un visualizzatore MSIL nella confezione con Visual Studio almeno dalla versione 2005.

Lo strumento è denominato ildasm.exee si trova nelle seguenti cartelle dopo le installazioni predefinite di 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"

Per ulteriori informazioni, vedere: " Procedura: visualizzare il contenuto dell'assieme " nella libreria MSDN.


2

Dalla mia esperienza, la migliore fonte di conoscenza relativa a IL è Andrew Troelsen "Pro C # e .NET Platform". A partire dalla terza edizione, ha un capitolo davvero eccezionale (circa 50 pagine) su come comprendere IL e persino scrivere il proprio codice e usare ILAsm. Ho usato queste informazioni per verificare se esiste ereditarietà multipla nel mondo .NET. Inoltre, potresti provare a utilizzare alcune funzionalità molto interessanti in IL (ad es. Filtraggio delle eccezioni che esiste solo in VB ma non in C #).

Consiglio vivamente di leggere quel capitolo.

Alla fine, .NET Reflector è uno standard aziendale per lo studio del codice IL degli assiemi e il libro di Richter è sicuramente "da leggere". Ma da altri libri come menzionato sopra potresti rivelare cose davvero utili :)

Sì, ogni assembly nel mondo .NET contiene un codice IL (insieme a manifest) che può essere visualizzato tramite Reflector o ILDasm. Inoltre, Reflector potrebbe mostrare codice ottimizzato per C # e VB. Ciò significa che qualsiasi persona può visualizzare il codice sorgente di un assembly ed è per questo che vengono utilizzati gli offuscatori di prodotti commerciali.


2

Voglio visualizzare la lingua intermedia, prova a scaricare JustDecompile da Telerik (che è attualmente gratuito, tuttavia richiede una registrazione).

Trascina la tua DLL e scegli ILdalla casella a discesa in alto!


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.