2017-07-29 76 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的帖子。