使用反射计算代码行数的简单方法
本文关键字:简单 方法 代码 反射 计算 | 更新日期: 2023-09-27 17:50:27
我需要对.net汇编(c#)的代码行数(无空白,无注释)进行(非常粗略的)估计。是否有一个简单的方法来做到这一点,使用反射?
我更喜欢手写的工具(所以我在这里问指针…),但我也会满足于一个自由的(如语音)工具。
下面是我的用例:
我是一个团队的一员,在一个不太大的项目上,几乎没有代码覆盖。我们有一个关于覆盖率的报告,报告说大约60%的覆盖率(这里讨论的是单元测试)但是这个报告没有显示没有单元测试的程序集。
因此,为了使报告接近正确,我想我编写了一个小工具,可以在没有单元测试(我可以找到那些)的情况下对每个程序集调用,并生成一个类似于我们的覆盖工具生成的xml,说明没有覆盖任何内容。作为"语句"的第一个近似,我认为我计算了"代码行"。
使用反射不能计算代码行数。使用反射无法获得此信息。使用反射,您可以获得类成员的签名,并且可以获得这些方法中的原始IL。然而,没有办法将IL有效地转换回代码行。
有几种方法可以做到这一点。您可以(b)使用Reflector之类的工具,并以编程方式调用其程序集,将程序集反编译回c#并执行一些行计数,或者您可以从.pdb文件中获取信息以获得行号。这些程序数据库文件包含所有这些信息。然而,没有办法使用反射读取pdb。
NDepend (Gerrie提到的工具)使用来自.pdb文件的信息来计算行数。
但是既然您已经在使用代码覆盖工具,为什么不为未覆盖的程序集添加空的单元测试项目,并将这些测试项目添加到您的代码覆盖工具中呢?通过这种方式,您可以看到整个项目的总覆盖范围。这将比购买NDepend便宜,也比自己编写LoC计数器便宜得多。
VS2010正在使用Metrics.exe (microsoft)。该工具对编译程序集中的代码行数进行计数。http://blogs.msdn.com/b/camerons/archive/2011/01/28/code-metrics-from-the-command-line.aspx
使用像NDepend这样的工具而不是自己编写所有内容怎么样?
好吧,如果你正在谈论编译程序集(如.dll),那么你不能轻易地从那里获得loc。您所拥有的只是IL指令,而单个LOC通常会生成多个IL指令。如果你想自己滚动,你可能想看看Postsharp,它可以让你遍历IL,你可以计算所有有趣的节点,但这仍然让你猜测如何计算loc。
另一个有趣的项目可能是ILSpy,它有一个反编译器,可以重构c#源代码(大约)。不确定它是否可编写脚本,但它是开源的,所以你可以扩展它到你的需要。
如果pdb文件可用,您还可以尝试从pdb文件中提取信息。这可能是访问pdb
反射给你元数据,而不是代码行。相反,加载程序集,找出类和模块,并给出一个统计信息,说明以下方法/模块没有被覆盖!