首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ThreadStatic分析器访问.NET字段

从ThreadStatic分析器访问.NET字段
EN

Stack Overflow用户
提问于 2018-12-30 13:25:30
回答 1查看 153关注 0票数 7

堆栈溢出中的这个问题询问ThreadStatic是如何实现的:ThreadStatic属性是如何工作的?

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

我的问题是,我能以某种方式从当前线程访问ThreadStatic的值吗?也就是说,在本机代码中。

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

Thx

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-07 16:06:44

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

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

或者,您可以使用ICorProfilerInfo接口。这是一个非托管接口,如您所需。

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

如果您对它的工作方式感兴趣,可以检查例如核心CLR的实现 (搜索GetThreadStaticAddress2方法,也可以查找threads.cpp for GetStaticFieldAddrNoCreate)。Core不使用OS;相反,它维护自己的表,即存储数据的ThreadLocalBlocks和ThreadLocalModules。

还有一个托管Microsoft.Diagnostics.Runtime (CLR MD)实现。它还应该提供对线程本地值的访问。然而,现在它似乎被打破了,就像一条评论说一样

代码语言:javascript
复制
// TODO:  Renable when thread statics are fixed.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53977983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档