我知道如何在結構體上創建非託管指針。
但我想有一個非託管的指針,將指向一個對象。如何獲取C#對象上的非託管指針?
我已經知道我需要使用
GCHandle.Alloc(...);
,以保護從GC的對象,但我不能找到一種方法來定義一個指針......
我知道如何在結構體上創建非託管指針。
但我想有一個非託管的指針,將指向一個對象。如何獲取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);
}
我覺得你有興趣Marshal.StructureToPtr
。我也建議閱讀這個blog的帖子。
嘗試使用GCHandle.Alloc
與第二個參數GCHandleType.Pinned
。另外方法GCHandle.AddrOfPinnedObject
可能會有所幫助。
嘗試這兩個環節: