我正在使用NDepend 4.1 API计算Visual Studio 2010解决方案中的代码行数,该解决方案有几个项目,这些项目都以.NET Framework 4为目标。这是我的代码:
var servicesProvider = new NDependServicesProvider();
var projectManager = servicesProvider.ProjectManager;
var project = projectManager.CreateTemporaryProject( ... );
var analysisResult = project.RunAnalysis();
var methods = analysisResult.CodeBase.Application.Methods;
var totalLoc = methods.Where( i => i.NbLinesOfCode.HasValue ).Sum( i => i.NbLinesOfCode.Value );
如果我在我的解决方案上重复运行此分析,我会得到totalLoc
的不同结果,即使我没有以任何方式更改解决方案或其编译的程序集例如,如果我运行分析三次,我可能会得到12100、12220和12075的totalLoc
值。
更深入地挖掘,我已经开始迭代analysisResult.CodeBase.Application.Methods
,并将每个方法的名称和NbLinesOfCode
写入一个文本文件。当我对任何两次分析运行的文件进行比较时,我注意到大多数方法都显示出一致的LOC计数,但也有少数方法没有。我看不出这里面有任何模式,而且每次似乎都不是同一组方法。
是什么导致了这种奇怪的行为?
更新1:如果我对任何单个程序集运行分析,我会得到一致的LOC计数。只有当我将多个程序集传递给CreateTemporaryProject
时,才会出现此问题。
这是NDepend版本5中修复的一个错误!
有趣的是,这个bug来自一个subtil并发访问问题,当在两个不同的线程上分析两个大型程序集时,它表现为不同的分析结果!