Static net程序集的静态分析

Static net程序集的静态分析,static,analysis,reflector,il,Static,Analysis,Reflector,Il,我有一个C项目,我需要找到所有私有方法,这些方法不是直接或间接从任何其他公共方法调用的 此外,对于从公共方法调用的每个私有方法,我需要知道它是哪个公共方法。然后我将确定该方法是否真的从类的客户端调用,如果不是,我将能够删除它 在过去,我使用了Lutz Rorder的代码,这是Reflector的基础-它可以选择分析IL代码,并在上面给出对象模型。我现在找不到这个代码 有什么建议吗? 也许是指向Lutz Rorder密码的一点 Saar不确定它是否能满足所有这些需求,但FXCop将为您完成大部分工

我有一个C项目,我需要找到所有私有方法,这些方法不是直接或间接从任何其他公共方法调用的

此外,对于从公共方法调用的每个私有方法,我需要知道它是哪个公共方法。然后我将确定该方法是否真的从类的客户端调用,如果不是,我将能够删除它

在过去,我使用了Lutz Rorder的代码,这是Reflector的基础-它可以选择分析IL代码,并在上面给出对象模型。我现在找不到这个代码

有什么建议吗? 也许是指向Lutz Rorder密码的一点


Saar不确定它是否能满足所有这些需求,但FXCop将为您完成大部分工作,并将帮助您完成许多编码标准。无论哪种方式,都值得运行您的c代码


好吧,唯一能做到这一点的方法至少是我知道的唯一方法。。。意味着使用一种商业但不太昂贵的工具,即

在许多其他事情中,您可以针对已编译的程序集编写类似SQL的查询,这允许进行非常细粒度的分析。他们称之为CQL,语法是自我解释的,NDepend的IntelliSense/auto completion支持以及一般帮助/文档都非常好

好吧,他们还提供了功能齐全的试用版,如果这对你有帮助的话


反射器仍具有此功能。只需右键单击该方法,然后单击“分析”。按照树状视图中的链接进行操作

您不会说您是否需要在代码中完成它,或者只是“直观地”完成它


如果需要代码,我相信您可以使用Reflector SDK。

我可能可以使用PowerCommands for Reflector加载项中的查询编辑器来帮助您完成此任务。。。我看看今晚能想出什么,明天再告诉你

否则,您也可以使用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()
}

你应该去看看-他们有一个免费的社区版,他们的完整许可证非常合理。

正如Thomas所指出的,该工具可以帮助你在.NET代码库中查找未使用的代码。免责声明:我是这个工具的开发者之一

独立党提议写作。提出了四种方法,其中三种专门用于未使用/死代码检测:

因此检测未使用的类、结构、接口、委托。。。 因此检测未使用的方法、ctor、属性getter/setter。。。 NDepend集成在VisualStudio中,因此可以修改这些规则。该工具还可以集成到您的CI流程中,它可以生成显示违反规则和罪魁祸首代码元素的代码

如果你点击上面的3个链接来查看这些规则的源代码,你会发现关于类型和方法的链接有点复杂。这是因为它们不仅检测未使用的类型和方法,而且检测仅由未使用的死类型和递归方法使用的类型和方法

这是静态分析,因此规则名称中可能包含前缀。如果只通过反射使用代码元素,则这些规则可能会认为它是未使用的,而不是这样。p> 除了使用这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 }
查询结果将易于浏览:


在第二次阅读您的问题之后-如果您有兴趣编写一个实用程序来完成您正在寻找的功能-然后检查:如果您想尝试从Reflector获取信息,您可以使用以下查询来获取公共方法调用的所有私有方法。注意:假设您的所有依赖项都已加载到Reflector中。。。如果出现一个对话框,要求定位程序集,则必须单击“跳过”,否则将杀死Reflector。我还添加了过滤,以忽略mscorlib或任何系统程序集,以及忽略特殊命名方法构造函数和属性方法。我有一篇博客文章介绍了查询编辑器:,我应该在第二天或第二天有另一个更详细的。FxCop将找到未使用的私有方法。对于使用的方法,右键单击该方法并从菜单中选择“查找所有引用”。