Как получить неуправляемый указатель на объект C#?


Я знаю, как создать неуправляемый указатель на struct.
Но я хочу иметь неуправляемый указатель, который будет указывать на объект.

Я уже знаю, что мне нужно защитить объект от GC с помощью

GCHandle.Alloc(...);
Но я не могу найти способ определить указатель ...
3 2

3 ответа:

Вы можете закрепить экземпляр следующим образом:

GCHandle handle = GCHandle.Alloc(oldList, GCHandleType.Pinned);

Предполагая, что это работает, вы можете взять адрес закрепленного объекта в качестве указателя типа-агностика, например:

IntPtr ptr = handle.AddrOfPinnedObject();

Не забудьте явно отпустить ручку, прежде чем вы потеряете ее след (в противном случае объект будет постоянно закреплен):

handle.Free();

Обратите внимание, что я сказал "предполагая, что это работает" - не все объекты могут быть закреплены, а те, которые не могут, выдадут исключение при попытке закрепить их.

Если вы хотите рискнуть, взяв адрес не закрепленного объекта, вы можете использовать System.Runtime.CompilerServices.Unsafe, чтобы попытаться сделать что-то вроде этого:

static unsafe void* VeryUnsafeGetAddress(this object obj)
{
    return *(void**)Unsafe.AsPointer(ref obj);
}

Попробуйте использовать GCHandle.Alloc со вторым параметром GCHandleType.Pinned. Также может быть полезен метод GCHandle.AddrOfPinnedObject.

Попробуйте эти две ссылки:

Я думаю, что вы заинтересованы в Marshal.StructureToPtr. Я также предлагаю прочитать этот постблога .