System.runtime.interopservices. Sejf Handle – třída

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Třída SafeHandle poskytuje kritickou finalizaci prostředků popisovače, což brání předčasnému uvolnění popisovačů uvolňováním paměti a recyklací operačním systémem, aby odkazoval na nespravované nespravované objekty.

Proč Sejf Handle?

I když přepsání Object.Finalize metody umožňuje vyčištění nespravovaných prostředků při uvolňování paměti objektu, za určitých okolností lze finalizovatelné objekty uvolněním paměti při spuštění metody v rámci volání vyvolání platformy. Pokud finalizátor uvolní obslužnou rutinu předanou volání volání této platformy, může vést k manipulaci s poškozením. Popisovač lze také uvolnit, když je vaše metoda blokována během volání vyvolání platformy, například při čtení souboru.

Důležitější je, že systém Windows agresivně recykluje popisovače, takže popisovač může být recyklován a odkazovat na jiný prostředek, který může obsahovat citlivá data. To se označuje jako útok na recyklaci a může potenciálně poškodit data a být bezpečnostní hrozbou.

Co dělá Sejf Handle

Třída SafeHandle zjednodušuje několik těchto problémů životnosti objektů a je integrována s voláním platformy tak, aby prostředky operačního systému nebyly unikly. Třída SafeHandle řeší problémy s životností objektu přiřazením a uvolněním popisovačů bez přerušení. Obsahuje kritický finalizátor, který zajišťuje, že je popisovač uzavřen a je zaručeno, že se spustí během neočekávaných AppDomain uvolnění, a to i v případech, kdy se předpokládá, že volání vyvolání platformy je v poškozeném stavu.

Vzhledem k tomu SafeHandle , že dědí z CriticalFinalizerObject, všechny nekritické finalizátory jsou volány před některou z kritických finalizátorů. Finalizační metody se volají na objekty, které již nejsou aktivní během stejného průchodu uvolňování paměti. Objekt může například spustit normální finalizátor, FileStream který vyprázdní stávající data ve vyrovnávací paměti bez rizika úniku nebo recyklace popisovače. Toto velmi slabé řazení mezi kritickými a nekritickými finalizátory není určeno pro obecné použití. Existuje především proto, aby pomohla s migrací existujících knihoven tím, že těmto knihovnám umožňuje používat SafeHandle beze změny jejich sémantiky. Kromě toho musí být kritický finalizátor a cokoli, co volá, například metodu SafeHandle.ReleaseHandle() , v omezené oblasti provádění. To omezuje, jaký kód lze napsat v grafu volání finalizátoru.

Operace vyvolání platformy automaticky zvýší počet popisovačů zapouzdřených SafeHandle pomocí a po dokončení je dekrementuje. Tím se zajistí, že popisovač nebude recyklován ani neočekávaně zavřený.

Při vytváření SafeHandle objektů můžete zadat vlastnictví základního popisovače zadáním hodnoty argumentu ownsHandle v konstruktoru SafeHandle třídy. Určuje, zda SafeHandle objekt uvolní popisovač po odstranění objektu. To je užitečné pro zpracování se zvláštními životními požadavky nebo pro využívání úchytu, jehož životnost je řízena někým jiným.

Třídy odvozené z Sejf Handle

SafeHandle je abstraktní třída obálky pro popisovače operačního systému. Odvození z této třídy je obtížné. Místo toho použijte odvozené třídy v Microsoft.Win32.SafeHandles oboru názvů, které poskytují bezpečné popisovače pro následující: