Korlátozott végrehajtási régiók

A korlátozott végrehajtási régió (CER) egy olyan mechanizmus része, amely megbízható felügyelt kódokat hoz létre. A TANÚSÍTVÁNY egy olyan területet határoz meg, amelyben a közös nyelvi futtatókörnyezet (CLR) korlátozva van abban, hogy sávon kívüli kivételeket dobjon ki, amelyek megakadályozzák a kód teljes körű végrehajtását a területen. Ezen a régión belül a felhasználói kód nem hajtható végre olyan kódot, amely sávon kívüli kivételeket eredményezne. A PrepareConstrainedRegions metódusnak közvetlenül egy try blokk előtt kell állnia, és úgy jelöli a catch, finally és fault blokkokat, mint korlátozott végrehajtási régiókat. Ha a kód korlátozott régióként van megjelölve, a kódnak csak erős megbízhatósági szerződéssel rendelkező más kódot kell meghívnia, és a kód nem foglalhat le és nem indíthat virtuális hívásokat felkészületlen vagy megbízhatatlan metódusokhoz, kivéve, ha a kód készen áll a hibák kezelésére. A CLR késlelteti a szálak megszakítását a CER-ben végrehajtott kód esetében.

Fontos

A CER csak a .NET-keretrendszerben támogatott. Ez a cikk nem vonatkozik a .NET Core vagy a .NET 5 vagy újabb verziókra.

A korlátozott végrehajtási régiókat a CLR-ben különböző formákban használják, a try blokkok jegyzetekkel ellátott formái mellett, különösen a CriticalFinalizerObject osztályból származó osztályokban futó kritikus lezárók és a ExecuteCodeWithGuaranteedCleanup metódussal futtatott kód esetében.

CER előzetes előkészítése

A CLR előre előkészíti a CER-eket a memóriatúlcsordulás elkerülése érdekében. Előzetes előkészítésre van szükség, hogy a CLR ne okozzon memóriakihasználtságot a megfelelő időben történő fordítás vagy típusbetöltés során.

A fejlesztőnek jeleznie kell, hogy a kódrégió cer:

Megszorítások

A felhasználók a CER-ben írható kód típusában vannak korlátozva. A kód nem okozhat sávon kívüli kivételt, például a következő műveletekből eredhet:

  • Explicit kiosztás.

  • Ökölvívás.

  • Zár beszerzése.

  • A felkészületlen módszerek virtuális hívása.

  • Metódusok meghívása gyenge vagy nem létező megbízhatósági szerződéssel.

A .NET-keretrendszer 2.0-s verziójában ezek a korlátozások irányelvek. A diagnosztikát kódelemzési eszközök biztosítják.

Megbízhatósági szerződések

Ez ReliabilityContractAttribute egy egyéni attribútum, amely egy adott metódus megbízhatósági garanciáit és sérülési állapotát dokumentálja.

Megbízhatósági garanciák

A megbízhatósági garanciák enumerálási értékekkel jelölve Cer egy adott módszer megbízhatósági fokát jelzik:

  • MayFail. Kivételes körülmények között a módszer sikertelen lehet. Ebben az esetben a metódus visszaküldi a hívó metódusnak, hogy sikeres vagy sikertelen volt-e. A metódust egy CER-ben kell tárolni, hogy képes legyen a visszatérési érték jelentésére.

  • None. A módszernek, típusnak vagy szerelvénynek nincs fogalma a CER-ről, és nagy valószínűséggel nem biztonságos hívni egy CER-en belül anélkül, hogy jelentős mértékben mérsékelnék az állapot sérülésének kockázatát. Nem használja ki a CER-garanciákat. Ez a következőket jelenti:

    1. Kivételes körülmények között a módszer sikertelen lehet.

    2. Előfordulhat, hogy a metódus jelentést készít a kudarcáról, vagy nem.

    3. A módszer nem CER használatára van megírva, ez a legvalószínűbb forgatókönyv.

    4. Ha egy metódust, típust vagy szerelvényt nem határoz meg explicit módon a sikeresség érdekében, a metódus implicit módon a következőként Nonelesz azonosítva: .

  • Success. Kivételes körülmények között a módszer garantáltan sikeres lesz. Ennek a megbízhatósági szintnek a eléréséhez mindig konstruálnia kell egy CER-t a meghívott metódus köré, még akkor is, ha egy nem CER-régióból hívják. A módszer akkor sikeres, ha a célnak megfelelő eredményt ad, bár a siker szubjektív módon tekinthető meg. A Darabszám ReliabilityContractAttribute(Cer.Success) megjelölése például azt jelenti, hogy ha CER alatt fut, az mindig visszaadja a ArrayList-ben lévő elemek számát, és soha nem hagyja határozatlan állapotban a belső mezőket. CompareExchange A módszer azonban sikerként is meg van jelölve, azzal a megértéssel, hogy a siker azt jelentheti, hogy az értéket nem lehet új értékre cserélni egy versenyfeltétel miatt. A lényeg az, hogy a metódus a dokumentált módon viselkedik, és a CER-kódot nem kell úgy írni, hogy szokatlan viselkedésre számítsunk, azon túl, amit a helyes, de megbízhatatlan kód mutathatna.

