System.Runtime.InteropServices。保管庫 Handle 類別
本文提供此 API 參考文件的補充備註。
類別 SafeHandle 提供處理資源的重要最終處理、防止垃圾收集過早回收句柄,以及由操作系統回收以參考非受控物件。
為什麼 保管庫 Handle?
雖然覆寫至 Object.Finalize 方法允許在垃圾收集物件時清除 Unmanaged 資源,但在某些情況下,垃圾收集可以回收可完成的物件,同時在平台調用呼叫內執行方法。 如果完成項釋放傳遞至該平台調用呼叫的句柄,可能會導致處理損毀。 當您的方法在平台調用呼叫期間遭到封鎖時,也可以回收句柄,例如讀取檔案時。
更重要的是,因為 Windows 積極回收句柄,所以可以回收句柄,並指向另一個可能包含敏感數據的資源。 這稱為回收攻擊,而且可能會損毀數據並成為安全性威脅。
保管庫 Handle 的功能
類別 SafeHandle 可簡化其中數個物件存留期問題,並與平台調用整合,因此不會外泄操作系統資源。 類別 SafeHandle 會藉由指派和釋放句柄來解決物件存留期問題,而不會中斷。 它包含重要的完成項,可確保句柄已關閉,而且保證會在非預期的 AppDomain 卸除期間執行,即使在假設平台調用呼叫處於損毀狀態的情況下也是如此。
因為 SafeHandle 繼承自 CriticalFinalizerObject,因此所有非關鍵完成項都會在任何關鍵完成項之前呼叫。 完成項會在相同垃圾收集階段不再存留的物件上呼叫。 例如, FileStream 物件可以執行一般完成項,以清除現有的緩衝數據,而不會有洩漏或回收句柄的風險。 關鍵和非關鍵完成項之間的這種非常弱的順序不適合用於一般用途。 它主要是為了協助移轉現有的連結庫,方法是允許這些連結庫使用 SafeHandle 而不改變其語意。 此外,重要完成項及其所呼叫的任何專案,例如 SafeHandle.ReleaseHandle() 方法,都必須位於限制的執行區域中。 這會對完成項呼叫圖形內可撰寫的程式代碼施加條件約束。
平台調用作業會自動遞增 所 SafeHandle 封裝之句柄的參考計數,並在完成時遞減它們。 這可確保句柄不會意外回收或關閉。
您可以在建構 SafeHandle 物件時指定基礎句柄的擁有權,方法是將值 ownsHandle
提供給類別建構函式中的 SafeHandle 自變數。 這會控制物件是否會 SafeHandle 在處置對象之後釋放句柄。 這適用於具有特殊存留期需求的句柄,或取用由其他人控制其存留期的句柄。
衍生自 保管庫 Handle 的類別
SafeHandle 是操作系統句柄的抽象包裝函式類別。 從這個類別衍生並不容易。 請改用 Microsoft.Win32.SafeHandles 命名空間中的衍生類別,這些類別可為下列各項提供安全的控制代碼:
- 檔案 (類別 SafeFileHandle )。
- 記憶體對應檔案 (類別 SafeMemoryMappedFileHandle )。
- 管道(類別 SafePipeHandle )。
- 記憶體檢視 (類別 SafeMemoryMappedViewHandle )。
- 密碼編譯建構 (SafeNCryptHandle、 SafeNCryptKeyHandleSafeNCryptProviderHandle、 和 SafeNCryptSecretHandle 類別)。
- 進程 (類別 SafeProcessHandle )。
- 登錄機碼 (類別 SafeRegistryHandle )。
- 等候句柄 (類別 SafeWaitHandle )。