Мне нужно закрепить поле типа статического значения в памяти, и мне нужно, чтобы этот вывод был долгосрочным, то есть с использованием закрепленного 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)