unentbehrlich: .NET Reflector


ich benutz den Reflector schon … also … jahrelang sozusagen 😉



Ich seh die fragenden Augen der Leser: Reflector ? WTF?!


Um das zu erklären hole ich mal weiter aus und zitiere ein bisschen:


“Reflection is ability to find information about types contained in an assembly at run time. Prior to .NET languages like C++ provided such ability in a limited sense. .NET provides a whole new set of APIs to introspect assemblies and objects.”


Kurz gesagt macht es Reflection möglich das eine .NET Assembly eine andere .NET Assembly fragen kann was sie denn so für Methoden zur Verfügung stellt.


Da das ganze über ein schickes API dem Entwickler zugänglich ist, steht einer Assembly Fragerunde nichts im Wege…


Der .NET Reflector von Lutz Roeder verpackt diese API nun in eine sehr intuitive Oberfläche und baut einige wirklich nette Funktionen zu einem unersetzlichen Tool zusammen.


Zu den einzelnen Funktionen dann im Verlauf mehr… so sieht der Reflector aus:



Zu Demonstrationszwecken habe ich direkt mal die zu dasBlog gehörenden Assemblies geladen (dasBlog ist die Weblog Software die schrankmonster verwendet)



Das gesamte Tool wird fast ausschliesslich über Context-Menüs bedient. Und bei obigem Kontextmenü fallen einem sofort ein paar wirklich spassige Dinge auf… zur Erinnerung: Wir haben KEINEN Quelltext – sondern nur die kompilierten Assemblies der .NET Applikation.


Und um nich gleich mit der besten Funktion anzufangen… hier mal der Call-Graph den der Reflector aus einer Funktion generiert:



Interessant ist das schon deshalb, weil eben kein Quelltext für derartige Analysen notwendig sind.


Für denjenigen der nicht weiss was ein Call-Graph ist: der Call-Graph zeigt die Methode an die von der analysierten Methode “gerufen” werden.


Eine ähnlich nette Sache ist der Callee-Graph:



Der Callee-Graph zieht die Geschichte von hinten auf: Hier werden alle Methoden aufgelistet die die analysierte Methode aufrufen…Cool oder ?


Aber die mit weitem Abstand genialste und nützlichste Funktion des Reflectors:



Mit Hilfe des Disassemblers werden die Methoden im Rahmen der Möglichkeiten zurück in lesbaren Code zurückübersetzt – und zwar nicht in irgendwelches Assembler oder IL Gebrabbel – sondern in wohlformatierten und nicht unhässlichen C#/Basic/Delphi Code – richtig: Man kann auch die Sprache auswählen in der man das ganze geliefert bekommen will:



Und weil das .NET ist, ist es vollkommen Bockwurstsalat ob die Assembly ursprünglich in C# oder in C++ geschrieben worden ist – das ist eben .NET live und in Action 😉


Im obigen letzten Bild hab ich als Disassembler-Zielsprache einfach mal die Intermediate-Language von .NET (MSIL) gewählt… eben das was auch aus dem Kommandozeilen Disassembler des .NET Frameworks herausfällt.


Der Auftrag ist klar: jeder der sich mit .NET beschäftigt oder beschäftigen will sollte sich den Reflector mal anschauen…der ganze Zauber ist im übrigen kostenlos…das ist doch .net(t) nicht ? 😉


… ach und nochwas: das Reflection Feature hat soviele gute Seiten… ein paar schlechte gibt es da auch: Man kann Reflection nur erschweren, so richtig verhindern kann man sie bei echten .NET Assemblies nicht. – Warum das ein Nachteil sein kann: Man stelle sich vor man schreibt ein Programm und verkauft nun Produktschlüssel dafür mit denen man sein Programm aktivieren kann. – Dummerweise muss man einen heiden-Aufwand treiben um zu verhindern das sich Bösewichte einen Keygen einfach aus den per Reflection disassemblierten Methoden basteln… natürlich ist das illegal – aber das interessiert Bösewichte ja nicht.


Quelle 1: http://www.dotnetbips.com/displayarticle.aspx?id=35
Quelle 2: http://www.aisto.com/roeder/dotnet/
Quelle 3: http://www.dasblog.net

  1. #1 by Anonymous on February 18, 2005 - 00:25

    Reflector benutzt nicht das Reflection API sondern hat ein eigenes CodeModel API mit assembly files gelesen werden.

  2. #2 by Roland Schumacher on January 27, 2006 - 12:46

    Hallo

    Wie kommst du zur der Funktion Call-Graph?
    Ich finde es bei mir nicht. Habe die Version 4.2.0.0

Comments are closed.