回答
這兩個結構的意義在於防止垃圾收集器釋放資源並在P/Invoke調用完成之前使句柄無效。您鏈接的文檔表明這些是互操作編組人員認可的特殊類型。
我從文檔中收集到的信息是HandleRef
本質上是更一般的GCHandle
結構的特例。
HandleRef
結構專門用於將句柄包裝到與P/Invoke代碼一起使用的非託管資源中。例如,窗口句柄(HWND
)或設備上下文(HDC
)。它有一個Handle
屬性,該屬性返回IntPtr
類型的值,該值是底層系統體系結構上指針大小的整數值。你可以用它來快速地獲得它包裝的句柄。
鑑於GCHandle
結構允許指定它包裝使用GCHandleType
枚舉的構件中的一個手柄的類型,HandleRef
結構是專門設計來包裝句柄非託管資源。當您直接處理非託管內存時,可能會使用GCHandle
結構,而不是Win32 API將其視爲黑盒子的特殊句柄。
也沒有必要使用。可以簡單地調用GC.KeepAlive
來防止垃圾收集器過早地釋放資源。
即使這可能沒有必要。我多年來一直在寫P/Invoke代碼,而且我發現當它被正確編寫時,不需要這些結構。如果一個類對象在API調用正在執行的過程中被垃圾收集,那麼這是應用程序中的一個錯誤。我其實想要通過例外通知失敗,不隱藏它。
一個不同之處是給出的link你所提到的:
的HandleRef值類型,像的GCHandle,是一種特殊類型的認可 interop marshaler。一個普通的,非固定的GCHandle也可以防止不合時宜的垃圾收集,但HandleRef提供了更好的性能 。雖然使用HandleRef保持對象在平臺調用期間的活動時間爲首選,但您也可以使用 GC.KeepAlive方法來達到同樣的目的。
是的,我明白了,但我需要詳細信息 – 2011-12-19 14:57:27
@user:你想要更詳細的信息嗎? – 2011-12-19 15:12:30
- 1. 有什麼區別`和$(Bash中有什麼區別?
- 2. 有什麼區別? :和||
- 3. &&和||有什麼區別?
- 4. 「/」和「/ *」有什麼區別?
- 5. 有什麼區別:。!和:r!?
- 6. ==和===有什麼區別?
- 7. Appender和〜有什麼區別?
- 8. $ @和$ *有什麼區別?
- 9. is和=有什麼區別?
- 10. #.00和#。##有什麼區別?
- 11. `==`和`is`有什麼區別?
- 12. '=='和'==='有什麼區別?
- 13. /和/#/有什麼區別?
- 14. | 0和~~有什麼區別?
- 15. `&`和`ref`有什麼區別?
- 16. ==和===有什麼區別?
- 17. ==和===有什麼區別?
- 18. `{}`和`[]`有什麼區別?
- 19. JavaScript和=== ===有什麼區別?
- 20. difftime和' - '有什麼區別?
- 21. =和==有什麼區別?
- 22. xtype和別名有什麼區別?
- 23. Mixpanel:識別()和people.identify()有什麼區別?
- 24. 有什麼區別
- 25. 有什麼區別
- 26. 有什麼區別?
- 27. 有什麼區別?
- 28. 有什麼區別?
- 29. 有什麼區別
- 30. ....有什麼區別?
感謝您的回答 – 2011-12-19 15:17:44
「我發現,當它被正確書寫時,不需要這些結構。「 如果您不擔心保持對象不被收集,因爲您知道託管代碼將繼續引用它,但您只是希望非託管代碼由於某種原因接受/保留/返回受管引用。示例用例: stackoverflow .COM /問題/5089 – 2015-08-24 15:57:42