c# - 从 .NET 探查器访问 ThreadStatic 字段

标签 c# .net profile threadstatic

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;相反,它维护自己的表,其中包含存储数据的所谓 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/

相关文章:

c# - 为什么在 C# 中更改滚动条的 LargeChange 值会破坏它?

c# - 使用 Excel Interop 删除空行

c# - 何时使用 Observable.FromEventPattern 而不是 Observable.FromEvent?

c# - XML 命名空间 'Employee' 中不存在标记 'clr-namespace:XYZ;assembly=XYZ'

c# - 在 .Net 解决方案中将委托(delegate)放在哪里

c# - 是否有必要将 usings 与 IDisposable 对象嵌套在一起?

javascript - 正则表达式允许无限精度

docker - Visual Studio 配置文件更改导致无效的 ssl 证书?

maven-2 - 根据当前模块激活不同的 Maven 配置文件?

c++ - clang 是否支持 "-fprofile-generate"和 "-fprofile-use"?