为什么RuntimeMethodInfo.Invoke不显示在我的Visual Studio调试器调用栈上?

时间:2011-07-10 21:02:16

标签: c# visual-studio debugging visual-studio-debugging

考虑以下C#代码:

class Program
{
    static public void Print(string toPrint)
    {
        Console.WriteLine(toPrint);
    }

    static void Main(string[] args)
    {
        Type program = typeof(Program);            
        MethodInfo methodInfo = program.GetMethod("Print", BindingFlags.Static | BindingFlags.Public);
        methodInfo.Invoke(null, new object[] { "a" });
    }
}

当我在Visual Studio 2008或Visual Studio 2008中运行它并点击断点时,我放入“Print”方法,我在callstack窗口中得到以下内容:

  

ConsoleApplication4.exe!ConsoleApplication4.Program.Print(串   toPrint)

     

[原生于管理过渡]

     

[管理到原生过渡]

     

ConsoleApplication4.exe!ConsoleApplication4.Program.Main(串[]   参数)

为什么RuntimeMethodInfo.Invoke出现在我的callstack中?毕竟,这是一种托管方法,为什么我不能像我期望的那样看到它呢?

另外,一般来说,这里的规则是什么?我可以在callstack中找到哪些托管方法?

1 个答案:

答案 0 :(得分:1)

原因是该方法实际上不是托管方法。 RunTimeMethodInfo.Invoke最终将解析为RuntimeMethodHandle._InvokeMethodFast,标记为MethodImplOptions.InternalCall。这意味着调用实际上是直接在CLR中实现的帮助。

根据您的调用堆栈中不会显示的内容的一般规则:

  • 如果您启用了Just My Code(这是默认设置),那么您编写的任何内容都会在调用堆栈中显示为[External Code]
  • 如果您只是调试托管,那么您可能最终会在调用堆栈上看到很多Native to ManagedManaged to Native转换。
  • 在处理内部实现的方法时,您还会在调用堆栈上看到一些模糊性。
  • 我不确定DebuggerHidden的确切规则,特别是与'just my code'方法结合使用时,但我不希望它们显示在调用堆栈上。

如果您希望看到原始调用堆栈的所有荣耀,那么您将需要执行以下操作。

  • 启用托管和本机调试的调试
  • 禁用Just My Code