it-swarm.com.de

Wie kann ich MSIL/CIL anzeigen, die vom C # -Compiler generiert wurden? Warum heißt es Montage?

Ich bin neu in der .NET C # -Programmierung. Ich verfolge ein paar Bücher. Es wird gesagt, dass es nicht direkt zu Binärcode (Native Code) kompiliert wird. High-Level-Code wird in Zwischensprache (MSIL, auch CIL genannt) umgewandelt. Beim Kompilieren bekomme ich eine Exe/Dll-Datei.

  1. Ist das 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 sehen?
  3. Sie nennen diese exe/dll-Datei eine Assembly. Verwenden sie dieses "ausgefallene Wort", nur um diese von den exe/dll-Dateien zu unterscheiden, die Binärcode (nativen Code) enthalten? 
110
walter
  1. Ja, genauer gesagt im .text-Abschnitt der PE-Datei (Portable Executable = * .exe oder * .dll). Weitere Informationen finden Sie hier .
  2. Am besten verwenden Sie ILSpy (Reflektor ist nicht mehr kostenlos). Es ist ein kostenloser Disassembler, der Ihre Assembly 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 per se beschränkt, aber alle aktuellen CLR-Implementierungen verwenden sie. 

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

82

Eine meiner liebsten Möglichkeiten, IL für ein snippet von C # zu sehen, ist das kostenlose LINQPad-Tool . Nachdem Sie einen Code eingegeben und oben "C # -Anweisungen" ausgewählt haben (oder "C # -Programm", je nachdem, was für Sie geeignet ist), klicken Sie auf die Schaltfläche "IL" unter dem Codeeingabebereich. Die generierte AWL wird angezeigt.

Die Verwendung von LINQPad ist viel bequemer 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.

43
Mark Rushakoff

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

20
nawfal
  1. Ja, es ist in der Versammlung.
  2. Sie benötigen .NET Reflector oder ILDasm .
  3. Weitere Details zur Montageprüfung HIER

PS: Da Sie einige Bücher verfolgen, empfehle ich Ihnen CLR über C # .

12
Incognito

Ich glaube, dass sie "Assemblys" genannt werden, weil eine Assembly eine Menge von Modulen ist, assembliert zusammen durch ein Manifest.

Multi-File Assembly http://i.msdn.Microsoft.com/dynimg/IC125851.gif

Siehe Assembly Contents für Details.

11
John Saunders

Eine weitere Option: Verwenden Sie ReSharper.

 enter image description here Quell-/IL-synchronisierte Ansicht: linke blaue Hintergrundlinie entspricht dem rechten IL-Block

In Visual Studio: 

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

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

siehe Anzeigen der Zwischensprache (IL) in der Resharper-Hilfe. Das obige Bild stammt aus der Resharper-Hilfe.

Kostenlose Option ist die Verwendung von Jetbrains dotPeek

siehe auch: "Erkundung der Zwischensprache (IL) mit ReSharper und dotPeek", von Maarten Balliauw, 19. Januar 2017 - Jetbrains Blog

8
Michael Brux

Ich habe gerade ein paar Stunden damit verbracht, nach dem besten Werkzeug 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 Visual Studio-Integration.

7
sebas

.NET-Assemblys ähneln in vieler Hinsicht 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 dieser wesentlich leistungsfähiger ist. Beide zeigen Ihnen, was CIL produziert wurde. Wikipedia hat eine Liste aller CIL-Anweisungen , für ein besseres Gefühl (es ist Assembly Like).
  3. Ich denke, es ist als Assembly of Code gedacht. Ein guter Weg, um es von einheimischen zu unterscheiden.
7
Oded

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

Das Tool heißt ildasm.exe und befindet sich nach 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 des Assembly-Inhalts " in der MSDN Library.

5
Eric Burcham

 Sharplab sharplab ist ein Online-Tool für einfache Anwendungsfälle. Geben Sie links Ihren Code ein, rechts erscheint IL. 

2
Colin

Ich möchte die Zwischensprache anzeigen. Versuchen Sie, JustDecompile von Telerik herunterzuladen. (Die ist derzeit kostenlos, erfordert jedoch eine Anmeldung).

Ziehen Sie Ihre DLL ein und wählen Sie IL aus dem Dropdown-Feld oben!

2
Luke

Aus meiner Erfahrung ist Andrew Troelsen "Pro C # and .NET Platform" die beste Quelle für IL-relevantes Wissen. Ab der 3. Auflage hat er ein wirklich überragendes Kapitel (ca. 50 Seiten), in dem erläutert wird, wie man IL versteht und sogar eigenen Code schreibt und ILAsm verwendet. Ich habe diese Informationen verwendet, um zu untersuchen, ob in der .NET-Welt mehrere Vererbungen vorliegen. Sie könnten auch versuchen, einige sehr interessante Funktionen in IL zu verwenden (z. B. das Filtern von Ausnahmen, die nur in VB, aber nicht 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 "Muss". Aber aus anderen Büchern, wie oben erwähnt, könnte man wirklich nützliche Dinge enthüllen :)

Ja, jede Assembly in .NET-Welt enthält einen IL-Code (zusammen mit einem Manifest), der durch 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 Assembly anzeigen kann. Deshalb werden in kommerziellen Produkten Verschleissgeräte verwendet.

2
xenn_33

Es gibt jetzt eine andere Option. Sie können dies in VS Code mit dieser Erweiterung mit Roslyn erstellen. Dies ist derzeit beschränkt auf .NET Core .

0
Adam Caviness