gpt4 book ai didi

c# - 如何判断一个方法中调用了哪些方法?

转载 作者:太空狗 更新时间:2023-10-29 20:14:59 25 4
gpt4 key购买 nike

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

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 说明。如果您使其递归,请确保跟踪您已经检查过的方法。

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# - 如何判断一个方法中调用了哪些方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4073828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com