我有一个C#项目,我需要找到所有的私有方法,这些方法不是直接或间接从任何其他公共方法调用的。
此外,对于从公共方法调用的每个私有方法,我需要知道它是哪个公共方法。然后,我将确定该方法是否真的是从类的客户端调用的,如果不是,我将能够删除它。
在过去,我使用的是Lutz Rorder的代码,它是Reflector的基础-它有一个分析IL代码的选项,并在它上面给出了对象模型。我现在找不到这个代码。
有什么建议吗?也许可以指向Lutz Rorder代码?
Saar
发布于 2010-04-19 04:55:49
你应该去看看Nitriq Static Code Analysis for .Net --他们有一个免费的社区版,而且他们的成熟的许可证是相当合理的。
发布于 2010-09-01 22:35:06
正如托马斯所指出的,NDepend工具可以帮助您在.NET代码库中查找未使用的代码。免责声明:我是这个工具的开发者之一。
NDepend建议编写Code Rule over LINQ Query (CQLinq)。围绕200 default code rules提出,其中3个专门用于未使用/死代码检测:
在Visual Studio中集成了NDepend,因此这些规则可以是checked/browsed/edited right inside the IDE。该工具还可以集成到您的CI流程中,它可以构建reports,以显示违反规则和罪魁祸首的代码元素。
如果你点击上面这些规则源代码的3个链接,你会发现关于类型和方法的链接有点复杂。这是因为它们不仅检测未使用的类型和方法,而且还检测仅由未使用的死类型和方法(递归)使用的类型和方法。
这是静态分析,因此规则名称中可能有前缀。如果代码元素仅通过反射使用,这些规则可能会将其视为未使用,但事实并非如此。
除了使用这3条规则之外,我还建议通过测试来衡量代码覆盖率,并努力获得全面的覆盖率。通常,您会看到测试无法覆盖的代码实际上是可以安全地丢弃的未使用/死代码。这在复杂的算法中特别有用,因为它不清楚代码的分支是否可达。
此外,对于从公共方法调用的每个私有方法,我需要知道它是哪个公共方法。
要获取此信息,使用CQLinq时,您只需编写:
from m in Application.Methods
where m.IsPrivate
let publicMethodsCallingMe = m.MethodsCallingMe.Where(m1 => m1.IsPublic)
where publicMethodsCallingMe.Count() > 0
select new { m, publicMethodsCallingMe }查询结果将很容易浏览:

发布于 2009-11-04 15:52:38
嗯,做这件事的唯一方法(至少是我所知道的唯一方法……)暗示使用商业(但不是很贵)工具,即NDepend。
除此之外,您还可以针对已编译的程序集编写类似SQL的查询,这允许进行非常细粒度的分析。他们称之为CQL,语法是自解释的,NDepend的智能感知/自动完成支持以及通用的帮助/文档都很好。
(AFAIK他们还提供了一个功能齐全的试用,如果这对你有帮助的话…)
哈!
https://stackoverflow.com/questions/1672192
复制相似问题