gpt4 book ai didi

c# - 如何获取堆栈框架的执行对象?

转载 作者:可可西里 更新时间:2023-11-01 08:46:35 25 4
gpt4 key购买 nike

使用反射时,可以使用 System.Diagnostics.StackTrace 获取调用堆栈(除此之外,由于 JIT 优化,它可能是粗略的近似值)并检查包含的 StackFrame 对象。

我如何获取对堆栈帧中方法正在其上执行的对象(this 指针)的引用?

我知道我可以通过在堆栈框架对象上调用 GetMethod() 来获取 MethodBase,但我正在寻找的是与 GetObject() 类似的东西(如果该方法是静态的,它自然会返回 null) .似乎只能查询堆栈帧对象以获取静态确定的信息,例如方法信息、原始文件等。

VS 调试器知道(尽管它可能使用另一种获取调用堆栈跟踪的方法),因为可以双击调用堆栈窗口中的任何堆栈帧并查看局部变量和类字段的值。

编辑:澄清一下:我想要在其上调用该方法的对象实例。即:如果方法 Foo() 在调用堆栈上某处的对象实例 A 上被调用,并且它级联到我执行堆栈跟踪的方法,我想从我执行堆栈跟踪的地方获取对 A 的引用。 (不是方法基的声明类型)

最佳答案

我很确定这是不可能的。原因如下:

  1. 这可能会破坏类型安全,因为任何人都可以查找框架、获取对象,而不管他们在哪个 AppDomain\Thread 上执行或拥有权限。

  2. 'this' (C#) 标识符实际上只是实例方法(第一个)的参数,所以实际上静态方法和实例方法之间没有区别,编译器施展魔法将正确的 this 传递给实例方法,这当然意味着您需要访问所有方法参数才能获得 this 对象。 (StackFrame 不支持)

使用 unsafe 代码获取实例方法的第一个参数的指针,然后将其转换为正确的类型可能是可能的,但我不知道该怎么做,只是一个想法。

顺便说一句,您可以想象编译后的实例方法类似于 C# 3.0 扩展方法,它们将 this 指针作为它们的第一个参数。

关于c# - 如何获取堆栈框架的执行对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/889310/

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