我正在寻找一种以编程方式检查.NET(C#,VB.NET,..)源代码以执行静态代码分析的方法。
我想对代码执行查询,例如: - 列出名称以x开头的类 - 列出x的所有子类 - 列出实现类x对象的方法 - 确定方法x是否包含名为y的变量 - 列出调用方法y的方法 - ......
我正在寻找的是一个API或其他东西,允许我编写能够检查源代码的程序。
答案 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中实时编辑,并提供即时结果,具有浏览功能:
实际上,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。