Korrupciós szintek

Az enumerálási értékekkel Consistency ábrázolt sérülési szintek azt jelzik, hogy egy adott környezetben mennyi állapot sérülhet meg:

  • MayCorruptAppDomain. Kivételes körülmények között a közös nyelvi futtatókörnyezet (CLR) nem garantálja az aktuális alkalmazástartomány állapotkonzisztenciáját.

  • MayCorruptInstance. Kivételes körülmények között az eljárás garantáltan az aktuális példányra korlátozza az állapotmegrongálódást.

  • MayCorruptProcesskivételes körülmények között a CLR nem vállal garanciát az állapotkonzisztenciára vonatkozóan; vagyis a feltétel ronthatja a folyamatot.

  • WillNotCorruptState. Kivételes körülmények között a módszer garantáltan nem rontja az állapotot.

Megbízhatósági próba/fogás/végül

A megbízhatóság try/catch/finally egy kivételkezelési mechanizmus, amely ugyanolyan szintű kiszámíthatóságot garantál, mint a nem felügyelt verzió. A catch/finally blokk a CER. A blokk metódusai előzetes előkészítést igényelnek, és nem lehetnek szünetmentesek.

A .NET-keretrendszer 2.0-s verziójában a kód tájékoztatja a futtatókörnyezetet, hogy a kipróbálás megbízható, ha közvetlenül a próbablokk előtt hívja PrepareConstrainedRegions meg. PrepareConstrainedRegions a fordító támogatási osztályának RuntimeHelperstagja. Közvetlenül hívhatja meg PrepareConstrainedRegions, amint elérhetővé válik a fordítók által.

Nem megszakítható régiók

A nem megszakítható régiók utasításkészleteket csoportosítanak egy CER-be.

A .NET Framework 2.0-s verziójában, amíg elérhető a fordító támogatása, a felhasználói kód nem megszakítható régiókat hoz létre egy megbízható try/catch/finally szerkezettel, amely egy PrepareConstrainedRegions metódushívás előtt lévő üres try/catch blokkot tartalmaz.

Kritikus véglegesítő objektum

A CriticalFinalizerObject garantálja, hogy a szemétgyűjtés végrehajtja a finalizálót. A kiosztáskor a véglegesítő és a hívási grafikon előre elkészül. A finalizer metódus cer-ben fut, és be kell tartania a CER-ekre és a véglegesítőkre vonatkozó összes korlátozást.

Minden SafeHandle és CriticalHandle típusból származó típus esetében garantált, hogy véglegesítőjük egy CER-en belül kerül végrehajtásra. Származtatott osztályokban ReleaseHandle implementálva SafeHandle végrehajthat minden olyan kódot, amely a leíró felszabadításához szükséges.

A CER-ben nem engedélyezett kód

A CER-ek nem engedélyezik a következő műveleteket:

  • Explicit elosztások.

  • Zár beszerzése.

  • Ökölvívás.

  • Többdimenziós tömbhozzáférés.

  • Metódushívások tükröződésen keresztül.

  • Enter vagy Lock.

  • Biztonsági ellenőrzések. Ne végezzen követelményeket, csak kapcsolja össze a követelményeket.

  • Isinst és Castclass a COM objektumok és proxyk esetén

  • Mezők beolvasása vagy beállítása transzparens proxy-n.

  • Szerializálás

  • Függvénymutatók és delegátumok.

Lásd még