Megosztás a következőn keresztül:


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>

Lásd még