Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Эта статья связана с .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.
Помощник openGenericCERCall по управляемой отладке активируется, чтобы предупредить, что граф ограниченного региона выполнения (CER) с переменными универсального типа в корневом методе обрабатывается в JIT-компиляции или во время создания собственного образа, а по крайней мере одна из переменных универсального типа — это ссылочный тип объекта.
Симптомы
Код CER не выполняется при прерывании потока или при выгрузке домена приложения.
Причина
Во время компиляции JIT экземпляр, содержащий ссылочный тип объекта, является только репрезентативным, так как результирующий код является общим, и каждая из переменных ссылочного типа объекта может быть любым ссылочным типом объекта. Это может предотвратить подготовку некоторых ресурсов среды выполнения заранее.
В частности, методы с переменными универсального типа могут лениво выделять ресурсы в фоновом режиме. Они называются универсальными записями словаря. Например, для инструкции List<T> list = new List<T>(); , где T является переменная универсального типа, среда выполнения должна искать и, возможно, создавать точный экземпляр во время выполнения, например List<Object>, List<String>, и т. д. Это может завершиться сбоем по различным причинам за пределами управления разработчиком, например нехваткой памяти.
Этот MDA должен быть активирован только во время JIT-компиляции, а не при наличии точного экземпляра.
Когда этот MDA активируется, скорее всего, симптомы того, что ЦС не работают для плохих экземпляров. На самом деле среда выполнения не пыталась реализовать CER в условиях, которые привели к активации MDA. Поэтому если разработчик использует общий экземпляр CER, то ошибки JIT-компиляции, ошибки загрузки универсальных типов или прерывания потоков в регионе предполагаемого CER не перехватываются.
Резолюция
Не используйте переменные универсального типа, которые являются ссылочным типом объекта для методов, которые могут содержать CER.
Влияние на среду выполнения
Этот MDA не влияет на среду CLR.
Выходные данные
Ниже приведен пример выходных данных из этого 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 runtime prior to execution.
method name="GenericMethodWithCer"
declaringType name="OpenGenericCERCall"
Конфигурация
<mdaConfig>
<assistants>
<openGenericCERCall/>
</assistants>
</mdaConfig>
Example
Код CER не выполняется.
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 runtime.
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.");
}
}
}