4

我需要对 .net 程序集(c#)的代码行(非空白、非注释)进行(非常粗略的)估计。有没有一种简单的方法可以使用反射来做到这一点?

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

以下是我的用例:
我是一个团队的一员,在一个实际上没有代码覆盖的不太大的项目中。我们有一份关于覆盖率的报告,其中指出了大约 60% 的覆盖率(这里讨论的是单元测试。)但是该报告没有显示根本没有单元测试的程序集。
因此,为了使报告接近正确,我编写了一个小工具,可以在没有单元测试的情况下为每个程序集调用(我可以找到那些),并生成一个类似于我们的覆盖工具生成的 xml,说明没有任何内容被覆盖. 作为“语句”的第一个近似值,我认为我计算了“代码行”。

4

5 回答 5

5

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

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

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

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

于 2011-04-19T07:29:01.140 回答
4

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

于 2011-06-16T20:12:46.933 回答
2

使用NDepend之类的工具而不是自己编写所有内容怎么样?

于 2011-04-19T07:16:25.647 回答
1

好吧,如果您正在谈论已编译的程序集(如在 .dll 中),那么您将无法轻松地从那里获得 LOC。您所拥有的只是 IL 指令,单个 LOC 通常会导致生成多个 IL 指令。如果你想自己动手,你可能想看看Postsharp,它可以让你遍历 IL,你可以计算所有有趣的节点,但这仍然让你猜测如何计算 LOC。

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

您也可以尝试从pdb 文件中提取信息(如果它们可用)。这可能是访问 PDB 的一种更简单的方法

于 2011-04-19T07:34:52.113 回答
0

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

于 2011-04-19T07:36:04.233 回答