以编程方式检查 .NET 代码

7
我正在寻找一种以编程方式检查.NET(C#,VB.NET等)源代码以执行静态代码分析的方法。
我想对代码执行查询,例如: - 列出名称以x开头的类 - 列出所有x的子类 - 列出实例化类x对象的方法 - 确定方法x是否包含名为y的变量 - 列出调用方法y的方法 - ...
我正在寻找的是一个API或其他允许我编写程序来检查源代码的东西。
8个回答

9

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


绝妙的工具。NDepend 推荐值 +1。 - this. __curious_geek
NDepend中的编程接口在哪里?换句话说,它如何从我的C#代码中使用? - Ash
我相信NDepend有某种编程/查询语言...但那是我知道的极限。我猜你需要直接联系NDepend团队。 - stusmith
请看我的更新答案,我描述了有关NDepend编程/查询语言的更多细节。 - Patrick from NDepend team

5

您可以使用System.Reflection,这对于您想要的某些功能非常有用。至于如何进入IL本身,请查看Mono的Cecil


除非@monkeyget正在查看源代码,否则他们可能需要一个解析器。 - kenny
或者一个编译器:)。是的,我错过了他说的“源代码”。我猜NDepend和一些IDE插件可能会有所帮助。对不起! - MichaelGG
System.Reflection确实是一个我会考虑的选项,但它似乎有限并且我肯定存在更强大且更简单的工具,以满足我想要做的事情。我在问题中提到了源代码,但也可以使用处理IL的工具。 - Monkeyget

1

请查看DMS软件重构工具包

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

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


1

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


因为他想编写软件,使他能够像FxCop一样执行操作。 - Mike Hofer

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

-> 列出调用方法 y 的方法列表 - ...

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

默认情况下,提出了200个代码规则。由于C# LINQ语法的广为人知,定制现有规则或创建自己的规则非常简单。

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

enter image description here

实际上,CQLinq基于NDepend.API,更具体地说是基于NDepend.CodeModel命名空间中的类型。使用NDepend.API,您可以编写程序来执行比仅使用CQLinq查询更棘手的任务,例如我们使用NDepend.API编写了一个代码重复查找工具

规则可以在Visual Studio中实时验证和构建过程时间,在生成的HTML+javascript报告中进行验证。


0

使用Reflector中的代码模型怎么样?通过代码模型视图插件,您应该能够了解如何查询代码结构的想法。


0

0
我建议使用Roslyn来完成这个任务。

因为 OP 说“以编程方式检查源代码”,这正是 Roslyn 所关注的。使用框架本身作为 C# 的实现的想法非常吸引人。 - Michael Viktor Starberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接