System.Runtime.InteropServices. kelas Brankas Handle
Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.
Kelas ini SafeHandle menyediakan finalisasi penting untuk menangani sumber daya, mencegah handel direklamasi sebelum waktunya oleh pengumpulan sampah dan agar tidak didaur ulang oleh sistem operasi untuk mereferensikan objek yang tidak dikelola yang tidak diinginkan.
Mengapa Brankas Handle?
Meskipun mengambil alih Object.Finalize metode ini memungkinkan pembersihan sumber daya yang tidak dikelola ketika objek sedang dikumpulkan, dalam beberapa keadaan, objek yang dapat diselesaikan dapat direklamasi kembali dengan pengumpulan sampah saat menjalankan metode dalam panggilan pemanggilan platform. Jika finalizer membebaskan handel yang diteruskan ke panggilan pemanggilan platform tersebut, itu dapat menyebabkan kerusakan. Handel juga dapat diklaim kembali saat metode Anda diblokir selama panggilan platform memanggil, seperti saat membaca file.
Lebih kritis, karena Windows secara agresif mendaur ulang handel, handel dapat didaur ulang dan menunjuk ke sumber daya lain yang mungkin berisi data sensitif. Ini dikenal sebagai serangan daur ulang dan dapat berpotensi merusak data dan menjadi ancaman keamanan.
Apa yang Brankas Handle lakukan
Kelas SafeHandle menyederhanakan beberapa masalah masa pakai objek ini, dan terintegrasi dengan pemanggilan platform sehingga sumber daya sistem operasi tidak bocor. Kelas SafeHandle menyelesaikan masalah seumur hidup objek dengan menetapkan dan melepaskan handel tanpa gangguan. Ini berisi finalizer penting yang memastikan bahwa handel ditutup dan dijamin berjalan selama bongkar tak terduga AppDomain , bahkan dalam kasus ketika panggilan pemanggilan platform diasumsikan dalam keadaan rusak.
Karena SafeHandle mewarisi dari CriticalFinalizerObject, semua finalizer noncritical dipanggil sebelum salah satu finalizer kritis. Finalizer dipanggil pada objek yang tidak lagi hidup selama lulus pengumpulan sampah yang sama. Misalnya, FileStream objek dapat menjalankan finalizer normal untuk menghapus data buffer yang ada tanpa risiko handel bocor atau didaur ulang. Urutan yang sangat lemah antara finalizer kritis dan noncritical ini tidak ditujukan untuk penggunaan umum. Ada terutama untuk membantu dalam migrasi pustaka yang ada dengan memungkinkan pustaka tersebut untuk digunakan SafeHandle tanpa mengubah semantiknya. Selain itu, finalizer penting dan apa pun yang dipanggilnya, seperti SafeHandle.ReleaseHandle() metode , harus berada di wilayah eksekusi yang dibatasi. Ini memberlakukan batasan pada kode apa yang dapat ditulis dalam grafik panggilan finalizer.
Operasi pemanggilan platform secara otomatis meningkatkan jumlah referensi handel yang SafeHandle dienkapsulasi oleh dan menurunkannya setelah selesai. Ini memastikan bahwa handel tidak akan didaur ulang atau ditutup secara tak terduga.
Anda dapat menentukan kepemilikan handel yang mendasar saat membuat SafeHandle objek dengan memberikan nilai ke ownsHandle
argumen di SafeHandle konstruktor kelas. Ini mengontrol apakah SafeHandle objek akan melepaskan handel setelah objek dibuang. Ini berguna untuk menangani dengan persyaratan seumur hidup yang aneh atau untuk mengonsumsi handel yang masa pakainya dikendalikan oleh orang lain.
Kelas yang berasal dari Brankas Handle
SafeHandle adalah kelas pembungkus abstrak untuk handel sistem operasi. Turun dari kelas ini sulit. Sebagai gantinya, gunakan kelas turunan di Microsoft.Win32.SafeHandles namespace layanan yang menyediakan handel aman untuk yang berikut ini:
- File ( SafeFileHandle kelas ).
- File yang dipetakan SafeMemoryMappedFileHandle memori (kelas ).
- Pipa ( SafePipeHandle kelas).
- Tampilan memori ( SafeMemoryMappedViewHandle kelas).
- Konstruksi kriptografi (SafeNCryptHandlekelas , , SafeNCryptKeyHandleSafeNCryptProviderHandle, dan SafeNCryptSecretHandle ).
- Proses ( SafeProcessHandle kelas).
- Kunci registri ( SafeRegistryHandle kelas).
- Handel tunggu ( SafeWaitHandle kelas).