2010-07-24 8 views
97

Sono nuovo alla programmazione .NET C#. Sto seguendo alcuni libri. Si dice che invece di compilarlo direttamente al 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.Come posso visualizzare MSIL/CIL generato dal compilatore C#? Perché si chiama assemblaggio?

  1. Questo MSIL/CIL contiene questo file exe/dll?
  2. Voglio vedere quel codice di lingua intermedio. Solo per avere un'idea della sua esistenza. Come vederlo?
  3. Essi chiamano questo file exe/dll e assembly. Stanno usando questa "parola di fantasia" solo per differenziarli dai file exe/dll che contengono codice binario (codice nativo)?

risposta

76
  1. Sì, è, più precisamente nella sezione .text del PE file (Portable Executable = * .exe o * .dll). Maggiori informazioni possono essere trovate here.
  2. La scelta migliore è utilizzare ILSpy (Reflector non è più gratuito). È un disassemblatore gratuito che può smontare il tuo assembly in MSIL ma anche C#, VB (in una certa misura). .NET Framework SDK contiene ILDasm, che è il dissasembler MSIL ufficiale.
  3. Fondamentalmente si. Un assembly è un file che contiene codice MSIL e metadati corrispondenti. Questo non è limitato ai file PE di per sé, ma tutte le attuali implementazioni CLR li usano.

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

+0

Aspetta! Non si trova nella sextion '.text'? In caso contrario, cosa contiene '.text'? e cosa succede con il '' # pensavo che le sezioni abbiano un nome che inizia con '.'. Quindi non potrebbe essere '.strings' –

+0

Sono curioso, perché è [ILDasm] (https://docs.microsoft.com/en-us/dotnet/framework/tools/ildasm-exe-il-disassembler) non consigliato? È solo incluso con (alcune versioni di?) Visual Studio? – Sinjai

+0

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

7

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

  1. Sì. Contengono anche manifesti e altri dati, ma il CIL fa parte di exe/dll.
  2. Utilizzare ILDasm o Reflector - la maggior parte delle persone direbbe Reflector, in quanto è molto più potente. Entrambi ti mostreranno cos'è stato prodotto CIL. Wikipedia ha una lista di tutti gli CIL instructions, per una migliore sensazione (è assemblaggio come).
  3. Suppongo che sia inteso come un insieme di codice. Un buon modo per differenziarlo da nativo.
2

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

Consiglio vivamente di leggere quel capitolo.

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

Sì, ogni assemblea nel mondo .NET contiene un codice IL (longsite con manifest) che può essere visualizzato tramite Reflector o ILDasm. Ancor più, Reflector potrebbe mostrarti codice C# e VB ottimizzato. Ciò significa che chiunque può visualizzare il codice sorgente di un assembly ed è per questo che vengono utilizzati gli offuscatori di prodotti commerciali.

39

Uno dei miei modi preferiti per vedere l'IL per uno snippet di C# è quello di utilizzare il numero gratuito LINQPad tool. Dopo aver inserito del codice e aver scelto "Dichiarazioni C#" nella parte superiore (o "Programma C#", a seconda dei casi), fai clic sul pulsante "IL" sotto l'area di immissione del codice e vedrai l'IL generato.

Utilizzare LINQPad per questo è molto molto più conveniente del caricamento di Visual Studio o esecuzione del compilatore dalla riga di comando, quindi caricamento di ILDASM e apertura del file .il con un editor di testo.

+0

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

5

So che questa è una vecchia domanda e preferirei uno degli strumenti sopra riportati. Tuttavia, in un pizzico, c'è stato un visualizzatore MSIL nel box con Visual Studio almeno dal 2005. Versione

Lo strumento si chiama ildasm.exe, e si trova nelle seguenti cartelle predefinite dopo Visual Studio installazioni:

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: "How to: View Assembly Contents" nella MSDN Library.

2

Se si desidera visualizzare la lingua intermedia, provare a scaricare JustDecompile from Telerik (che è attualmente gratuito, tuttavia richiede una registrazione).

Trascinare nella DLL e selezionare IL dal menu a discesa in alto!

14

Se lo si desidera online, .NET Fiddle è eccellente. È sufficiente incollare il codice e fare clic sull'opzione View IL in alto a destra.

6

Ho appena trascorso un paio d'ore alla ricerca del miglior strumento che mi consenta di visualizzare il codice IL direttamente in 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.

6

Un'altra opzione: Usa ReSharper

enter image description here Fonte/Vista IL sincronizzato: a sinistra blu linea di fondo corrisponde a destra IL blocco

In Visual Studio:

  • Scegli ReSharper | Windows | IL Viewer
  • o Menu contestuale: Navigazione | IL Codice

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

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

opzione gratuita è quella di utilizzare Jetbrains dotPeek

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

+0

Errore di battitura della tua risposta. Modificalo in modo che io possa andare avanti –

Problemi correlati