"System.Runtime.InteropServices.SafeHandle" osztály

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: