使用反射计算代码行的简便方法

时间:2011-04-19 07:12:51

标签: c# .net reflection lines-of-code

我需要对.net程序集(c#)的代码行(非空白,无注释)进行(非常粗略的)估计。使用反射有一种简单的方法吗?

我更喜欢手写工具(所以我在这里询问指针......)但我也会选择免费(如语音)工具。

以下是我的用例:
我是一个团队的一员,在一个不那么大的项目中,没有任何代码覆盖。我们有一份关于覆盖范围的报告,其中约有60%的覆盖范围(在此讨论单元测试。)此报告不显示完全没有单元测试的组件。
因此,为了使报告接近正确,我要写一个小工具,可以在没有单元测试的情况下为每个组件调用(我可以找到它们)并生成一个xml,就像我们的coverage工具生成的那样,说明什么都没有覆盖。作为“陈述”的第一个近似值,我认为我算作“代码行”。

5 个答案:

答案 0 :(得分:5)

您无法使用反射计算代码行数。使用反射无法获得此信息。使用反射,您可以获得类成员的签名,您可以在这些方法中获取原始IL。但是,你无法有效地将IL转换回代码行。

有几种方法可以做到这一点。您可以(ab)使用诸如Reflector之类的工具并以编程方式调用其程序集以将程序集反编译回C#并进行一些行计数,或者您可以从.pdb文件中获取信息以获取行号。那些程序数据库文件包含所有这些信息。但是,无法使用反射来阅读pdbs。

NDepend(Gerrie提到的工具)使用.pdb文件中的信息来计算行数。

但是,由于您已经在使用代码覆盖率工具,为什么不为未覆盖的程序集添加空单元测试项目,并将这些测试项目添加到代码覆盖率工具中。这样您就可以看到整个项目的总覆盖范围。这比购买NDepend便宜,而且比自己手写LoC便宜得多。

答案 1 :(得分:4)

VS2010正在使用Metrics.exe(微软)。该工具对已编译程序集中的代码行进行计数。 http://blogs.msdn.com/b/camerons/archive/2011/01/28/code-metrics-from-the-command-line.aspx

答案 2 :(得分:2)

如何使用像NDepend这样的工具而不是自己编写所有内容?

答案 3 :(得分:1)

好吧,如果你正在谈论编译的程序集(如.dll中),那么你就不能轻易地从那里获得LOC。您只需要IL指令,单个LOC通常会生成多个IL指令。如果你想自己动手,你可能想看看Postsharp,它可以让你走IL,你可以计算所有有趣的节点,但这仍然让你猜测如何计算LOC。 / p>

另一个有趣的项目可能是ILSpy,它有一个反编译器,可以重建C#源代码(大约)。不确定它是否是可编写脚本的,但它是开源的,因此您可以根据需要进行扩展。

如果可用,您还可以尝试从pdb files中提取信息。这可能是an easier way of getting access to the PDBs

答案 4 :(得分:0)

Reflection为您提供元数据,而不是代码行。而是加载程序集,找出类和模块,并提供统计信息,说明不包含以下方法/模块!