Analizador para C #

101

¿Qué analizadores están disponibles para analizar el código C #?

Estoy buscando un analizador de C # que se pueda usar en C # y que me dé acceso a información de línea y archivo sobre cada artefacto del código analizado.

Julien Hoarau
fuente

Respuestas:

118

Funciona en código fuente:

Funciona en montaje:

El problema con el "análisis" del ensamblaje es que tenemos menos información sobre la línea y el archivo (la información se basa en el archivo .pdb y Pdb contiene información de líneas solo para los métodos)

Personalmente recomiendo Mono.Cecil y NRefactory .

Julien Hoarau
fuente
1
CS-Script ( csscript.net ): el motor de secuencia de comandos C # puede adaptarse a esta lista. Un ejemplo de "Introducción al CTP" Roslyn "de Microsoft" es muy parecido a lo que puede hacer CS-script.
Dzmitry Lahoda
1
Mientras menciona los costos, tenga en cuenta que Roslyn requiere al menos la versión Pro de Visual Studio.
kristianp
7

Mono (código abierto) incluye el compilador C # (y por supuesto el analizador)

aku
fuente
¿Cuál es la ventaja de usar Mono sobre otro analizador? ¿Puedo obtener información del AST de un programa C # usando un visitante? Si es así, ¿me puede dirigir a la página que muestra la página para eso?
yeeen
6

Si va a compilar C # v3.5 en ensamblados .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
fuente
1
En particular, observe el CodeDomProvider.Parse()método.
Don Kirkby
3
No, no mire el método CodeDomProvider.Parse () que arroja una excepción NotImplemented en compilaciones públicas. (Visual Studio usa un analizador interno patentado).
Robin Davies
4

Implementé justo lo que está pidiendo (análisis AST del código C #) en el proyecto de la plataforma OWASP O2 utilizando las API de SharpDevelop AST.

Para facilitar el consumo, escribí una API rápida que expone una serie de elementos clave del código fuente (usando declaraciones, tipos, métodos, propiedades, campos, comentarios) y es capaz de reescribir el código C # original en C # y en VBNET. .

Puede ver esta API en acción en este archivo de script O2 XRule: ascx_View_SourceCode_AST.cs.o2 .

Por ejemplo, así es como procesa un texto de código fuente C # y completa una serie de TreeViews y 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");                                
    }

El ejemplo en ascx_View_SourceCode_AST.cs.o2 también muestra cómo puede usar la información recopilada del AST para seleccionar en el código fuente un tipo, método, comentario, etc.

Como referencia, aquí está el código API que escribí (tenga en cuenta que este es mi primer paso al usar el analizador C # AST de SharpDevelop, y todavía estoy entendiendo cómo funciona):

Dinis Cruz
fuente
Sí, esta parece ser la más fácil de las soluciones, al menos según lo que he visto. Estaba buscando un analizador decente y me encontré con este blog svengrand.blogspot.com/2010/10/… que también detalla cómo usar el analizador C # de SharpDevelop.
Alex
3

Recientemente hemos lanzado un analizador de C # que maneja todas las características de C # 4.0 más la nueva característica asíncrona: analizador de C # y CodeDOM

Esta biblioteca genera un modelo de objeto semántico que retiene los comentarios y la información de formato y se puede modificar y guardar. También admite el uso de consultas LINQ para analizar el código fuente.

Ken Beckett
fuente
2

SharpDevelop , un IDE de código abierto, viene con un analizador de código basado en visitantes que funciona muy bien. Se puede utilizar independientemente del IDE.

Akselsson
fuente
2

Considere usar la reflexión en un binario construido en lugar de analizar el código C # directamente. La API de reflexión es realmente fácil de usar y tal vez pueda obtener toda la información que necesita.

Hallgrim
fuente
3
La reflexión es una mala forma de hacer análisis estático; proporciona solo la información que la lógica de reflexión puede extraer (por ejemplo, "nombres de métodos en la clase". No proporciona información detallada ("¿cuál es el lado derecho de esta asignación?") y limita tan severamente ese tipo de El análisis se puede hacer.
Ira Baxter
@Ira Baxter Existen algunas limitaciones, pero recuerde que también puede obtener el código IL mediante reflexión. Esto significa que puede comprender qué métodos se llaman, qué se asignan a qué variables, etc. No puedo pensar en muchos casos en los que no sea suficiente. Solo mira lo que pueden hacer todos los complementos de Reflector.
Hallgrim
¿Cómo se obtiene el código IL real a través de Reflection? Por lo que yo sé, Reflection no proporciona esto y debe usar CCI Consulte: stackoverflow.com/questions/2824086/…
Ash
2

Eche un vistazo a Gold Parser . Tiene una IU muy intuitiva que le permite probar interactivamente su gramática y generar código C #. Hay muchos ejemplos disponibles con él y es completamente gratuito.

sbeskur
fuente
2
El OP pidió algo que pueda analizar C #, no algo en C # que analice algo más.
Ira Baxter
2

Quizás puedas probar con Irony en irony.codeplex.com.

Es muy rápido y la gramática ac # ya existe.

La gramática en sí está escrita directamente en c # en una forma similar a BNF (lograda con algunas sobrecargas de operadores)

Lo mejor de todo es que la "gramática" produce el AST directamente.

SeeSoft
fuente
El comentario en Irony.Samples / CSharp / CSharpGrammar.cs dice "NOTA: Esta gramática es solo una demostración, y es una demostración rota". Entonces, al menos no es una implementación completa.
vladich
2

Definitivamente debería revisar Roslyn ya que MS acaba de abrir (o abrirá pronto) el código con una licencia de Apache 2 aquí . También puede consultar una forma de analizar esta información con este código de GitHub .

Jason
fuente
1

Algo que está cobrando impulso y muy apropiado para el trabajo es Nemerle

puedes ver cómo podría solucionarlo en estos videos de NDC:

Stéphane
fuente
Nemerle es un lenguaje de programación. Un buen lenguaje de programación, estoy de acuerdo, pero la pregunta era cómo analizar el código C # dentro de C #.
Qwertie
creas reglas en nemerle y las usas desde C #, nada dice que el analizador tenga que estar en C #, pero lo que sea, rechaza la votación.
Stéphane
1

No en C #, pero un analizador completo de C # 2/3/4 que crea AST completos está disponible con nuestro kit de herramientas de reingeniería de software DMS .

DMS proporciona una amplia infraestructura para el análisis, la construcción de árboles, la construcción de tablas de símbolos y análisis de flujo, la transformación de fuente a fuente y la regeneración de código fuente a partir de los AST (modificados). (También maneja muchos otros lenguajes además de C #).

EDITAR (septiembre) 2013: esta respuesta no se ha actualizado recientemente. DMS ha manejado durante mucho tiempo C # 5.0

Ira Baxter
fuente
-1

GPPG podría ser de utilidad si está dispuesto a escribir su propio analizador (lo cual es divertido).

leppie
fuente