gpt4 book ai didi

c# - 为什么 RuntimeMethodInfo.Invoke 没有出现在我的 Visual Studio 调试器调用堆栈中?

转载 作者:太空宇宙 更新时间:2023-11-03 14:15:40 26 4
gpt4 key购买 nike

考虑以下 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”方法中放置的断点时,我在调用堆栈窗口中得到以下信息:

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

[Native to Managed Transition]

[Managed to Native Transition]

ConsoleApplication4.exe!ConsoleApplication4.Program.Main(string[] args)

为什么 RuntimeMethodInfo.Invoke 没有出现在我的调用堆栈中?毕竟,它是一种托管方法,那么为什么我看不到它所期望的那样呢?

另外,一般来说,这里的规则是什么?我的调用堆栈中可能缺少哪些托管方法?

最佳答案

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

就不会出现在您的调用堆栈中的一般规则而言:

  • 如果您启用了Just My Code(这是默认设置),几乎所有您没有编写的内容都会在调用堆栈中显示为[External Code] .
  • 如果您只调试托管,那么您最终可能会在调用堆栈上看到很多Native to ManagedManaged to Native 转换。
  • 在处理内部实现的方法时,您还会发现调用堆栈有些模糊。
  • 我不确定 DebuggerHidden 的确切规则,尤其是与“仅我的代码”方法结合使用时,但我没有必要期望它们出现在调用堆栈中。

如果您想要完整地查看原始调用堆栈,那么您需要执行以下操作。

  • 启用托管和 native 调试进行调试
  • 禁用仅我的代码

关于c# - 为什么 RuntimeMethodInfo.Invoke 没有出现在我的 Visual Studio 调试器调用堆栈中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6643647/

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