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


openGenericCERCall 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 openGenericCERCall felügyelt hibakeresési segéd aktiválva van, hogy figyelmeztesse, hogy a rendszer jiT-fordítási vagy natív képgenerálási időpontban dolgoz fel egy korlátozott végrehajtási régió (CER) gráfot általános típusváltozókkal, és az általános típusú változók közül legalább egy objektumhivatkozási típus.

Hibajelenségek

A CER-kód nem fut egy szál megszakítása vagy egy alkalmazástartomány eltávolításakor.

Ok

JIT-fordításkor az objektumhivatkozás-típust tartalmazó példányok csak azért reprezentatívak, mert az eredményül kapott kód meg van osztva, és az objektumhivatkozás-típus minden változója bármilyen objektumhivatkozás-típus lehet. Ez megakadályozhatja, hogy bizonyos futásidejű erőforrásokat előre előkészítsen.

Az általános típusú változókkal rendelkező metódusok például lazán lefoglalhatnak erőforrásokat a háttérben. Ezeket általános szótárbejegyzéseknek nevezzük. Például ahhoz az utasításhoz List<T> list = new List<T>(); , amely T egy általános típusú változó, a futtatókörnyezetnek fel kell keresnie, és valószínűleg létre kell hoznia a pontos példányt futásidőben, List<Object>, List<String>például stb. Ez számos, a fejlesztő által nem befolyásolható okból meghiúsulhat, például elfogy a memória.

Ezt az MDA-t csak JIT-fordítási időpontban kell aktiválni, pontos példányosítás esetén nem.

Ha ez az MDA aktiválva van, a valószínű tünetek az, hogy a CER-ek nem működnek a rossz példányok esetében. Valójában a futtatókörnyezet nem kísérelt meg cer implementálását olyan körülmények között, amelyek miatt az MDA aktiválva lett. Tehát ha a fejlesztő a CER megosztott példányosítását használja, akkor a rendszer nem észleli a JIT-fordítási hibákat, az általános típus betöltési hibáit vagy a szál megszakításait a kívánt CER régión belül.

Resolution (Osztás)

Ne használjon olyan általános típusváltozókat, amelyek objektumhivatkozási típusúak a CER-t tartalmazó metódusokhoz.

Effektus a futtatókörnyezetre

Ez az MDA nincs hatással a CLR-re.

Hozam

Az alábbi minta az MDA kimenetéből származik:

Method 'GenericMethodWithCer', which contains at least one constrained execution region, cannot be prepared automatically since it has one or more unbound generic type parameters.
The caller must ensure this method is prepared explicitly at run time prior to execution.
method name="GenericMethodWithCer"
declaringType name="OpenGenericCERCall"

Konfiguráció

<mdaConfig>
  <assistants>
    <openGenericCERCall/>
  </assistants>
</mdaConfig>

Példa

A CER-kód nem lesz végrehajtva.

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

class Program
{
    static void Main(string[] args)
    {
        CallGenericMethods();
    }
    static void CallGenericMethods()
    {
        // This call is correct. The instantiation of the method
        // contains only nonreference types.
        MyClass.GenericMethodWithCer<int>();

        // This call is incorrect. A shared version of the method that
        // cannot be completely analyzed will be JIT-compiled. The
        // MDA will be activated at JIT-compile time, not at run time.
        MyClass.GenericMethodWithCer<String>();
    }
}

class MyClass
{
    public static void GenericMethodWithCer<T>()
    {
        RuntimeHelpers.PrepareConstrainedRegions();
        try
        {

        }
        finally
        {
            // This is the start of the CER.
            Console.WriteLine("In finally block.");
        }
    }
}

Lásd még