stackoverflow中的此问题询问如何实现[ThreadStatic]: How does the ThreadStatic attribute work?
有人建议应将其视为Thread对象的扩展。 我不确定这是否意味着它基于Win32 TLS。
我的问题是,我可以通过某种方式从.NET探查器代码中的当前线程中访问[ThreadStatic]的值吗?也就是说,使用本地代码。
例如,如果我可以使用win32线程ID在内存中找到所有线程静态字段所在的区域,并找到我需要检索的特定字段。
Thx
答案 0 :(得分:3)
如您所引用的答案中所述,[ThreadStatic]
功能由.NET运行时而不是C#编译器实现。
这意味着,您需要对运行时的数据结构进行逆向工程才能访问所需的数据。
或者,您可以使用ICorProfilerInfo
界面。根据需要,这是一个非托管界面。
尤其是,您需要使用ICorProfilerInfo2::GetThreadStaticAddress
方法。它接受类ID,字段ID和线程ID作为输入参数,并提供具有指定ID的线程本地的字段值的地址。
如果您对它的工作方式感兴趣,可以检查例如Core CLR's implementation(搜索GetThreadStaticAddress2
方法,也为GetStaticFieldAddrNoCreate
寻找threads.cpp)。 Core CLR不使用OS TLS;相反,它维护着自己的表ThreadLocalBlock
和ThreadLocalModule
,这些表用于存储数据。
还有一个托管的 Microsoft.Diagnostics.Runtime (CLR MD)实现。它还应该提供对线程局部值的访问。但是,它现在似乎已被破坏,如a comment says:
// TODO: Renable when thread statics are fixed.