8

我想知道...

当我有这样的代码时:

lock (obj)
{
    MyCode.MyAgent();
}

可以MyAgent包含识别它在lock块下运行的代码吗?

关于什么:

for (int i=0;i<5;i++)
{
   MyCode.MyAgent();
}

可以MyAgent包含识别它在loop块下运行的代码吗?

可以针对using块、unsafe代码等提出相同的问题...-您明白了...

这在 C# 中可能吗?

这只是一个理论问题,我并不想实现任何目标……只是知识。

4

3 回答 3

8

这并非完全不可能,您可以使用 StackTrace 类来获取对调用方方法的引用,并使用 MethodInfo.GetMethodBody() 来获取该方法的 IL。

但是你永远不会得到这个可靠的,即时编译器的优化器会让你很难弄清楚调用的确切位置。方法体内联会使方法完全消失。循环展开将使您无法了解循环索引。优化器使用 cpu 寄存器来存储局部变量和方法参数,从而无法获得可靠的变量值。

更不用说反编译 IL 所涉及的锡箔咀嚼工作了。这些都远不及将参数传递给方法的简单性和速度。

于 2012-07-07T12:40:33.480 回答
3

否(当然,除非代码明确将此信息转发给方法)。

这样做的原因是,诸如此类的概念不会被转换为保存在 IL 或元数据中的结构化信息,然后 CLR 可能会在运行时向您公开这些信息。将此与确实在元数据中编码的类进行对比,从而在运行时启用反射。

尝试保留这些信息会导致复杂性增加,当然还有额外的开销而没有任何好处,因为如果您需要程序保持这种状态,很容易在代码中实现这一点(要求这种状态是否是一个好主意是另一个问题) .

于 2012-07-07T12:38:53.520 回答
0

我不相信 .NET 支持您直接描述的功能,尽管您可以通过使用 StackFrame 获取当前调用堆栈并使用反射分析方法体等来获取该信息,但我不确定你能做到多么精确。

.NET 确实有用于同步的上下文,但不是您所询问的级别。例如,查看System.ContextBoundObject

于 2012-07-07T12:43:26.800 回答