考虑以下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中找到哪些托管方法?
答案 0 :(得分:1)
原因是该方法实际上不是托管方法。 RunTimeMethodInfo.Invoke
最终将解析为RuntimeMethodHandle._InvokeMethodFast
,标记为MethodImplOptions.InternalCall
。这意味着调用实际上是直接在CLR中实现的帮助。
根据您的调用堆栈中不会显示的内容的一般规则:
Just My Code
(这是默认设置),那么您编写的任何内容都会在调用堆栈中显示为[External Code]
。Native to Managed
和Managed to Native
转换。DebuggerHidden
的确切规则,特别是与'just my code'方法结合使用时,但我不希望它们显示在调用堆栈上。如果您希望看到原始调用堆栈的所有荣耀,那么您将需要执行以下操作。
Just My Code