Analyseur pour C #

101

Quels analyseurs sont disponibles pour analyser le code C #?

Je recherche un analyseur C # qui peut être utilisé en C # et me donne accès aux informations de ligne et de fichier sur chaque artefact du code analysé.

Julien Hoarau
la source

Réponses:

118

Fonctionne sur le code source:

Fonctionne au montage:

Le problème avec "l'analyse" de l'assembly est que nous avons moins d'informations sur la ligne et le fichier (les informations sont basées sur le fichier .pdb, et Pdb contient des informations sur les lignes uniquement pour les méthodes)

Je recommande personnellement Mono.Cecil et NRefactory .

Julien Hoarau
la source
1
CS-Script ( csscript.net ) - le moteur de script C # peut suivre cette liste. Un exemple de «Présentation du CTP Microsoft« Roslyn »» est très similaire à CS-script.
Dzmitry Lahoda
1
Pendant que vous mentionnez les coûts, notez que Roslyn nécessite au moins la version Pro de Visual Studio.
kristianp
7

Mono (open source) inclut le compilateur C # (et bien sûr l'analyseur)

aku
la source
Quel est l'avantage d'utiliser Mono par rapport à un autre analyseur? Puis-je obtenir des informations sur l'AST d'un programme C # en utilisant un visiteur? Si oui, pouvez-vous me diriger vers la page qui montre la page pour cela?
yeeen le
6

Si vous allez compiler C # v3.5 en assemblys .net:

var cp = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });

http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx

zproxy
la source
1
Regardez en particulier la CodeDomProvider.Parse()méthode.
Don Kirkby le
3
Non, ne regardez pas la méthode CodeDomProvider.Parse () qui lève une exception NotImplemented dans les versions publiques! (Visual Studio utilise un analyseur interne propriétaire).
Robin Davies
5

Si vous connaissez ANTLR, vous pouvez utiliser la grammaire Antlr C # .

prosseek
la source
4

J'ai implémenté exactement ce que vous demandez (analyse AST du code C #) dans le projet OWASP O2 Platform à l' aide des API SharpDevelop AST.

Afin de faciliter la consommation, j'ai écrit une API rapide qui expose un certain nombre d'éléments clés du code source (en utilisant des instructions, des types, des méthodes, des propriétés, des champs, des commentaires) et est capable de réécrire le code C # original en C # et en VBNET .

Vous pouvez voir cette API en action sur ce fichier de script O2 XRule: ascx_View_SourceCode_AST.cs.o2 .

Par exemple, voici comment traiter un texte de code source C # et remplir un certain nombre de TreeViews & TextBoxes:

    public void updateView(string sourceCode)
    {   
        var ast = new Ast_CSharp(sourceCode);
        ast_TreeView.show_Ast(ast);
        types_TreeView.show_List(ast.astDetails.Types, "Text");
        usingDeclarations_TreeView.show_List(ast.astDetails.UsingDeclarations,"Text");
        methods_TreeView.show_List(ast.astDetails.Methods,"Text");
        fields_TreeView.show_List(ast.astDetails.Fields,"Text");
        properties_TreeView.show_List(ast.astDetails.Properties,"Text");
        comments_TreeView.show_List(ast.astDetails.Comments,"Text");

        rewritenCSharpCode_SourceCodeEditor.setDocumentContents(ast.astDetails.CSharpCode, ".cs");
        rewritenVBNet_SourceCodeEditor.setDocumentContents(ast.astDetails.VBNetCode, ".vb");                                
    }

L'exemple sur ascx_View_SourceCode_AST.cs.o2 montre également comment vous pouvez ensuite utiliser les informations recueillies auprès de l'AST pour sélectionner sur le code source un type, une méthode, un commentaire, etc.

Pour référence, voici le code API qui a écrit (notez que c'est ma première tentative d'utilisation de l'analyseur C # AST de SharpDevelop, et je suis toujours en train de comprendre comment cela fonctionne):

Dinis Cruz
la source
Oui, cela semble être la solution la plus simple, du moins d'après ce que j'ai vu. Je cherchais un analyseur décent et suis tombé sur ce blog svengrand.blogspot.com/2010/10/ ... qui détaille également comment utiliser l'analyseur C # de SharpDevelop.
Alex
3

Nous avons récemment publié un analyseur C # qui gère toutes les fonctionnalités C # 4.0 ainsi que la nouvelle fonctionnalité async: C # Parser et CodeDOM

Cette bibliothèque génère un modèle d'objet sémantique qui conserve les commentaires et les informations de formatage et peut être modifié et enregistré. Il prend également en charge l'utilisation de requêtes LINQ pour analyser le code source.

Ken Beckett
la source
2

SharpDevelop , un IDE open source, est livré avec un analyseur de code basé sur les visiteurs qui fonctionne très bien. Il peut être utilisé indépendamment de l'IDE.

Akselsson
la source
2

Envisagez d'utiliser la réflexion sur un binaire généré au lieu d'analyser directement le code C #. L'API de réflexion est vraiment facile à utiliser et peut-être pouvez-vous obtenir toutes les informations dont vous avez besoin?

Hallgrim
la source
3
La réflexion est une mauvaise façon de faire une analyse statique; il ne fournit que les informations que la logique de réflexion peut extraire (par exemple, "noms des méthodes dans la classe". Il ne fournit pas d'informations détaillées ("quel est le côté droit de cette affectation?") et limite donc sévèrement ce type de statique analyse que l'on peut faire.
Ira Baxter
@Ira Baxter Il y a quelques limitations, mais rappelez-vous que vous pouvez également obtenir le code IL par réflexion. Cela signifie que vous pouvez comprendre quelles méthodes sont appelées, ce qui est affecté à quelles variables, etc. Je ne peux pas penser à de nombreux cas où cela ne suffit pas. Regardez ce que tous les plugins Reflector peuvent faire.
Hallgrim
comment obtenir le code IL réel via Reflection? Pour autant que je sache, Reflection ne fournit pas cela et vous devez utiliser CCI Voir: stackoverflow.com/questions/2824086/…
Ash
2

Jetez un œil à Gold Parser . Il possède une interface utilisateur très intuitive qui vous permet de tester de manière interactive votre grammaire et de générer du code C #. Il existe de nombreux exemples disponibles et il est entièrement gratuit.

sbeskur
la source
2
L'OP a demandé quelque chose qui peut analyser C #, pas quelque chose en C # qui analyse autre chose.
Ira Baxter
2

Peut-être que vous pourriez essayer avec Irony sur irony.codeplex.com.

C'est très rapide et la grammaire ac # existe déjà.

La grammaire elle-même est écrite directement en c # de manière BNF (obtenue avec certaines surcharges d'opérateurs)

La meilleure chose avec cela est que la "grammaire" produit directement l'AST.

SeeSoft
la source
Le commentaire dans Irony.Samples / CSharp / CSharpGrammar.cs dit "REMARQUE: cette grammaire est juste une démo, et c'est une démo cassée". Ce n'est donc pas du moins une implémentation complète.
vladich le
2

Vous devez absolument vérifier Roslyn car MS vient d'ouvrir (ou ouvrira bientôt) le code avec une licence Apache 2 ici . Vous pouvez également découvrir un moyen d'analyser ces informations avec ce code de GitHub .

Jason
la source
1

Quelque chose qui prend de l'ampleur et très approprié pour le travail est Nemerle

vous pouvez voir comment cela pourrait le résoudre dans ces vidéos de NDC:

Stéphane
la source
Nemerle est un langage de programmation. Un joli langage de programmation, je suis d'accord, mais la question était de savoir comment analyser le code C # à l'intérieur de C #!
Qwertie
vous créez des règles dans nemerle, et l'utilisez à partir de C #, rien ne dit que l'analyseur doit être en C #, mais quoi qu'il en soit, évitez de voter.
Stéphane
1

Pas en C #, mais un analyseur C # 2/3/4 complet qui construit des AST complets est disponible avec notre boîte à outils de réingénierie logicielle DMS .

Le DMS fournit une vaste infrastructure pour l'analyse, la création d'arbres, la construction de tables de symboles et d'analyses de flux, la transformation source-source et la régénération du code source à partir des AST (modifiés). (Il gère également de nombreux autres langages que le simple C #.)

EDIT (septembre) 2013: Cette réponse n'a pas été mise à jour récemment. DMS gère depuis longtemps C # 5.0

Ira Baxter
la source
-1

GPPG peut être utile si vous êtes prêt à écrire votre propre analyseur (ce qui est amusant).

leppie
la source