Dela via


System.Runtime.InteropServices.SafeHandle-klass

Den här artikeln innehåller ytterligare kommentarer till referensdokumentationen för det här API:et.

Klassen SafeHandle ger en kritisk slutförande av hanteringsresurser, vilket förhindrar att handtag återvinns i förtid av skräpinsamling och från att återanvändas av operativsystemet för att referera till oavsiktliga ohanterade objekt.

Varför SafeHandle?

Även om åsidosättningar av Object.Finalize-metoden tillåter rensning av ohanterade resurser när ett objekt samlas in av sopinsamlingen, kan i vissa fall finaliserbara objekt återtas av sopinsamlingen medan en metod körs inom ett plattformsanrop. Om en finalizer frigör handtaget som skickas till det plattforminvokeringsanropet kan det leda till skador på handtaget. Handtaget kan också frigöras medan metoden blockeras under ett plattformsanrop, till exempel när du läser en fil.

Mer kritiskt är att eftersom Windows aggressivt återvinner handtag kan ett handtag återvinnas och peka på en annan resurs som kan innehålla känsliga data. Detta kallas för en återanvändningsattack och kan potentiellt skada data och vara ett säkerhetshot.

Vad SafeHandle gör

Klassen SafeHandle förenklar flera av dessa problem med objektets livslängd och är integrerad med plattformsanrop så att operativsystemresurser inte läcker ut. Klassen SafeHandle löser problem med objektlivslängd genom att tilldela och frigöra handtag utan avbrott. Den innehåller en kritisk finalator som säkerställer att handtaget stängs och garanteras att köras under oväntade AppDomain avlastningar, även om plattformsanropet antas vara i ett skadat tillstånd.

Eftersom SafeHandle ärver från CriticalFinalizerObjectanropas alla icke-kritiska finalatorer före någon av de kritiska finalatorerna. Finalizers anropas för objekt som inte längre är aktiva under samma skräpinsamlingspass. Ett objekt kan till exempel FileStream köra en normal finalator för att rensa ut befintliga buffrade data utan risk för att handtaget läcker eller återvinns. Denna mycket svaga ordning mellan kritiska och icke-kritiska finalatorer är inte avsedd för allmän användning. Det finns främst för att underlätta migreringen av befintliga bibliotek genom att tillåta dessa bibliotek att använda SafeHandle utan att ändra deras semantik. Dessutom måste den kritiska slutföraren och allt som det anropar, såsom metoden SafeHandle.ReleaseHandle(), finnas i en begränsad exekveringsregion. Detta medför begränsningar för vilken kod som kan skrivas i finaliserarens anropsdiagram.

Plattformsanropsåtgärder ökar automatiskt referensantalet handtag som kapslas in av en SafeHandle och minskar dem när de har slutförts. Detta säkerställer att handtaget inte kommer att återvinnas eller stängas oväntat.

Du kan ange ägarskap för det underliggande handtaget när du SafeHandle skapar objekt genom att ange ett värde för ownsHandle argumentet i SafeHandle klasskonstruktorn. Detta styr om SafeHandle objektet ska frigöra handtaget när objektet har tagits bort. Detta är användbart för handtag med särskilda livslängdskrav eller för att använda ett handtag vars livslängd styrs av någon annan.

Klasser som härleds från SafeHandle

SafeHandle är en abstrakt omslutningsklass för operativsystemhandtag. Det är svårt att härleda från den här klassen. Använd i stället de härledda klasserna i namnområdet Microsoft.Win32.SafeHandles som tillhandahåller säkra referenser för följande: