2009-10-26 14 views
6

Estoy buscando una forma de inspeccionar mediante programación un código fuente .NET (C#, VB.NET, ..) para realizar un análisis de código estático.Inspeccione programáticamente el código .NET

me gustaría realizar consultas sobre el código tales como: - Lista de clases cuyo nombre comience por x - Lista de todas las subclases de x - métodos de listas, que instanciar un objeto de clase X - determinar si el método x contiene una variable llamada y - enumera los métodos que llaman al método y - ...

Lo que estoy buscando es una API u otra cosa que me permita escribir programas capaces de examinar un código fuente.

Respuesta

5

Puede utilizar System.Reflection, que debería hacer las cosas bien para algunas de las cosas que desea. En cuanto a entrar en la propia IL, echa un vistazo a Mono Cecil.

+0

A menos que, @monkeyget esté buscando el código fuente. Entonces probablemente querrán un analizador. – kenny

+0

O un compilador :). Sí, eché de menos que dijo "código fuente". Supongo que NDepend y algunos de los complementos IDE podrían ser de ayuda en ese momento. ¡Lo siento! – MichaelGG

+0

System.Reflection es de hecho una opción que examinaré pero parece limitada y estoy seguro de que debe haber herramientas más potentes y simples para lo que quiero hacer. Mencioné el código fuente en la pregunta, pero una herramienta que trabaje en IL estaría bien también. – Monkeyget

1

¿Por qué no utilizar FxCop para el análisis de código estático?

+0

Porque quiere ESCRIBIR un software que le permita hacer lo que hace FxCop. –

9

NDepend proporciona un lenguaje de consulta similar a SQL para consultar la estructura de código .NET.

+0

Brillante herramienta. +1 para NDepende la recomendación. –

+0

¿Dónde está la interfaz programática en NDepend? En otras palabras, ¿cómo se puede usar desde mi propio código C#? – Ash

+0

Creo que NDepend tiene algún tipo de lenguaje de programación/consulta ... sin embargo, ese es el límite de mi conocimiento. Supongo que tendrías que contactar a la gente de NDepender directamente. – stusmith

1

Ver el DMS Software Reengineering Toolkit.

DMS proporciona analizadores que crean automáticamente AST para varios idiomas (C, C++, Java, C# [1.2, 2.0, 3.0 y 4.0], COBOL, ECMAScript, PHP, Verilog, ..) así como tablas de símbolos y control y análisis de flujo de datos para varios de estos.

El lenguaje de patrones de DMS se puede usar para combinar patrones de sintaxis de superficie, y combinado con análisis de procedimientos para unir elementos de código junto con entradas de tabla de símbolos y varias relaciones de flujo de datos. Se ha utilizado para implementar una amplia variedad de herramientas de análisis de programas, y está diseñado para ser una base para que usted construya su propia herramienta, sin perder una gran cantidad de tiempo creando una infraestructura básica de análisis de programas.

0

¿Qué hay de usar el modelo de código en Reflector? Con el complemento de vista de modelo de código, debería poder hacerse una idea de cómo consultar la estructura del código.

0

Para completar la respuesta del stusmith, NDepend parece ser lo que está buscando. NDepen permite escribir consultas y reglas de código sobre las consultas LINQ, (lo que llamamos CQLinq). responsabilidad: yo soy uno de los desarrolladores de la herramienta

Por ejemplo, aquí están algunas consultas CQLinq:

- Clases> lista cuyo nombre comience por x

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

-> lista de todos los subclases de x

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

- métodos> lista que instanciar un objeto de clase x

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

-> enumerar los métodos que llaman al método y - ...

from m in Application.Methods 
where m.IsUsing("MyNamespace.MyType.MyMethodY()") 
select m 

Más de 200 code rules son propuestos por defecto. La personalización de las reglas existentes o la creación de sus propias reglas es sencilla gracias a la conocida sintaxis C# LINQ.

consultas CQLinq se pueden editar en vivo en VisualStudio, y ofrecen resultados instantáneos, con funciones de consulta:

enter image description here

En realidad, CQLinq se basa en NDepend.API, y más específicamente en los tipos en el espacio de nombres NDepend.CodeModel. Con NDepend.API puedes escribir programas para hacer cosas más complicadas solo con consultas CQLinq, por ejemplo, escribimos un Code Duplicate Finder tool con NDepend.API.

Las reglas se pueden verificar live in Visual Studio y en el tiempo de proceso de compilación, en un generated HTML+javascript report.

0

Recomendaría usar Roslyn para esto.

+0

¿Puedes explicar por qué? –

+0

Porque el OP dijo 'inspecciona programáticamente ... el código fuente' y de eso se trata Roslyn. La idea de utilizar el framework como C# en sí misma es muy atractiva. –

Cuestiones relacionadas