Wie kann ich vom C # -Compiler generiertes MSIL / CIL anzeigen? Warum heißt es Montage?

130

Ich bin neu in der .NET C # -Programmierung. Ich folge ein paar Büchern. Es wird gesagt, dass anstatt es direkt in Binärcode (Native Code) zu kompilieren. High-Level-Code wird in eine Zwischensprache konvertiert (MSIL aka CIL genannt). Aber wenn ich kompiliere, bekomme ich eine exe / Dll-Datei.

  1. Ist diese MSIL / CIL in dieser exe / dll-Datei enthalten?
  2. Ich möchte diesen Zwischensprachcode sehen. Nur um ein Gefühl für seine Existenz zu bekommen. Wie kann ich es anzeigen?
  3. Sie rufen diese exe / dll-Datei an assembly. Verwenden sie dieses "ausgefallene Wort" nur, um diese von den exe / dll-Dateien zu unterscheiden, die Binärcode (nativen Code) enthalten?
Sternenblau
quelle

Antworten:

95
  1. Ja, genauer gesagt im .textAbschnitt der PE-Datei (portable ausführbare Datei = * .exe oder * .dll). Weitere Informationen finden Sie hier .
  2. Die beste Wahl ist die Verwendung von ILSpy (Reflector ist nicht mehr kostenlos). Es ist ein kostenloser Disassembler, der Ihre Baugruppe in MSIL, aber auch in C #, VB (in gewissem Umfang) zerlegen kann. Das .NET Framework SDK enthält ILDasm, den offiziellen MSIL-Dissasembler.
  3. Grundsätzlich ja. Eine Assembly ist eine Datei, die MSIL-Code und entsprechende Metadaten enthält. Dies ist nicht auf PE-Dateien an sich beschränkt, sondern wird von allen aktuellen CLR-Implementierungen verwendet.

Wenn ich auch in dieser Angelegenheit ein gutes Buch empfehlen darf, dann ist es Expert .NET 2.0 IL Assembler von Serge Lidin. Er ist der Typ, der MSIL entworfen hat.

Johannes Rudolph
quelle
Warten! Es befindet sich nicht in .textSextion? Wenn nicht, was .textenthält? und was ist los mit den #Ich dachte, Abschnitte werden beginnend mit benannt .. So sollte es nicht sein.strings
Ich bin gespannt, warum ILDasm nicht empfohlen wird. Ist es nur in (einigen Versionen von?) Visual Studio enthalten?
Sinjai
2
Beide haben ihre Plätze, aber für die meisten (> 99,99%) Benutzer ist ILSpy die richtige Wahl. Die Fähigkeit, IL-Code zurück in C # zu dekompilieren, ist von unschätzbarem Wert für die schnelle Navigation und das Reverse Engineering von Baugruppen. Wenn Sie etwas tun, das Raw-IL ausgibt (z. B. einen Compiler schreiben oder Assembly-IL neu schreiben, z. B. mit Mono.Cecil), ist ILDasm nützlich, da es Ihnen die Raw-Struktur von IL, Tokentabellen usw. anzeigen kann Die meisten Nicht-IL-Experten werden von diesen verwirrt sein, daher ist ILSpy wahrscheinlich alles, was Sie wollen und brauchen.
Johannes Rudolph
3
Wow, schnelle Antwort 7 Jahre später! Ich habe nicht viel mit IL herumgespielt oder alle Optionen verglichen (weshalb ich zuerst frage), aber hat LINQPad diese Dekompilierungsfunktion nicht?
Sinjai
Ich habe es in VS 2017 installiert. Wenn ich auf den Code in ILSPY klicke, passiert nichts.
Anirudha Gupta
46

Eine meiner Lieblingsmethoden, um IL für einen Ausschnitt aus C # zu sehen, ist die Verwendung des kostenlosen LINQPad-Tools . Nachdem Sie einen Code eingegeben und oben "C # -Anweisungen" (oder "C # -Programm", je nachdem, was passt) ausgewählt haben, klicken Sie auf die Schaltfläche "IL" unter dem Codeeingabebereich. Die generierte IL wird angezeigt.

Die Verwendung von LINQPad ist wesentlich praktischer als das Laden von Visual Studio oder das Ausführen des Compilers über die Befehlszeile, das Laden von ILDASM und das Öffnen der .il-Datei mit einem Texteditor.

Mark Rushakoff
quelle
Ein weiteres gutes Tool ist das Snippy-Add-In für Reflector: jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx
Thomas Levesque
Schön! Ich habe hochgestimmt, aber es ist etwas komplizierter, wenn Sie benutzerdefinierte Klassen einschließen müssen. Trotzdem mag ich diesen wirklich!
Andrew Steitz
28

Wenn Sie es online möchten, ist .NET Fiddle ausgezeichnet. Fügen Sie einfach Ihren Code ein und klicken Sie View ILoben rechts auf die Option.

nawfal
quelle
2
Scheint jetzt kaputt zu sein.
Luke Maurer
@nawfal brach auch hier. Ich habe es benutzt.
Aloisdg wechselt zu codidact.com
Es gibt jedoch noch eine andere Online-Lösung: sharplab.io . Überprüfen Sie diese Antwort für weitere Informationen: stackoverflow.com/a/51457583/1248177
aloisdg wechselt zu codidact.com
Nicht sicher, was das Problem ist, funktioniert gut für mich .. @ aloisdgmovingtocodidact.com. Das heißt, sharplab.io sieht schick aus, danke für den Hinweis :)
nawfal
15

Eine weitere Option: Verwenden Sie ReSharper

