C# 有没有办法通过反射找到方法中调用了哪些方法?

C# 有没有办法通过反射找到方法中调用了哪些方法?,c#,.net,C#,.net,我正在构建一个v4.5c#/.NET应用程序,必须找出哪些方法依赖于某个方法。我想列出那些方法 例如,如果我在一个类中有一个方法,并且该方法使用另一个方法: public void Test() { CallMethodA(); CallMethodB(); } 当我将方法Test传递给我的应用程序时,我希望它通过反射输出CallMethodA和CallMethodB 到目前为止,我已经创建了以下内容: MethodBase methodBase = typeof(TestCl

我正在构建一个v4.5c#/.NET应用程序,必须找出哪些方法依赖于某个方法。我想列出那些方法

例如,如果我在一个类中有一个方法,并且该方法使用另一个方法:

public void Test()
{
    CallMethodA();
    CallMethodB();
}
当我将方法
Test
传递给我的应用程序时,我希望它通过反射输出CallMethodA和CallMethodB

到目前为止,我已经创建了以下内容:

MethodBase methodBase = typeof(TestClass).GetMethod("Test");
var instructions = MethodBodyReader.GetInstructions(methodBase);

foreach (Instruction instruction in instructions)
{
    MethodInfo methodInfo = instruction.Operand as MethodInfo;

    if(methodInfo != null)
    {

    }
}

这非常类似于创建自己的应用程序,如或。若您想知道在类的方法中进行了哪些调用,就必须创建类似Reflector的东西。还有,一定要退房;这会有帮助的

关于ILSpy ILSpy是开源的.NET程序集浏览器和反编译器

开发开始后,红门宣布免费版本的 到2011年2月底,.NET Reflector将不复存在


这非常类似于创建自己的应用程序,如或。若您想知道在类的方法中进行了哪些调用,就必须创建类似Reflector的东西。还有,一定要退房;这会有帮助的

关于ILSpy ILSpy是开源的.NET程序集浏览器和反编译器

开发开始后,红门宣布免费版本的 到2011年2月底,.NET Reflector将不复存在

这是一个很好的开始。这个问题的答案中有很多教程

但是,这将只提供静态分析,即方法在编译时调用。如果有对接口或虚拟方法的方法调用,则不知道在运行时实际调用了哪些其他方法。如果您想知道在运行时实际调用了什么代码,您需要通过插装来收集覆盖率信息。

将是一个很好的起点。这个问题的答案中有很多教程


但是,这将只提供静态分析,即方法在编译时调用。如果有对接口或虚拟方法的方法调用,则不知道在运行时实际调用了哪些其他方法。如果你想知道在运行时实际调用了什么代码,你需要通过插装来收集覆盖率信息。

什么是
MethodBodyReader
?@mikez-我想他想要这样的东西,告诉它里面调用的所有方法。我不知道怎么做,但要小心编译器内联(出于性能原因,它将用目标方法主体中的指令替换方法调用指令)@Eve我不认为是那样的,因为该项目有一个名为
iInstruction
而不是
Instruction
的类型,并且没有一个名为
GetInstructions
的静态方法。您正在做的工作会很好。在IL流中查找call和callvirt,它们将有一个指向方法的元数据标记。使用module.resolvexxx获取methodinfo的方法。本地方法的Calli将不会有methodinfo,我不认为。你不会在这里看到内联,因为这是由jit完成的,而不是由C#编译器完成的。它是
MethodBodyReader
?@mikez-我想他想要这样的东西,它告诉在其中调用的所有方法。我不知道怎么做,但是小心编译器内联(出于性能考虑,内联会将方法调用指令替换为目标方法体中的指令)@Eve我不认为是那样的,因为该项目有一个名为
iInstruction
而不是
Instruction
的类型,并且没有一个名为
GetInstructions
的静态方法。您正在做的工作会很好。在IL流中查找call和callvirt,它们将有一个指向方法的元数据标记。使用module.resolvexxx获取methodinfo.Calli的方法在本机方法中不会有methodinfo,我不认为。这里不会看到内联,因为内联是由jit而不是C编译器完成的