Как объяснено в ответах, на которые вы ссылались, функциональность [ThreadStatic]
реализуется средой выполнения .NET, а не компилятором C #.
Это означает, что вам придется перепроектировать данные среды выполнения.структуры для получения доступа к нужным данным.
В качестве альтернативы, вы можете использовать интерфейс ICorProfilerInfo
.Это неуправляемый интерфейс, как вам требуется.
В частности, вам потребуется метод ICorProfilerInfo2::GetThreadStaticAddress
.Он принимает идентификатор класса, идентификатор поля и идентификатор потока в качестве входных аргументов и предоставляет адрес значения поля, локальный для потока с указанным идентификатором.
Если вас интересует, как этоработает, вы можете проверить, например, реализацию Core CLR (найдите метод GetThreadStaticAddress2
, также посмотрите threads.cpp для GetStaticFieldAddrNoCreate
).Core CLR не использует ОС TLS;вместо этого он поддерживает свою собственную таблицу так называемых ThreadLocalBlock
s и ThreadLocalModule
s, в которой хранятся данные.
Также существует управляемая Microsoft.Diagnostics.Runtime (CLR MD ) реализация.Он также должен обеспечивать доступ к локальным значениям потока.Тем не менее, он, кажется, сломан сейчас, как комментарий говорит :
// TODO: Renable when thread statics are fixed.