Есть ли способ хранить MemoryHandle исключительно в неуправляемой памяти? ⇐ C#
-
Anonymous
Есть ли способ хранить MemoryHandle исключительно в неуправляемой памяти?
У меня есть метод, который принимает объект Memory. Я хочу закрепить его и сохранить указатель на него исключительно в неуправляемой памяти. Я знаю, что могу получить этот закрепленный указатель, используя memory.Pin() для создания MemoryHandle, а затем захватив memoryHandle.Pointer. Однако, поскольку я хочу сохранить это только в неуправляемой памяти, мне нужно убедиться, что управляемый объект, на который указывает дескриптор памяти, не будет собран, пока я не закончу с ним. Есть ли способ сохранить MemoryHandle в неуправляемой памяти без сбора базового объекта, а затем освободить его позже?
Я знаю, что теоретически это можно сделать, сохранив GCHandle рядом с моим указателем, а не удаляя его, когда я закончу. Проблема в том, что я не вижу способа получить GCHandle из объектов Memory или MemoryHandle, хотя я почти уверен в этом. по крайней мере, дескриптор памяти содержит внутренний дескриптор GC. Итак, если есть способ получить GCHandle из MemoryHandle, это будет хорошим решением этой проблемы.
У меня есть метод, который принимает объект Memory. Я хочу закрепить его и сохранить указатель на него исключительно в неуправляемой памяти. Я знаю, что могу получить этот закрепленный указатель, используя memory.Pin() для создания MemoryHandle, а затем захватив memoryHandle.Pointer. Однако, поскольку я хочу сохранить это только в неуправляемой памяти, мне нужно убедиться, что управляемый объект, на который указывает дескриптор памяти, не будет собран, пока я не закончу с ним. Есть ли способ сохранить MemoryHandle в неуправляемой памяти без сбора базового объекта, а затем освободить его позже?
Я знаю, что теоретически это можно сделать, сохранив GCHandle рядом с моим указателем, а не удаляя его, когда я закончу. Проблема в том, что я не вижу способа получить GCHandle из объектов Memory или MemoryHandle, хотя я почти уверен в этом. по крайней мере, дескриптор памяти содержит внутренний дескриптор GC. Итак, если есть способ получить GCHandle из MemoryHandle, это будет хорошим решением этой проблемы.
Мобильная версия