Aracılığıyla paylaş


System.Runtime.InteropServices.SafeHandle sınıfı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

SafeHandle sınıfı, tanıtıcı kaynaklarının kritik şekilde sonlandırılmasını sağlayarak tanıtıcıların atık toplama tarafından erken geri kazanılmasını ve istenmeyen yönetilmeyen nesnelere başvurmak için işletim sistemi tarafından geri dönüştürülmesini önler.

Neden SafeHandle?

Bazı durumlarda, finalizable objects can be reclaimed by garbage collection while executing a method within a platform invoke call.Object.Finalize yönteminin geçersiz kılınması, bir nesne çöp toplanırken yönetilmeyen kaynakların temizlenmesine izin verse de, sonlandırılabilen nesneler platform çağırma çağrısı içinde bir yöntem yürütülürken atık toplama işlemi tarafından toparlanabilir. Sonlandırıcı bu platform çağırma çağrısına geçirilen tanıtıcıyı serbest verirse, bozulmayı işlemeye yol açabilir. Bir platform çağrısı sırasında yönteminiz engellenirken , örneğin bir dosyayı okurken tanıtıcı geri kazanılabilir.

Daha da önemlisi, Windows tanıtıcıları agresif bir şekilde geri dönüştürdiğinden, bir tanıtıcı geri dönüştürülebilir ve hassas veriler içerebilecek başka bir kaynağa işaret edebilir. Bu, geri dönüşüm saldırısı olarak bilinir ve verileri bozabilir ve bir güvenlik tehdidi olabilir.

SafeHandle ne yapar?

SafeHandle sınıfı, bu nesne ömrü sorunlarının birkaçını basitleştirir ve işletim sistemi kaynaklarının sızdırılmaması için platform çağrısıyla tümleşiktir. SafeHandle sınıfı, tanıtıcıları kesintisiz olarak atayıp serbest bırakarak nesne ömrü sorunlarını çözer. Handle'ın kapatılmasını garanti eden son derece önemli bir sonlandırıcı içerir ve platform çağrısının bozuk bir durumda olduğu varsayıldığında bile beklenmeyen AppDomain yüklemeler sırasında çalışması garanti edilir.

SafeHandle öğesinden CriticalFinalizerObjectdevraldığından, kritik olmayan tüm sonlandırıcılar kritik sonlandırıcılardan önce çağrılır. Aynı çöp toplama geçişi sırasında artık canlı olmayan nesneler üzerinde sonlandırıcılar çağrılır. Örneğin, bir FileStream nesne, tanıtıcının sızdırılması veya geri dönüştürülmesi riski olmadan mevcut tamponlanmış verileri temizlemek için normal bir çözücü çalıştırabilir. Kritik ve kritik olmayan sonlandırıcılar arasındaki bu çok zayıf sıralama genel kullanıma yönelik değildir. Mevcut kitaplıkların semantiği değiştirilmeden SafeHandle kullanmaları sağlanarak, öncelikle bu kitaplıkların geçişine yardımcı olmak amacıyla vardır. Buna ek olarak, kritik sonlandırıcı ve çağırdığı SafeHandle.ReleaseHandle() yöntemi gibi her şey kısıtlanmış bir yürütme bölgesinde olmalıdır. Bu, sonlandırıcının çağrı grafı içinde hangi kodun yazılacağına yönelik kısıtlamalar uygular.

Platform çağırma işlemleri, bir SafeHandle tarafından kapsüllenen tanıtıcıların başvuru sayısını otomatik olarak artırır ve tamamlandıktan sonra bunları azaltır. Bu, tutamacın beklenmedik bir şekilde yeniden kullanılmamasını veya kapatılmamasını sağlar.

SafeHandle nesneleri oluştururken, sınıf oluşturucusunda ownsHandle bağımsız değişkenine bir değer sağlayarak temel alınan tanıtıcının sahipliğini belirtebilirsiniz. Bu, nesne atıldıktan sonra nesnenin tanıtıcıyı serbest bırakıp bırakmayacağını SafeHandle denetler. Bu, özel yaşam süresi gereksinimleri olan tutamaçlar veya kullanım ömrü başka biri tarafından denetlenen bir tutamacı tüketmek için yararlıdır.

SafeHandle'dan türetilen sınıflar

SafeHandle, işletim sistemi tanıtıcıları için bir soyut sarmalayıcı sınıfıdır. Bu sınıftan türetmek zordur. Bunun yerine, aşağıdakiler için güvenli tanıtıcılar sağlayan Microsoft.Win32.SafeHandles ad alanındaki türetilmiş sınıfları kullanın.