stackoverflow中的这个问题询问[ThreadStatic]是 如何实现的:ThreadStatic属性是如何工作的?
有人建议将其视为 Thread 对象的扩展。我不确定这是否意味着它基于 win32 TLS。
我的问题是我能否以某种方式从 .NET 探查器代码中的当前线程访问 [ThreadStatic] 的值?也就是说,在本机代码中。
例如,如果我可以使用 win32 线程 id 找到内存中所有线程静态字段所在的区域,并找到我需要检索的特定字段。
谢谢
stackoverflow中的这个问题询问[ThreadStatic]是 如何实现的:ThreadStatic属性是如何工作的?
有人建议将其视为 Thread 对象的扩展。我不确定这是否意味着它基于 win32 TLS。
我的问题是我能否以某种方式从 .NET 探查器代码中的当前线程访问 [ThreadStatic] 的值?也就是说,在本机代码中。
例如,如果我可以使用 win32 线程 id 找到内存中所有线程静态字段所在的区域,并找到我需要检索的特定字段。
谢谢
正如您引用的答案中所解释的,该[ThreadStatic]
功能是由 .NET 运行时实现的,而不是由 C# 编译器实现的。
这意味着,您需要对运行时的数据结构进行逆向工程才能访问所需的数据。
或者,您可以使用该ICorProfilerInfo
界面。根据您的需要,这是一个非托管接口。
特别是,您需要该ICorProfilerInfo2::GetThreadStaticAddress
方法。它接受类 ID、字段 ID 和线程 ID 作为输入参数,并提供字段值的地址,该地址对于具有指定 ID 的线程来说是本地的。
如果您对它的工作原理感兴趣,您可以检查例如Core CLR 的实现(搜索该GetThreadStaticAddress2
方法,也可以查看threads.cpp )GetStaticFieldAddrNoCreate
。Core CLR 不使用 OS TLS;相反,它维护自己的所谓ThreadLocalBlock
s 和ThreadLocalModule
s 表,其中存储数据。
还有一个托管的Microsoft.Diagnostics.Runtime ( CLR MD ) 实现。它还应该提供对线程局部值的访问。然而,它现在似乎被打破了,正如评论所说:
// TODO: Renable when thread statics are fixed.