2009-10-26 5 views
6

Ich bin auf der Suche nach einer Möglichkeit zur programmatischen Untersuchung eines .NET (C#, VB.NET, ..) Quellcodes, um statische Code-Analyse durchzuführen.Programmgesteuert inspizieren. NET-Code

würde Ich mag Anfragen wie auf dem Code auszuführen: - Liste Klassen Name von x beginnen, deren - Liste aller Unterklassen von x - Liste Methoden, die ein Objekt der Klasse instanziiert x - festzustellen, ob Verfahren x enthält eine Variable mit dem Namen y - list Methoden Aufruf der Methode y

Was ich suche ist eine API oder etwas anderes, das mir erlaubt, Programme zu schreiben, die einen Quellcode untersuchen können.

Antwort

5

Sie können System.Reflection verwenden, die für einige der Dinge, die Sie wollen, den Trick gut tun sollte. So weit wie in die IL selbst, schauen Sie sich Monos Cecil.

+0

Es sei denn, @monkeyget schaut sich den Quellcode an. Dann werden sie wahrscheinlich einen Parser wollen. – kenny

+0

Oder ein Compiler :). Ja, ich habe verpasst, dass er "Quellcode" gesagt hat. Ich denke, NDepend und einige der IDE-Plugins könnten dann hilfreich sein. Es tut uns leid! – MichaelGG

+0

System.Reflection ist in der Tat eine Option, die ich untersuchen werde, aber es scheint begrenzt und ich bin mir sicher, dass es leistungsfähigere und einfachere Werkzeuge für das, was ich tun möchte, gibt. Ich erwähnte den Quellcode in der Frage, aber ein Werkzeug, das an IL arbeitet, wäre auch in Ordnung. – Monkeyget

1

Warum nicht FxCop für statische Code-Analyse verwenden?

+0

Weil er Software schreiben will, die es ihm erlaubt, das zu tun, was FxCop macht. –

9

NDepend gibt eine SQL-ähnliche Abfragesprache für die Abfrage von .NET-Code-Struktur.

+0

Brilliantes Werkzeug. +1 für NDepend Empfehlung. –

+0

Wo ist die programmatische Schnittstelle in NDepend? Mit anderen Worten, wie kann es aus meinem eigenen C# -Code verwendet werden? – Ash

+0

Ich glaube, NDepend hat eine Art Programmiersprache/Abfragesprache ... aber das ist die Grenze meines Wissens. Ich nehme an, du müsstest die NDepend Leute direkt kontaktieren. – stusmith

1

Siehe DMS Software Reengineering Toolkit.

DMS bietet Parser, die automatisch ASTs für viele Sprachen erstellen (C, C++, Java, C# [1.2, 2.0, 3.0 und 4.0], COBOL, ECMAScript, PHP, Verilog, ..) sowie Symboltabellen und Kontrolle und Datenflussanalyse für mehrere von diesen.

Die Mustersprache von DMS kann verwendet werden, um Oberflächensyntaxmuster zu vergleichen, und kombiniert mit einer Prozeduranalyse, um Codeelemente mit Symboltabelleneinträgen und verschiedenen Datenflussbeziehungen zu verknüpfen. Es wurde verwendet, um eine Vielzahl von Programmanalyse-Tools zu implementieren, und wurde entwickelt, um eine Grundlage für Sie zu sein, um Ihr eigenes Tool zu erstellen, ohne viel Zeit für den Aufbau einer grundlegenden Programmanalyse-Infrastruktur zu verschwenden.

0

Wie wäre es mit dem Code-Modell in Reflector? Mit dem Code-Modell-Ansicht-Add-In sollten Sie in der Lage sein, die Idee zu bekommen, wie die Struktur des Codes abgefragt wird.

0

Um die Antwort des Stusmith abzuschließen, scheint NDepend das zu sein, wonach Sie suchen. NDepend ermöglicht das Schreiben von Code-Abfragen und -Regeln über LINQ-Abfragen, (was wir CQLinq nennen). Disclaimer: Ich bin einer der Entwickler des Werkzeugs

Zum Beispiel sind hier einige CQLinq Anfragen:

-> Klassen Liste, deren Namen mit x beginnen

from t in Application.Types.WithNameLike("^x") 
where t.IsClass select t 

-> Liste alle Subklassen von x

from t in Application.Types 
where t.DeriveFrom("MyNamespace.MyTypeX") 
select t 

-> Liste Methoden, die ein Objekt der Klasse instanziiert x

from m in Application.Methods 
where m.CreateA("MyNamespace.MyTypeX") 
select m 

-> Liste Methoden Aufruf der Methode y - ...

Mehr als 200 code rules werden standardmäßig vorgeschlagen. Das Anpassen vorhandener Regeln oder das Erstellen eigener Regeln ist dank der bekannten C# LINQ-Syntax problemlos möglich.

CQLinq Abfragen können live in Visual Studio bearbeitet werden und bieten sofortiges Ergebnis, mit Surfen Ausstattung:

enter image description here

Eigentlich ist CQLinq basierend auf NDepend.API und insbesondere auf Typen im Namensraum NDepend.CodeModel. Mit NDepend.API können Sie Programme schreiben, die die CQLinq-Abfragen komplizierter machen, zum Beispiel haben wir eine Code Duplicate Finder tool mit NDepend.API geschrieben.

Regeln können verifiziert werden live in Visual Studio und zur Build-Prozesszeit, in einem generated HTML+javascript report.

0

Ich würde dafür Roslyn empfehlen.

+0

Können Sie erklären warum? –

+0

Weil das OP sagte "programmatisch prüfen .. Quellcode" und das ist, worum es bei Roslyn geht. Die Idee, das Framework als C# selbst zu verwenden, ist sehr ansprechend. –