6
votes

Programmatiquement inspecter le code .NET

Je cherche un moyen d'inspecter programmatiquement un code source (c #, vb.net, ..) code source pour effectuer une analyse de code statique.

J'aimerais effectuer des requêtes sur le code tels que: - Liste des cours dont le nom commence par x - Énumérez toutes les sous-classes de x - Liste des méthodes qui inconcient un objet de classe x - Déterminez si la méthode x contient une variable nommée Y - Liste des méthodes appelant la méthode y - ...

Ce que je cherche, c'est une API ou autre chose me permettant d'écrire des programmes capables d'examiner un code source.


0 commentaires

8 Réponses :


5
votes

Vous pouvez utiliser System.Reflection, qui devrait faire le truc gentiment pour certaines des choses que vous voulez. En ce qui concerne l'IL lui-même, consultez Mono's Cecil .


3 commentaires

À moins que @Monkeyget regarde le code source. Ensuite, ils voudront probablement un analyseur.


Ou un compilateur :). Oui, j'ai raté qu'il a dit "code source". Je suppose que Ndepend et certains plugins IDE pourraient être utiles. Pardon!


System.Reflection est en effet une option que je vais examiner mais cela semble limité et je suis sûr qu'il doit exister des outils plus puissants et plus simples pour ce que je veux faire. J'ai mentionné le code source dans la question mais un outil travaillant sur IL serait OK aussi.



1
votes

Pourquoi ne pas utiliser FXCop pour statique Analyse de code?


1 commentaires

Parce qu'il veut écrire des logiciels qui lui permettront de faire ce que fait FXCop.



9
votes

Ndepend donne une langue de requête comme SQL pour interroger la structure de code .NET.


4 commentaires

Outil brillant. +1 pour la recommandation Ndepend.


Où est l'interface programmatique dans Ndepend? En d'autres termes, comment peut-on être utilisé à partir de mon propre code C #?


Je crois que Ndepend a une sorte de langage de programmation / de requête ... Cependant, c'est la limite de ma connaissance. Je suppose que vous devriez contacter directement les personnes Ndepend.


Jetez un coup d'œil à ma réponse mise à jour, je décris plus de détails concernant la langue de la programmation / de la requête Ndepend.



1
votes

Voir le Toolkit de réengagement logiciel DMS .

DMS fournit des analyseurs qui construisent automatiquement des asts pour de nombreuses langues (C, C ++, Java, C # [1.2, 2.0, 3.0 et 4.0], COBOL, ECMAScript, PHP, Verilog, ..) ainsi que des tables de symboles et du contrôle et Analyse des flux de données pour plusieurs d'entre eux.

Le langage de motif DMS peut être utilisé pour correspondre aux modèles de syntaxe de surface et associé à une analyse de la procédure aux éléments de code de contact avec les entrées de table des symboles et à diverses relations de flux de données. Il a été utilisé pour mettre en œuvre une grande variété d'outils d'analyse de programme et est conçu pour être un fondement pour vous de construire votre propre outil, sans gaspiller une grande quantité de temps d'infrastructure d'analyse de programme de base.


0 commentaires

0
votes

Qu'en est-il de l'utilisation du modèle de code dans le réflecteur? Avec le modèle Modèle Afficher l'addition, vous devriez pouvoir obtenir l'idée d'interroger la structure du code.


0 commentaires

0
votes

Qu'en est-il de la stylécop? http://code.msdn.microsoft.com/sourcéanalyse . Mais cela ne supporte pas les API.


0 commentaires

0
votes

Pour compléter la réponse de la titusmith, Ndepend semble être ce que vous recherchez. Ndepend permet d'écrire requêtes de code et règles sur les requêtes Linq , (ce que nous appelons Cqlinq ). Disclaimer: Je suis l'un des développeurs de l'outil

par exemple ici sont des requêtes CQLINQ:

-> Liste des classes dont le nom commence par X < pré> xxx

-> répertoriez toutes les sous-classes de x xxx

-> méthodes de liste qui instabiliténe un objet de classe x Xxx

-> méthodes de liste appelant la méthode y - ... xxx

plus que 200 règles de code sont proposées par défaut. Personnalisation des règles existantes ou la création de vos propres règles est simple grâce à la syntaxe bien connue C # Linq.

Les requêtes CQLINQ peuvent être modifiées en direct dans VisualStudio et offrent un résultat instantané, avec la navigation. Installations:

Entrez la description de l'image ici

En réalité, cqlinq est Basé sur NDEPEND.API , et plus spécifiquement sur les types dans l'espace de noms Ndepend.codemodel . Avec NDEPEND.API, vous pouvez écrire des programmes pour faire des choses plus difficiles Thans Thannq Queries CQLINQ, par exemple, nous avons écrit un Code Duplicate Finder Tool avec NDEPEND.API.

Les règles peuvent être vérifiées Vivez dans Visual Studio et à la construction de temps de processus, dans un Rapport JavaScript Généré HTML + .


0 commentaires

0
votes

Je recommanderais d'utiliser ROSLYN pour cela.


1 commentaires

Parce que l'OP a dit «inspecter de manière programmatique. Code source» et c'est ce que Roslyn est tout. L'idée d'utiliser le cadre que c # elle-même utilisera est très attrayante.