invalidCERCall MDA
Feljegyzés
Ez a cikk a .NET-keretrendszer vonatkozik. Ez nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.
A invalidCERCall
felügyelt hibakeresési segéd (MDA) akkor aktiválódik, ha a korlátozott végrehajtási régió (CER) gráfon belül olyan metódusra van hívás, amely nem rendelkezik megbízhatósági szerződéssel vagy túlzottan gyenge szerződéssel. A gyenge szerződés olyan szerződés, amely azt állapítja meg, hogy a legrosszabb esetben az állapot sérülése nagyobb hatókörrel rendelkezik, mint a hívásnak átadott példány, azaz a AppDomain vagy a folyamat állapota megsérülhet, vagy hogy az eredmény nem mindig determinisztikusan megbízható, ha a cer-en belül meghívják.
Hibajelenségek
Váratlan eredmények a kód CER-ben való végrehajtásakor. A tünetek nem specifikusak. Váratlan, egy ThreadAbortExceptionvagy más kivételt jelenthetnek OutOfMemoryExceptiona megbízhatatlan metódus meghívásánál, mert a futtatókörnyezet nem előkészítette előre, és nem védte meg a futtatáskor a kivételektőlThreadAbortException. Nagyobb fenyegetés, hogy a futási időben a metódusból eredő kivételek instabil állapotba kerülhetnek AppDomain , ami ellentétes a CER céljával. A TANÚSÍTVÁNY létrehozásának oka az ilyen állapotsérülések elkerülése. A sérült állapot tünetei alkalmazásspecifikusak, mivel a konzisztens állapot definíciója eltér az alkalmazásoktól.
Ok
A CER-en belüli kód olyan függvényeket hív meg, amelyek nem ReliabilityContractAttribute vagy gyengék ReliabilityContractAttribute , és nem kompatibilisek a CER-ben való futtatással.
A megbízhatósági szerződés szintaxisa szerint a gyenge szerződés olyan szerződés, amely nem ad meg Consistency számbavételi értéket, vagy nem ad meg Consistency értéket MayCorruptProcess, MayCorruptAppDomainvagy None. Ezen feltételek bármelyike azt jelzi, hogy a hívott kód akadályozhatja a cer másik kódjának konzisztens állapot fenntartására irányuló erőfeszítéseit. A CER-ek lehetővé teszik, hogy a kód nagyon determinisztikus módon kezelje a hibákat, fenntartva az alkalmazás szempontjából fontos belső invariánsokat, és lehetővé teszi, hogy továbbra is futhasson az átmeneti hibák, például a memóriakivételek miatt.
Ennek az MDA-nak az aktiválása azt jelzi, hogy a CER-ben meghívott metódus meghiúsulhat oly módon, hogy a hívó nem várta, vagy hogy a AppDomain folyamat állapota sérült vagy helyreállíthatatlan marad. Természetesen előfordulhat, hogy a hívott kód megfelelően fut, és a probléma egyszerűen egy hiányzó szerződés. A megbízható kód írásával kapcsolatos problémák azonban finomak, és a szerződés hiánya jó jelzés arra, hogy a kód nem megfelelően fut. A szerződések azt jelzik, hogy a programozó megbízhatóan kódolt, és azt is ígéri, hogy ezek a garanciák nem változnak a kód későbbi változataiban. Vagyis a szerződések szándéknyilatkozatok, és nem csak a megvalósítás részletei.
Mivel a gyenge vagy nem létező szerződéssel rendelkező metódusok számos kiszámíthatatlan módon meghiúsulhatnak, a futtatókörnyezet nem próbálja eltávolítani a saját előre nem látható hibáit a lusta JIT-összeállítás, általános szótárpopuláció vagy szálelmaradások által bevezetett módszerből. Ez azt jelenti, hogy az MDA aktiválása azt jelzi, hogy a futtatókörnyezet nem tartalmazta a hívott metódust a definiált CER-ben; a hívási gráf leállt ezen a csomóponton, mert a részösszeg előkészítésének folytatása segít elfedni a lehetséges hibát.
Resolution (Osztás)
Adjon hozzá érvényes megbízhatósági szerződést a függvényhez, vagy kerülje a függvényhívás használatát.
Effektus a futtatókörnyezetre
A gyenge szerződés CER-ből való meghívásának hatása lehet, hogy a CER nem hajtja végre a műveleteit. Ez a folyamatállapot sérüléséhez AppDomain vezethet.
Hozam
Az alábbi mintakimenet ebből az MDA-ból származik.
Method 'MethodWithCer', while executing within a constrained execution region, makes a call at IL offset 0x000C to 'MethodWithWeakContract', which does not have a sufficiently strong reliability contract and might cause non-deterministic results.
Konfiguráció
<mdaConfig>
<assistants>
<invalidCERCall />
</assistants>
</mdaConfig>