2011-12-19 29 views

回答

7

這兩個結構的意義在於防止垃圾收集器釋放資源並在P/Invoke調用完成之前使句柄無效。您鏈接的文檔表明這些是互操作編組人員認可的特殊類型。

我從文檔中收集到的信息是HandleRef本質上是更一般的GCHandle結構的特例。

HandleRef結構專門用於將句柄包裝到與P/Invoke代碼一起使用的非託管資源中。例如,窗口句柄(HWND)或設備上下文(HDC)。它有一個Handle屬性,該屬性返回IntPtr類型的值,該值是底層系統體系結構上指針大小的整數值。你可以用它來快速地獲得它包裝的句柄。

鑑於GCHandle結構允許指定它包裝使用GCHandleType枚舉的構件中的一個手柄的類型,HandleRef結構是專門設計來包裝句柄非託管資源。當您直接處理非託管內存時,可能會使用GCHandle結構,而不是Win32 API將其視爲黑盒子的特殊句柄。

也沒有必要使用。可以簡單地調用GC.KeepAlive來防止垃圾收集器過早地釋放資源。

即使這可能沒有必要。我多年來一直在寫P/Invoke代碼,而且我發現當它被正確編寫時,不需要這些結構。如果一個類對象在API調用正在執行的過程中被垃圾收集,那麼這是應用程序中的一個錯誤。我其實想要通過例外通知失敗,不隱藏它。

+0

感謝您的回答 – 2011-12-19 15:17:44

+1

「我發現,當它被正確書寫時,不需要這些結構。「 如果您不擔心保持對象不被收集,因爲您知道託管代碼將繼續引用它,但您只是希望非託管代碼由於某種原因接受/保留/返回受管引用。示例用例: stackoverflow .COM /問題/5089 – 2015-08-24 15:57:42

0

一個不同之處是給出的link你所提到的:

的HandleRef值類型,像的GCHandle,是一種特殊類型的認可 interop marshaler。一個普通的,非固定的GCHandle也可以防止不合時宜的垃圾收集,但HandleRef提供了更好的性能 。雖然使用HandleRef保持對象在平臺調用期間的活動時間爲首選,但您也可以使用 GC.KeepAlive方法來達到同樣的目的。

+0

是的,我明白了,但我需要詳細信息 – 2011-12-19 14:57:27

+1

@user:你想要更詳細的信息嗎? – 2011-12-19 15:12:30