2008-11-17 114 views
1

當窗口句柄的工作,是足夠使用純IntPtr的或者我應該繼承的SafeHandle窗口句柄C#/。NET

有沒有什麼重要的優點/缺點?

謝謝。

+0

定義「夠好」。對於一個小測試應用程序?對於商業應用?對於服務器應用程序? – 2008-11-17 03:08:48

回答

1

我不認爲SafeHandle會增加任何價值。 MSDN對使用SafeHandle(重點介紹)提供以下注意事項:

SafeHandle類爲句柄回收安全性攻擊提供保護;它還提供了處理資源的關鍵定稿。這個類允許你向非託管代碼傳遞一個包含在派生類實例中的非託管資源(例如操​​作系統句柄)的句柄。 它通過回收手柄來防止安全攻擊。處理回收的一個例子是你的句柄的不可信用戶試圖在一個線程上對資源進行排隊操作,同時關閉另一個線程上的句柄。不受信任的用戶會這樣做,希望句柄能夠被進程中的某個不相關的線程立即重用,並且進程內操作返回或修改調用者通常無法訪問的數據。 SafeHandle還提供了關鍵的最終確認:即使AppDomain被主機卸載,或者正常的終結器阻塞或需要太長的時間來清理,也會運行ReleaseHandle方法。

這些都不兩個目標似乎適用於窗口句柄從Windows窗體返回對象Control。對於ControlHandle屬性的典型用法,處理回收似乎沒有意義,並且框架和操作系統使用窗口句柄將任何最終化問題都拿出來。

另一種想法是這樣的:要使用SafeHandle,您必須提供IsInvalid屬性和ReleaseHandle方法的實現。據我所知,Control.Handle屬性將永遠不會返回無效值,並且窗口句柄將會並且應該僅在控件處置時「釋放」。

也就是說,框架本身在使用它們時在HandleRef對象中包裝了窗口句柄,它只是在非託管代碼使用句柄時保護垃圾回收器的控制權。在典型的場景中,這是你不太需要的東西,你需要一個窗口句柄,但是如果有可能需要它,幾乎沒有工作可以使用它。

2

這取決於:)

如果手柄以這樣的方式,你必須最終調用一個版本的:: CloseHandle的他們,那麼你應該永遠繼承的SafeHandle返回。 SafeHandle在.Net Framework中提供了一個可以釋放句柄的最有力的保證。不釋放IntPtr會導致資源泄漏。足夠的資源泄漏最終會導致程序崩潰。

如果不需要釋放句柄,那麼傳遞IntPtr就足夠了。