繁体   English   中英

如何确定方法中调用哪些方法?

[英]How to determine which methods are called in a method?

我想列出从特定方法调用的所有方法。 例如,如果我有以下代码:

public void test1() {

   test2();


   test3();
}

该列表应包含test2()和test3()。 如果可以列出相同类的方法以及另一个类的方法,那将是很好的。

另外,我想找到一种方法来检测方法使用哪些字段:

public class A {

   private String test1 = "";
   private String test2 = "";

   public void test() {
      Console.WriteLine(test1);
   }

}

因此应该列出test1。

我尝试使用Mono.Cecil,但遗憾的是我找不到很多关于该项目的文档。 那么有人知道怎么做吗?

编辑:我想用Mono.Cecil来做,因为通过它的API我可以直接在我的应用程序中使用结果。 如果我在Visual Studio或类似工具中使用内置工具,则很难处理结果。

我没有真正使用过Cecil,但是HowTo页面显示了如何枚举类型,你的问题似乎只需要循环你的后续指令:Call和Load Field。 这个示例代码似乎处理了您提到的案例,但可能还有更多,您应该检查其他调用说明。 如果您使其递归,请确保跟踪已经检查过的方法。

static void Main(string[] args)
{
    var module = ModuleDefinition.ReadModule("CecilTest.exe");

    var type = module.Types.First(x => x.Name == "A");
    var method = type.Methods.First(x => x.Name == "test");

    PrintMethods(method);
    PrintFields(method);

    Console.ReadLine();
}

public static void PrintMethods(MethodDefinition method)
{
    Console.WriteLine(method.Name);
    foreach (var instruction in method.Body.Instructions)
    {
        if (instruction.OpCode == OpCodes.Call)
        {
            MethodReference methodCall = instruction.Operand as MethodReference;
            if(methodCall != null)
                Console.WriteLine("\t" + methodCall.Name);
        }
    }
}


public static void PrintFields(MethodDefinition method)
{
    Console.WriteLine(method.Name);
    foreach (var instruction in method.Body.Instructions)
    {
        if (instruction.OpCode == OpCodes.Ldfld)
        {
            FieldReference field = instruction.Operand as FieldReference;
            if (field != null)
                Console.WriteLine("\t" + field.Name);
        }
    }
}

这不能简单地使用C#中的反射API来完成。 真的,您需要解析原始源代码,这可能不是您正在寻找的解决方案。 但是,例如,这是Visual Studio获取此类信息进行重构的方式。

你可能会在某处分析IL - 就像Reflector所做的那样,但我认为这将是一项巨大的工作。

如果您想付费,可以使用.NET Reflector工具 你也可以看看这个.NET方法依赖,但是它会变得棘手,因为你将要进入IL。 第三种可能是在VS中使用宏引擎,它确实有分析代码的工具, CodeElement ,我不确定它是否可以做依赖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM