2008-09-17 28 views
94

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

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

Respuesta

115

Obras en el código fuente:

Obras en el montaje:

El problema con el montaje de "análisis" es que tenemos menos información sobre la línea y el archivo (las informaciones se basan. archivo PDB, y proteína contiene información líneas solamente para los métodos)

I personnaly recomiendan Mono.Cecil y NRefactory.

+1

CS-Script (http://www.csscript.net/) - el motor de secuencias de comandos C# puede incluir esta lista. La muestra de "Introducción al Microsoft" Roslyn "CTP" es muy similar a CS-script. –

+1

Mientras menciona los costos, tenga en cuenta que Roslyn requiere al menos la versión Pro de Visual Studio. – kristianp

7

Mono (open source) incluye compilador de C# (y del analizador supuesto)

+0

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

2

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

2

Considere utilizar la reflexión en un binario construido en lugar de analizar directamente el código C#. La API de reflexión es realmente fácil de usar y quizás puedas obtener toda la información que necesitas.

+3

La reflexión es una mala forma de hacer un 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 clase". No proporciona información detallada ("¿cuál es el lado derecho de esta asignación?") y limita de forma severa ese tipo de estática se puede hacer un análisis. –

+0

@Ira Baxter Existen algunas limitaciones, pero recuerde que también puede obtener el código IL por reflexión. Esto significa que puede entender qué métodos se llaman, qué se asignan a qué variables, etc. No se me ocurre muchos casos en los que no es suficiente. Basta con ver lo que todos los complementos de Reflector pueden hacer. – Hallgrim

+0

¿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 Ver: http://stackoverflow.com/questions/2824086/is-it-possible-to-inspect-an-assemblys-il-instructions-programmatically-using-ma – Ash

-1

GPPG puede ser útil, si está dispuesto a escribir su propio analizador (que es divertido).

2

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

+2

El OP pidió algo que pueda analizar C#, no algo en C# que analiza algo más. –

4

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

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

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

Por ejemplo, esto es cómo se procesa un C# código fuente de texto y rellenar una serie de TreeViews & cuadros de texto:

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 de ascx_View_SourceCode_AST.cs.o2 también muestra cómo se puede utilizar la información obtenida de la AST a seleccione en el código fuente un tipo, método, comentario, etc.

Como referencia, aquí está el código API que escribió (tenga en cuenta que esta es mi primera vez al usar el analizador C# AST de SharpDevelop, y todavía estoy obteniendo mi cabeza alrededor de cómo funciona):

+0

Sí, esta parece ser la más fácil de las soluciones, al menos en función de lo que he visto. Estaba buscando un analizador decente y tropecé con este blog http://svengrand.blogspot.com/2010/10/example-para-paso-código-con.html que también detalla cómo usar el analizador C# de SharpDevelop. – Alex

1
No

en C#, pero un total de C# 2/3/4 analizador que construye AST completo está disponible con nuestro DMS Software Reengineering Toolkit.

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

EDIT (septiembre) 2013: Esta respuesta no ha sido actualizada recientemente. DMS ha manejado largo de C# 5.0

6

Si va a compilar C# .NET v3.5 a asambleas:

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

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

+0

Particularmente, mire el método ['CodeDomProvider.Parse()'] (http://msdn.microsoft.com/en-us/library/system.codedom.compiler.codedomprovider.parse). –

+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). –

2

Tal vez podrías probar con Irony en irony.codeplex.com.

Es muy rápido y ya existe una gramática C#.

La gramática en sí se escribe directamente en C# en una BNF como forma (acheived con algunos operadores sobrecargas)

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

+0

Irony es una herramienta maravillosa como analizador general. –

+0

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

3

Recientemente hemos lanzado un analizador C# que maneja todo C# 4.0 funciones más la nueva función de sincronización: C# Parser and CodeDOM

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

1

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

se puede ver cómo se podría resolver en estos videos de NDC:

+0

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

+0

creas reglas en nemerle, y las usas desde C#, nada dice que el analizador tiene que estar en C#, pero lo que sea, bajó de nivel. –

2

Debería echar un vistazo a Roslyn ya que MS acaba de abrir (o abrirá pronto) el código con Apach e 2 licencia here. También puede consultar una forma de analizar esta información con este código desde GitHub.

+0

Está aquí ahora: https://github.com/dotnet/roslyn –