Как получить неуправляемый указатель на объект C#?
Я знаю, как создать неуправляемый указатель на struct.
Но я хочу иметь неуправляемый указатель, который будет указывать на объект.
Я уже знаю, что мне нужно защитить объект от GC с помощью
GCHandle.Alloc(...);
Но я не могу найти способ определить указатель ...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
. Я также предлагаю прочитать этот постблога .