如何获取C#对象上的非托管指针?
问题描述:
我知道如何在结构体上创建非托管指针。
但我想有一个非托管的指针,将指向一个对象。如何获取C#对象上的非托管指针?
我已经知道我需要使用
GCHandle.Alloc(...);
,以保护从GC的对象,但我不能找到一种方法来定义一个指针......
答
你可以将这样一个实例:
GCHandle handle = GCHandle.Alloc(oldList, GCHandleType.Pinned);
假设它的工作原理,你就可以拿固定对象的地址作为类型不可知的指针,如t他:
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
可能会有所帮助。
尝试这两个环节: