openGenericCERCall – pomocník spravovaného ladění (MDA)
Poznámka:
Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.
Aktivuje openGenericCERCall
se pomocník spravovaného ladění, který upozorní, že graf oblasti omezeného spuštění (CER) s proměnnými obecného typu v kořenové metodě se zpracovává při kompilaci JIT nebo v době generování nativní bitové kopie a alespoň jedna z proměnných obecného typu je referenčním typem objektu.
Příznaky
Kód CER se nespustí při přerušení vlákna nebo při uvolnění domény aplikace.
Příčina
V době kompilace JIT je instance obsahující typ odkazu objektu pouze reprezentativní, protože výsledný kód je sdílen a každá z proměnných typu odkazu na objekt může být libovolným typem odkazu na objekt. To může předejít přípravě některých prostředků za běhu předem.
Konkrétně metody s proměnnými obecného typu mohou lazily přidělovat prostředky na pozadí. Označují se jako obecné položky slovníku. Například pro příkaz List<T> list = new List<T>();
, kde T
je proměnná obecného typu, musí modul runtime vyhledat a případně vytvořit přesnou instanci za běhu, například List<Object>, List<String>
atd. To může selhat z různých důvodů nad rámec ovládacího prvku vývojáře, jako je například nedostatek paměti.
Tato sada MDA by měla být aktivována pouze v době kompilace JIT, ne v případě, že existuje přesná instance.
Při aktivaci tohoto MDA jsou pravděpodobné příznaky, že CERS nejsou funkční pro chybné instance. Modul runtime se ve skutečnosti nepokoušel implementovat CER za okolností, které způsobily aktivaci MDA. Takže pokud vývojář použije sdílenou instanci CER, pak chyby kompilace JIT, chyby načítání obecného typu nebo přerušení vlákna v oblasti zamýšlené cer nejsou zachyceny.
Rozlišení
Nepoužívejte proměnné obecného typu, které jsou typu odkazu na objekt pro metody, které mohou obsahovat CER.
Vliv na modul runtime
Tento mdA nemá žádný vliv na CLR.
Výstup
Následuje ukázka výstupu z tohoto MDA:
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"
Konfigurace
<mdaConfig>
<assistants>
<openGenericCERCall/>
</assistants>
</mdaConfig>
Příklad
Kód CER se nespustí.
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.");
}
}
}