【问题标题】:search method names in assembly在程序集中搜索方法名称
【发布时间】:2016-09-18 07:53:27
【问题描述】:

如果我在 C# 中有如下代码,其中 MyClass 是项目库中的某个类。如何进行静态分析,找出代码中 Method1 和 Method2 被调用了多少次。

输出应该是:namespace.MyClass.Method1 = 4, namespace.MyClass.Method2 = 1

namespace.MyClass obj = new namespace.MyClass()
obj.Method1();
obj.Method2();

namespace.MyClass obj2 = new namespace.MyClass()
obj.Method1();
obj.Method1();
obj.Method1();

谢谢, D.

【问题讨论】:

  • 您声明问题的方式似乎根本不需要反思(虽然看起来您正在尝试使用它)。只需定义一个(可能)全局字典,每次调用方法时都会增加字典中的相应条目。

标签: c# static-analysis


【解决方案1】:

在 Visual Studio 中,右键单击您的方法并选择“查找所有引用”。

【讨论】:

  • 我实际上需要在代码中执行它作为静态代码分析的一部分,以便根据某些类和方法的使用方式对代码进行一些分析。
  • 当您想要拦截方法调用时,您正在寻找面向方面的编程。 msdn.microsoft.com/en-us/magazine/dn574804.aspx.
【解决方案2】:

如果您拥有 Visual Studio 专业版或更高版本,则可以使用 Instrumentation 分析来收集有关您的流程的信息。其中会有计数器确定特定函数在堆栈上放置了多少次(该函数被调用了多少次)。

有关仪器分析的更多信息 https://msdn.microsoft.com/en-us/library/ms182369.aspx

其他选项,如果您只需要计数,您可以在方法的开头放置一个日志调用(使用 Trace 类 https://msdn.microsoft.com/en-us/library/system.diagnostics.trace(v=vs.110).aspx 或一些 3rd 方库,如 log4net)并在执行后从日志文件中计算方法调用。

【讨论】:

    【解决方案3】:

    您可以使用工具NDepend 编写C# LINQ 查询以查看哪个方法正在调用哪个其他方法。

    from m in Application.Methods
    select new { m, m.MethodsCallingMe }
    

    您还可以右键单击特定方法并生成查询以获取该方法的调用者:

    结果是:

    请注意,在上面的屏幕截图中,您还可以生成 C# LINQ 查询来获取方法的所有调用者(传递)(菜单选择正在使用我的方法(直接和间接))。在这种情况下,查询结果可以导出到依赖图,您可以看到方法的传递调用者。

    call graph 可能如下所示:

    免责声明:我为 NDepend 工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多