Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés:
Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.
Az SafeHandle osztály kritikus fontosságú véglegesítést biztosít a kezelőerőforrásokhoz, megakadályozva, hogy a leírókat a szemétgyűjtés idő előtt visszanyerje, és hogy az operációs rendszer újrahasznosítsa a nem felügyelt objektumokra való hivatkozás érdekében.
Miért a SafeHandle?
Bár a Object.Finalize metódus felülbírálása lehetővé teszi a nem felügyelt erőforrások törlését az objektumok szemétgyűjtése során, bizonyos körülmények között a véglegesíthető objektumok visszaigényelhetők szemétgyűjtéssel, miközben egy metódust egy platformhívási híváson belül hajtanak végre. Ha a véglegesítő felszabadítja a platformhívásnak átadott leírót, az sérülés kezeléséhez vezethet. A fogantyút vissza is lehet venni, miközben a metódus blokkolva van egy platformhívás során, például fájl olvasása közben.
Fontosabb szempontból, mivel a Windows agresszíven újrahasznosítja a leírókat, egy leíró újrahasznosítható, és egy másik erőforrásra mutathat, amely bizalmas adatokat tartalmazhat. Ez az úgynevezett újrahasznosítási támadás, amely potenciálisan adattorzulást okozhat, és biztonsági fenyegetést jelenthet.
A SafeHandle feladata
Az SafeHandle osztály leegyszerűsíti az objektumok élettartamával kapcsolatos problémákat, és a platformhívással integrálva van, így az operációs rendszer erőforrásai nem szivárognak ki. Az SafeHandle osztály megszakítás nélkül megoldja az objektum élettartamához kapcsolódó problémákat a kezelők kiosztásával és felszabadításával. Tartalmaz egy kritikus véglegesítőt, amely biztosítja, hogy a leíró bezáruljon, és a váratlan AppDomain kioldások során is garantáltan fusson, még akkor is, ha a platformhívás feltételezetten hibás állapotban van.
Mivel SafeHandle örökli az CriticalFinalizerObject osztálytól, minden nem kritikus véglegesítő meghívásra kerül, mielőtt a kritikus véglegesítők lennének meghívva. A véglegesítők olyan objektumokra lesznek meghívva, amelyek már nem élnek ugyanazon szemétgyűjtési áthaladás során. Egy FileStream objektum például futtathat egy normál véglegesítőt, hogy anélkül ürítse ki a meglévő pufferelt adatokat, hogy a leíró kiszivárogna vagy újrafeldolgozódna. A kritikus és nem kritikus finalizálók közötti nagyon gyenge rendezés nem általános használatra szolgál. Elsősorban azért létezik, hogy segítse a meglévő kódtárak migrálását azáltal, hogy lehetővé teszi ezeknek a kódtáraknak a használatát SafeHandle a szemantikák módosítása nélkül. Emellett a kritikus véglegesítőnek és minden hívásnak, például a SafeHandle.ReleaseHandle() metódusnak korlátozott végrehajtási régióban kell lennie. Ez korlátozza, hogy milyen kód írható a véglegesítő hívási grafikonján.
A platformhívási műveletek automatikusan növelik az egybefoglalt SafeHandle leírók referenciaszámát, és a befejezéskor meg is decrementálják őket. Ez biztosítja, hogy a fogantyú ne legyen újrahasznosítva vagy váratlanul bezárva.
Az SafeHandle objektumok létrehozásakor megadhatja a mögöttes leíró tulajdonjogát úgy, hogy a ownsHandle osztálykonstruktor SafeHandle argumentumának megad egy értéket. Ez szabályozza, hogy az SafeHandle objektum felszabadítja-e a leírót az objektum megsemmisítése után. Ez akkor hasznos, ha azonosítók különleges élettartam-követelményekkel rendelkeznek, vagy olyan azonosítót használunk, amelynek élettartamát valaki más ellenőrzi.
A SafeHandle-ből származó osztályok
SafeHandle az operációs rendszer-leírók absztrakt burkolóosztálya. Ebből az osztályból nehéz származni. Ehelyett használja a származtatott osztályokat a Microsoft.Win32.SafeHandles névtérben, amelyek biztonságos leírókat biztosítanak a következőkhöz:
- Fájlok (az SafeFileHandle osztály).
- Memórialeképezett fájlok (az SafeMemoryMappedFileHandle osztály).
- Csövek (az SafePipeHandle osztály).
- Memórianézetek (az SafeMemoryMappedViewHandle osztály).
- Titkosítási szerkezetek (a SafeNCryptHandle, SafeNCryptKeyHandle, SafeNCryptProviderHandleés SafeNCryptSecretHandle osztályok).
- Folyamatok (az SafeProcessHandle osztály).
- Beállításkulcsok (az SafeRegistryHandle osztály).
- Várakozási fogópontok (az SafeWaitHandle osztály).