stackoverflow中的此问题询问如何实现[ThreadStatic]:
How does the ThreadStatic attribute work?

有人建议应将其视为Thread对象的扩展。
我不确定这是否意味着它基于Win32 TLS。

我的问题是,我可以以某种方式从.NET探查器代码中的当前线程访问[ThreadStatic]的值吗?也就是说,使用 native 代码。

例如,如果我可以使用win32线程ID找到内存中所有线程静态字段所在的区域,并找到我需要检索的特定字段。

谢谢

最佳答案

如您所引用的答案中所述,[ThreadStatic]功能由.NET运行时而不是C#编译器实现。

这意味着,您需要对运行时的数据结构进行反向工程,以访问所需的数据。

或者,您可以使用 ICorProfilerInfo 接口(interface)。根据需要,这是一个非托管接口(interface)。

特别是,您需要 ICorProfilerInfo2::GetThreadStaticAddress 方法。它接受类ID,字段ID和线程ID作为输入参数,并提供具有指定ID的线程本地的字段值的地址。

如果您对它的工作方式感兴趣,可以查看例如Core CLR's implementation(搜索GetThreadStaticAddress2方法,也可以在threads.cpp中查找GetStaticFieldAddrNoCreate)。核心CLR不使用OS TLS;相反,它维护自己的表ThreadLocalBlockThreadLocalModule,用于存储数据。

还有一个托管的 Microsoft.Diagnostics.Runtime (CLR MD)实现。它还应该提供对线程局部值的访问。但是,它现在像a comment says一样被打破了:

// TODO:  Renable when thread statics are fixed.

关于c# - 从.NET探查器访问ThreadStatic字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53977983/

10-11 10:41