Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Nota
Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.
Kelas SafeHandle ini menyediakan finalisasi krusial untuk sumber daya handle, mencegah agar handel tidak direklamasi sebelum waktunya oleh pengumpulan sampah dan tidak didaur ulang oleh sistem operasi menjadi referensi ke objek tidak dikelola yang tidak diinginkan.
Mengapa SafeHandle?
Meskipun penggantian metode Object.Finalize memungkinkan pembersihan sumber daya yang tidak dikelola ketika suatu objek sedang dikumpulkan, dalam beberapa keadaan, objek yang bersifat finalizasi dapat dikumpulkan kembali selama proses pengumpulan sampah saat menjalankan metode dalam panggilan ke platform. Jika finalizer membebaskan handel yang diteruskan ke pemanggil platform, itu dapat menyebabkan kerusakan pada handle. Handle juga dapat diklaim kembali saat metode Anda diblokir selama pemanggilan platform, seperti saat membaca file.
Lebih kritis lagi, karena Windows secara agresif mendaur ulang handle, sebuah handle 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 dilakukan SafeHandle
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 masa hidup objek dengan menetapkan dan melepaskan pegangan tanpa gangguan. Ini berisi finalizer penting yang memastikan bahwa penanganan ditutup dan dijamin berjalan selama bongkar tak terduga AppDomain, bahkan dalam kasus ketika panggilan fungsi platform yang diasumsikan sudah dalam keadaan rusak.
Karena SafeHandle mewarisi dari CriticalFinalizerObject, semua finalizer tidak kritis dipanggil sebelum semua finalizer kritis. Para finalizer dipanggil pada objek yang tidak lagi hidup selama putaran 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 penggunaan yang sangat lemah antara finalizer Kritis dan Nonkritikal 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 metode SafeHandle.ReleaseHandle(), 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 dari handel yang dienkapsulasi oleh SafeHandle dan menurunkannya setelah selesai. Ini memastikan bahwa pegangan tidak akan didaur ulang atau ditutup tiba-tiba.
Anda dapat menentukan pemilikan dasar handle saat membuat SafeHandle objek dengan memberikan nilai ke argumen ownsHandle pada konstruktor kelas SafeHandle. Ini mengontrol apakah objek SafeHandle akan melepaskan handle setelah objek tersebut dibuang. Ini berguna untuk pegangan dengan persyaratan masa pakai yang unik atau untuk mengonsumsi pegangan yang masa pakainya dikontrol oleh pihak lain.
Kelas yang berasal dari SafeHandle
SafeHandle adalah kelas pembungkus abstrak untuk handle sistem operasi. Memperoleh hasil dari kelas ini sulit. Sebagai gantinya, gunakan kelas turunan di namespace Microsoft.Win32.SafeHandles yang menyediakan handle aman untuk yang berikut ini:
- File ( SafeFileHandle kelas ).
- File yang dipetakan memori (kelas SafeMemoryMappedFileHandle).
- Pipa (SafePipeHandle kelas).
- Tampilan memori (kelas SafeMemoryMappedViewHandle).
- Konstruksi kriptografi (kelas SafeNCryptHandle, SafeNCryptKeyHandle, SafeNCryptProviderHandle, dan SafeNCryptSecretHandle).
- Proses (kelas SafeProcessHandle).
- Kunci registri ( SafeRegistryHandle kelas).
- Handel tunggu (kelas SafeWaitHandle).