以编程方式检查.NET代码

时间:2009-10-26 09:39:43

标签: c# .net code-analysis

我正在寻找一种以编程方式检查.NET(C#,VB.NET,..)源代码以执行静态代码分析的方法。

我想对代码执行查询,例如: - 列出名称以x开头的类 - 列出x的所有子类 - 列出实现类x对象的方法 - 确定方法x是否包含名为y的变量 - 列出调用方法y的方法 - ......

我正在寻找的是一个API或其他东西,允许我编写能够检查源代码的程序。

8 个答案:

答案 0 :(得分:9)

NDepend提供了一种类似SQL的查询语言,用于查询.NET代码结构。

答案 1 :(得分:5)

你可以使用System.Reflection,它可以很好地处理你想要的一些事情。至于进入IL本身,请查看Mono的Cecil

答案 2 :(得分:1)

为什么不使用FxCop进行静态代码分析?

答案 3 :(得分:1)

请参阅DMS Software Reengineering Toolkit

DMS提供的解析器可以自动为多种语言(C,C ++,Java,C#[1.2,2.0,3.0和4.0],COBOL,ECMAScript,PHP,Verilog,...)构建AST,以及符号表和控制以及其中几个的数据流分析。

DMS的模式语言可用于匹配表面语法模式,并与过程分析相结合,将代码元素与符号表条目和各种数据流关系联系起来。它已被用于实现各种各样的程序分析工具,旨在为您构建自己的工具奠定基础,而不会浪费大量时间来构建基本的程序分析基础架构。

答案 4 :(得分:0)

在Reflector中使用代码模型怎么样?使用代码模型视图加载项,您应该能够了解如何查询代码结构。

答案 5 :(得分:0)

StyleCop怎么样? http://code.msdn.microsoft.com/sourceanalysis。但它不支持API。

答案 6 :(得分:0)

为了完成stusmith的回答,NDepend似乎就是你要找的东西。 NDepend允许通过LINQ查询编写代码查询和规则,(我们称之为CQLinq)。 免责声明:我是该工具的开发人员之一

例如,这里有一些CQLinq查询:

- >列出名称以x开头的类

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

- >列出x

的所有子类
from t in Application.Types
where t.DeriveFrom("MyNamespace.MyTypeX")
select t

- >列出实现类x

对象的方法
from m in Application.Methods
where m.CreateA("MyNamespace.MyTypeX")
select m

- > list方法调用方法y - ...

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

默认情况下会提出超过200 code rules的内容。由于众所周知的 C#LINQ语法,自定义现有规则或创建自己的规则非常简单。

CQLinq查询可以在VisualStudio中实时编辑,并提供即时结果,具有浏览功能:

enter image description here

实际上,CQLinq基于NDepend.API,更具体地说基于名称空间NDepend.CodeModel中的类型。使用NDepend.API,您可以编写程序来处理更简单的问题,例如CQLinq查询,例如我们用NDepend.API写了一个Code Duplicate Finder tool

可以live in Visual Studio验证规则generated HTML+javascript report并在构建流程时验证规则。

答案 7 :(得分:0)

我建议您使用Roslyn