2017-07-29 75 views
2

我知道如何在结构体上创建非托管指针。
但我想有一个非托管的指针,将指向一个对象。如何获取C#对象上的非托管指针?

我已经知道我需要使用

GCHandle.Alloc(...); 

,以保护从GC的对象,但我不能找到一种方法来定义一个指针......

回答

4

你可以将这样一个实例:

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); 
} 
1

我觉得你有兴趣Marshal.StructureToPtr。我也建议阅读这个blog的帖子。