Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.
Třída SafeHandle zajišťuje zásadní dokončení prostředků popisovače, aby se zabránilo předčasnému uvolnění popisovačů správou paměti a recyklaci operačním systémem, což by mohlo vést k odkazu na nežádoucí nespravované objekty.
Proč SafeHandle?
I když přepsání metody Object.Finalize umožňuje vyčištění nespravovaných prostředků při uvolňování objektu paměťovým správcem, za určitých okolností mohou být finalizovatelné objekty uvolněny paměťovým správcem při provádění metody v rámci volá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é znovu získat, když je vaše metoda blokována během vyvolání platformy, například při čtení souboru.
Ještě 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 SafeHandle dělá
Třída SafeHandle zjednodušuje řešení několika problémů s životností objektů a je integrována s voláním platformy, aby nedocházelo k úniku prostředků operačního systému. 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 proběhne během neočekávaného AppDomain uvolnění, a to i v případech, kdy se předpokládá, že volání platformních funkcí 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 všemi kritickými finalizátory. Finalizační metody se volají na objekty, které už nejsou dostupné během stejného průchodu odpadkovou kolekcí. Objekt může například spustit běžný finalizátor, který FileStream vyprázdní stávající data uložená ve vyrovnávací paměti, aniž by hrozilo riziko úniku nebo opětovné použití ovládacího prvku. 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á, jako například metoda SafeHandle.ReleaseHandle(), v omezené oblasti provádění. To omezuje, jaký kód lze napsat v grafu volání finalizátoru.
Platformní vyvolání automaticky zvýší referenční počet popisovačů zapouzdřených pomocí SafeHandle 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 objekt SafeHandle uvolní popisovač po zrušení objektu. To je užitečné pro úchyty se specifickými požadavky na životnost nebo pro využívání úchytu, jehož životnost je řízena někým jiným.
Třídy odvozené od SafeHandle
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í:
- Soubory ( SafeFileHandle třída).
- Soubory mapované v paměti ( SafeMemoryMappedFileHandle třída).
- Kanály (třída SafePipeHandle).
- Pohledy paměti (třída SafeMemoryMappedViewHandle).
- Kryptografické konstrukce (the SafeNCryptHandle, SafeNCryptKeyHandle, SafeNCryptProviderHandlea SafeNCryptSecretHandle třídy).
- Procesy ( SafeProcessHandle třída).
- Klíče registru ( SafeRegistryHandle třída).
- Čekací rutiny (třída SafeWaitHandle).