Wenn ich ein Werkzeug wie ILSpy oder dotPeek öffne, habe ich die Möglichkeit, das dekompilierte C # oder das IL anzuzeigen.
Wenn Sie die dekompilierte Quelle anzeigen, baut der Decompiler die IL in das dekompilierte C # -Äquivalent um?
Wenn ja, wie würde dann ein Dekompiler auf einen solchen Fall wie die IL unten schließen? (Beachten Sie, dass dies ein triviales Beispiel für das erste Sprachkonstrukt ist, das mir in den Sinn kam, das nicht einfach aus IL abgeleitet werden kann, im Gegensatz zur tatsächlichen Ausgabe eines Decompilers):
%Vor%Übersetzen auf:
%Vor%Ja, die Dekompilierungswerkzeuge müssen einen Reverse-Engineer von der IL erstellen.
Aus diesem Grund müssen die Tools für jede Version von C # / VB aktualisiert werden, wenn sie neu eingeführte Sprachfunktionen dekompilieren sollen. Andernfalls, wenn das Tool nicht aktualisiert wird, gibt es entweder den Versuch auf, es zu dekompilieren, oder es erzeugt stark gewundenen Code, den ein Wahnsinniger in einer früheren Version der Sprache geschrieben haben könnte, aber höchstwahrscheinlich auch nicht.
Einige Dekompilierungswerkzeuge versuchen auch, den tatsächlichen Quellcode zu lokalisieren (über PDBs und Quellserver), und wenn sie in diesem Bestreben erfolgreich sind, dann sehen Sie die tatsächliche Quelle und natürlich tritt in diesem Fall kein Dekompilierungsaufwand auf.
Sicher werden diese Tools versuchen, MSIL zurück zu entwickeln, aber von Ihrem speziellen Beispiel sprechend - es ist nicht möglich, Ihre MSIL zu
zurück zu entwickeln %Vor%Ohne externe Anleitung, wie Symboldateien (.pdb). Versuchen Sie, diese Anweisung oben in einer Bibliothek zu kompilieren, löschen Sie dann die ".pdb" -Datei und legen Sie .dll in dotPeek ab. Sie werden sehen, dass es wie erwartet dekompiliert wird:
%Vor% Stellen Sie jetzt die .pdb-Datei zurück und Sie werden Ihren nameof(C)
-Ausdruck wieder sehen.
Fügen Sie jetzt die .pbd-Datei zurück, ändern Sie jedoch den Quellcode, den Sie zum Kompilieren der .dll-Datei verwendet haben (z. B. Projektordner umbenennen, vollständig löschen oder einfach .dll mit .pdb auf einen anderen Computer verschieben). Lade es erneut in dotPeek und du wirst wieder string foo = "C";
sehen. Das liegt daran, dass .pdb-Symbole möglicherweise einen Pfad zu Ihrem eigentlichen Quellcode enthalten (Sie könnten diese Pfade beispielsweise in Exception-Stack-Traces sehen), die dann von Decompiler-Tools verwendet werden, um sie direkt ohne Dekompilierung anzuzeigen.
Tags und Links c#