Delen via


Klasse System.Runtime.InteropServices.SafeHandle

In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.

De SafeHandle klasse zorgt voor een kritische afronding van handleresources, waardoor handlers niet voortijdig kunnen worden vrijgemaakt door vuilnisopruiming en niet kunnen worden hergebruikt door het besturingssysteem om onbedoelde onbeheerde objecten te verwijzen.

Waarom SafeHandle?

Hoewel overschrijvingen naar de Object.Finalize methode het opruimen van onbeheerde resources toestaan wanneer een object door garbage collection wordt ingezameld, kunnen in sommige gevallen finaliseerbare objecten door garbage collection worden teruggewonnen tijdens het uitvoeren van een methode binnen een aanroep van een platform. Als een finalizer de handle vrijgeeft die door die platformaanroep wordt gebruikt, kan dit leiden tot beschadiging van de handle. De handle kan ook worden teruggevorderd terwijl uw methode wordt geblokkeerd tijdens een aanroep van een platform, zoals tijdens het lezen van een bestand.

Kritischer, omdat Windows agressief handles recyclet, kan een handle worden gerecycled en verwijzen naar een andere resource die gevoelige gegevens kan bevatten. Dit wordt een recycle-aanval genoemd en kan mogelijk gegevens beschadigen en een beveiligingsrisico vormen.

Wat SafeHandle doet

De SafeHandle klasse vereenvoudigt verschillende problemen met de levensduur van objecten en is geïntegreerd met het aanroepen van het platform, zodat besturingssysteembronnen niet worden gelekt. De SafeHandle klasse lost problemen met de levensduur van objecten op door grepen zonder onderbreking toe te wijzen en los te laten. Het bevat een kritieke finalizer die ervoor zorgt dat de handle wordt gesloten en gegarandeerd wordt uitgevoerd tijdens onverwachte AppDomain unload-operaties, zelfs in gevallen waarin wordt aangenomen dat de aanroep van het platform zich in een corrupte toestand bevindt.

Omdat SafeHandle afstamt van CriticalFinalizerObject, worden alle niet-kritieke finalizers aangeroepen vóór enige van de kritieke finalizers. De finalizers worden aangeroepen op objecten die niet langer leven tijdens dezelfde garbagecollectionpas. Een FileStream object kan bijvoorbeeld een normale finalizer draaien om bestaande gebufferde gegevens te legen zonder het risico dat de bestandsdescriptor wordt gelekt of gerecycled. Deze zeer zwakke volgorde tussen kritieke en niet-kritieke finalizers is niet bedoeld voor algemeen gebruik. Het bestaat voornamelijk om te helpen bij de migratie van bestaande bibliotheken door deze bibliotheken toe te staan te gebruiken SafeHandle zonder hun semantiek te wijzigen. Daarnaast moeten de kritieke finalizer en alles wat het aanroept, zoals de SafeHandle.ReleaseHandle() methode, zich in een beperkte uitvoeringsregio bevinden. Hiermee worden beperkingen opgelegd aan de code die binnen de oproepgrafiek van de finalizer kan worden geschreven.

Platformaanroepbewerkingen verhogen automatisch het referentieaantal van handles die zijn geïncapeleerd in een SafeHandle en verlagen deze na de voltooiing. Dit zorgt ervoor dat de greep niet hergebruikt of onverwacht gesloten wordt.

U kunt het eigendom van de onderliggende ingang opgeven bij het maken van SafeHandle objecten door een waarde op te geven aan het ownsHandle argument in de SafeHandle klasseconstructor. Hiermee bepaalt u of het SafeHandle object de ingang vrijgeeft nadat het object is verwijderd. Dit is handig voor handles met specifieke vereisten qua levensduur of voor het gebruik van een onderdeel waarvan de levensduur wordt beheerd door iemand anders.

Klassen die zijn afgeleid van SafeHandle

SafeHandle is een abstracte wrapper-klasse voor besturingsgrepen van het besturingssysteem. Het is moeilijk om van deze klasse af te leiden. Gebruik in plaats daarvan de afgeleide klassen in de Microsoft.Win32.SafeHandles naamruimte die veilige ingangen bieden voor het volgende: