.net 程序集的静态分析
我有一个 C# 项目,我需要找到所有未从任何其他公共方法直接或间接调用的私有方法。
此外,对于从公共方法调用的每个私有方法,我需要知道它是哪个公共方法。然后我将确定该方法是否确实是从类的客户端调用的,如果不是,我将能够删除它。
过去,我使用了来自 Lutz Rorder 的代码,它是 Reflector 的基础 - 它有一个分析 IL 代码的选项,并在其之上提供对象模型。我现在找不到这个代码。
有什么建议吗? 也许指向 Lutz Rorder 代码?
萨尔
I have a C# project for which I need to find the all private methods which are not called from any other public method directly or indirectly.
In addition, for each private method which is called from a public method, I need to know which public method it is. Then I will detemine if that method is really called from a client of the class and if not I will be able to remove it.
In the past I used a code from Lutz Rorder which is the base of Reflector - it had an option to analyze IL code and gave object model on top of it. I cannot find this code now.
Any suggestion?
Maybe a point to that Lutz Rorder code?
Saar
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

发布评论
评论(6)
正如 Thomas 所指出的,该工具 NDepend 可以帮助您在 .NET 代码库中查找未使用的代码。 免责声明:我是该工具的开发人员之一。
NDepend 建议编写 基于 LINQ 查询的代码规则 (CQLinq)。提议了大约200 个默认代码规则,其中 3 个专门用于未使用/dead code 检测:
- 潜在死类型(因此检测未使用的类、结构、接口、委托...)
- 潜在死方法 (因此检测未使用的方法、构造函数、属性 getter/setter...)
- 潜在死字段
NDepend 集成在 Visual Studio 中,因此可以检查/浏览/编辑这些规则就在 IDE 内。该工具还可以集成到您的 CI 流程中,并且可以构建报告,显示违反的规则和罪魁祸首代码元素。
如果您点击上面的这 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 }
查询结果将很容易浏览:
不确定它是否能满足所有这些需求,但 FXCop 将为您完成其中大部分任务,并且还将帮助制定大量编码标准。无论哪种方式,都值得运行您的 C# 代码。
我也许可以使用 PowerCommands for Reflector 插件中的查询编辑器来帮助您解决此问题 (http://powercommands.codeplex .com)...我今晚会看看我能想出什么,然后明天告诉你。
否则,您也可以使用 CCI 或 Cecil 编写一个快速应用程序来完成此任务。
询问:
from a in AssemblyManager.Assemblies.Cast<IAssembly>()
where a.Name != "mscorlib"
&& !a.Name.Contains("System")
from m in a.Modules.Cast<IModule>()
from t in m.Types.Cast<ITypeDeclaration>()
from mt in t.Methods.Cast<IMethodDeclaration>()
where mt.Visibility == MethodVisibility.Public
&& !mt.RuntimeSpecialName
&& !mt.SpecialName
&& mt.Body is IMethodBody
from i in ((IMethodBody)mt.Body).Instructions.Cast<IInstruction>()
where i != null
&& i.Value != null
&& i.Value is IMethodReference
&& ((IMethodReference)i.Value).Resolve() != null
&& ((IMethodReference)i.Value).Resolve().Visibility == MethodVisibility.Private
select new {
CallingMethod=t.Namespace + "." + t.Name + "." + mt.Name,
PrivateReferencedMethod=((ITypeReference)((IMemberReference)((IMethodReference)i.Value).Resolve()).DeclaringType).Namespace + "."
+ ((ITypeReference)((IMemberReference)((IMethodReference)i.Value).Resolve()).DeclaringType).Name + "."
+ ((IMethodReference)i.Value).ToString()
}
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
您应该查看 Nitriq Static Code Analysis for .Net - 他们有免费的社区版,其完整的许可证是相当合理。
You should check out Nitriq Static Code Analysis for .Net - They have a free community edition and their full blown license is pretty reasonable.