Могу ли я закрепить поле типа статического значения в долгосрочной перспективе? - PullRequest
0 голосов
/ 20 октября 2019

Мне нужно закрепить поле типа статического значения в памяти, и мне нужно, чтобы этот вывод был долгосрочным, то есть с использованием закрепленного GCHandle (или эквивалентного), не закрепленной локальной переменной(например, fixed блоки в C # или pin_ptr в C ++ / CLI)

Я схожу с ума, выясняя это, и не могу принять это невозможно

ТакЯ могу прикрепить статическое поле типа значения локально к функции, используя fixed / pin_ptr, но я теряю булавку, когда функция возвращает

с GCHandle типа GCHandleType.Pinned, Iмогу прикреплять объекты сколько угодно, но работает только с объектами ссылочных типов. Я знаю, что статические поля типов значений внутренне хранятся в виде блоков (например, это относится только к не примитивным типам, а я имею дело с примитивами), но я не могу получить ссылку на внутренний объект box: если я передамполе на GCHandle, я создаю новое поле из текущего значения поля

Из чтения внутренних компонентов .NET я знаю, что статические данные хранятся внутри объектов сборки, которые раньше были не-GC игарантированно останется в памяти. Но сборки были сделаны коллекционными в последних версиях Core и Framework, и я не знаю, применимо ли это по-прежнему (вероятно, нет, или нам не понадобится FixedAddressValueTypeAttribute)

Я не могу пометитьполе [FixedAddressValueType], потому что я не могу заменить или изменить его в сторонней сборке

Итак, подведем итог: я могу прикрепить что угодно, если я делаю это локально для функции. Я могу закрепить нелокально, но только если у меня есть ссылка на объект. Статические поля типа значения заключены в объект, но я не могу получить ссылку на него. Есть ли надежда добиться этого, в идеале не полагаясь на внутренние компоненты, специфичные для реализации, или это просто не поддерживается?

(... и, чтобы сделать это еще сложнее, в идеале , мне нужносделать это из неуправляемого кода, используя собственные API-интерфейсы COM. И опять же, в идеале, мне нужно поддерживать как .NET Framework, так и .NET Core)

...