stackoverflow中的这个问题问的是[ThreadStatic]是如何实现的: How does the ThreadStatic attribute work?
有人建议将其视为 Thread 对象的扩展。 我不确定这是否意味着它基于 win32 TLS。
我的问题是,我能否以某种方式从 .NET 探查器代码中的当前线程访问 [ThreadStatic] 的值?也就是说,在 native 代码中。
例如,如果我可以使用 win32 线程 ID 找到内存中所有线程静态字段所在的区域,并找到我需要检索的特定字段。
谢谢
最佳答案
如您引用的答案中所述,[ThreadStatic]
功能由 .NET 运行时实现,而不是由 C# 编译器实现。
这意味着,您需要对运行时的数据结构进行逆向工程才能访问您想要的数据。
或者,您可以使用 ICorProfilerInfo
界面。根据您的需要,这是一个非托管接口(interface)。
特别是,您需要 ICorProfilerInfo2::GetThreadStaticAddress
方法。它接受类 ID、字段 ID 和线程 ID 作为输入参数,并提供字段值的地址,该地址对于具有指定 ID 的线程来说是本地的。
如果您对它的工作原理感兴趣,可以查看例如Core CLR's implementation (搜索 GetThreadStaticAddress2
方法,也可以在 threads.cpp 中查找 GetStaticFieldAddrNoCreate
)。 Core CLR 不使用 OS TLS;相反,它维护自己的表,其中包含存储数据的所谓 ThreadLocalBlock
和 ThreadLocalModule
。
还有一个托管的 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/