Geben Sie hier die Bildbeschreibung ein Quell- / IL-synchronisierte Ansicht: Die linke blaue Hintergrundlinie entspricht dem rechten IL-Block

In Visual Studio:

  • Wählen Sie ReSharper | Windows | IL Viewer
  • oder Kontextmenü: Navigieren | IL-Code

Unterstützt die synchronisierte Ansicht von Quellcode und IL - Wenn Sie auf eine Anweisung in der Quelle klicken, wird der entsprechende Block in IL hervorgehoben (und umgekehrt). Zeigt Beschreibungen für IL aus dem Microsoft Developer Network und den Befehlssatz "Common Intermediate Language (CIL)" aus der ECMA-Standardspezifikation an.

Siehe Anzeigen der Zwischensprache (Intermediate Language, IL) in der Resharper-Hilfe. Das Bild oben stammt aus der Resharper-Hilfe.

Die kostenlose Option ist die Verwendung von Jetbrains dotPeek

Siehe auch: "Exploring Intermediate Language (IL) mit ReSharper und dotPeek", von Maarten Balliauw, 19. Januar 2017 - Jetbrains Blog

Michael Brux
quelle
Ihre Antwort wurde fälschlicherweise abgelehnt. Bearbeiten Sie es, damit ich abstimmen kann
Rudresha Parameshappa
11

Ich glaube , dass sie „Baugruppen“ , weil eine Baugruppe ist eine Reihe von Modulen, genannt werden montiert zusammen mit einem offensichtlichen.

Assembly mit mehreren Dateien
(Quelle: microsoft.com )

Siehe Montage Inhalt für weitere Einzelheiten.

John Saunders
quelle
9

Sharplab sharplab ist ein Online-Tool, das sich hervorragend für einfache Anwendungsfälle eignet . Geben Sie Ihren Code links ein, IL wird rechts angezeigt.

Colin
quelle
Das beste Werkzeug aller Zeiten +1
Emad
7

In vielerlei Hinsicht ähneln .NET-Assemblys Java-Bytecode-Paketen.

  1. Ja. Sie enthalten auch Manifeste und andere Daten, aber die CIL ist Teil der exe / dll.
  2. Verwenden Sie ILDasm oder Reflector - die meisten Leute würden Reflector sagen, da es viel leistungsfähiger ist. Beide zeigen Ihnen, was CIL produziert wurde. Wikipedia hat eine Liste aller CIL-Anweisungen , um ein besseres Gefühl zu vermitteln (es ist wie eine Montage).
  3. Ich denke, es ist als eine Zusammenstellung von Code gedacht. Ein guter Weg, um es von einheimischen zu unterscheiden.
Oded
quelle
7

Ich habe gerade ein paar Stunden damit verbracht, nach dem besten Tool zu suchen, mit dem ich den IL-Code direkt in Visual Studio anzeigen kann.

Die einzige Lösung, die ich bisher gefunden habe, ist Msiler https://visualstudiogallery.msdn.microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

es funktioniert ganz gut!

Ansonsten ist JetBrains dotPeek die zweitbeste Lösung, jedoch ohne visuelle Studio-Integration, was ehrlich gesagt ziemlich beeindruckend ist.

sebas
quelle
5

Ich weiß, dass dies eine alte Frage ist, und ich würde eines der oben genannten Tools bevorzugen. Zur Not gibt es jedoch seit mindestens Version 2005 einen MSIL-Viewer in der Box mit Visual Studio.

Das Tool hat den Namen ildasm.exeund befindet sich nach den Standardinstallationen von Visual Studio in den folgenden Ordnern:

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"

Weitere Informationen finden Sie unter: " Gewusst wie: Anzeigen von Baugruppeninhalten " in der MSDN-Bibliothek.

bopapa_1979
quelle
2

Nach meiner Erfahrung ist Andrew Troelsen „Pro C # und .NET Platform“ die beste Quelle für IL-bezogenes Wissen. Ab der 3. Ausgabe hat er ein wirklich herausragendes Kapitel (ca. 50 Seiten) darüber, wie man IL versteht, sogar eigenen Code schreibt und ILAsm verwendet. Ich habe diese Informationen verwendet, um zu untersuchen, ob in der .NET-Welt Mehrfachvererbung vorhanden ist. Sie können auch versuchen, einige sehr interessante Funktionen in IL zu verwenden (z. B. das Filtern von Ausnahmen, die nur in VB, nicht jedoch in C # vorhanden sind).

Ich empfehle dringend, dieses Kapitel zu lesen.

Schließlich ist .NET Reflector ein Unternehmensstandard für die Untersuchung des IL-Codes von Baugruppen, und Richters Buch ist definitiv ein Muss. Aber aus anderen Büchern wie oben könnten Sie wirklich nützliche Dinge enthüllen :)

Ja, jede Assembly in der .NET-Welt enthält einen IL-Code (zusammen mit dem Manifest), der über Reflector oder ILDasm angezeigt werden kann. Darüber hinaus könnte Reflector Ihnen C # - und VB-optimierten Code anzeigen. Dies bedeutet, dass jede Person den Quellcode einer Baugruppe anzeigen kann. Deshalb werden in kommerziellen Produkten Verschleierer verwendet.

xenn_33
quelle
2

Wenn Sie die Zwischensprache anzeigen möchten, versuchen Sie, JustDecompile von Telerik herunterzuladen (was derzeit kostenlos ist, erfordert jedoch eine Anmeldung).

Ziehen Sie Ihre DLL und wählen Sie ILaus dem Dropdown-Feld oben!

Luke
quelle