2011-07-31 30 views
11

非託管代碼調用我的函數。在第一個函數中,我應該傳回指向我的託管對象的指針。有時後來我的其他一些函數會被同一個指針調用爲其中一個參數。我應該解引用它並使用它來執行一些計算,然後如果不需要處理它。 爲了簡化故事,我需要固定這個對象,以便GC不會移動它,直到我處理它。如何在C#中做到這一點? 在此先感謝。如何將指針固定到C#中的託管對象?

+2

郵一些代碼,優選*最小的,完整*例子。 –

+1

不要釘住。非託管代碼對指針沒有用處。所以不要傳遞一個指針,傳遞一個'句柄'。說一個靜態'List <>'中的索引。現在,您可以簡單地從句柄值中檢索回調中的託管參考。 –

回答

10

要固定在C#的對象,則可以使用GCHandle.Alloc方法與第二個參數GCHandleType.Pinned。對象保持固定狀態,直到使用GCHandle.Free方法釋放實例GCHandle

+0

的GCHandle將無法正常工作becuse我的對象不blittable – apaka

+0

它的工作原理就像一個魅力,當你使用GCHandle.Aloc(對象的值),並將其轉換爲IntPtr的。 – apaka

+1

@apaka:GCHandle.Alloc(object_value,GCHandleType.Pinned)+ GCHandle.AddrOfPinnedObject。 –

相關問題