Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
O openGenericCERCall assistente de depuração gerenciado é ativado para avisar que um grafo CER (região de execução restrita) com variáveis de tipo genérico no método raiz está sendo processado na compilação JIT ou no tempo de geração de imagem nativa e pelo menos uma das variáveis de tipo genérico é um tipo de referência de objeto.
Sintomas
O código CER não é executado quando um thread é anulado ou quando um domínio de aplicativo é descarregado.
Motivo
No momento da compilação JIT, uma instanciação que contém um tipo de referência de objeto só é representativa porque o código resultante é compartilhado e cada uma das variáveis de tipo de referência de objeto pode ser qualquer tipo de referência de objeto. Isso pode impedir a preparação de alguns recursos de runtime com antecedência.
Em particular, métodos com variáveis de tipo genérico podem alocar recursos lentamente em segundo plano. Elas são conhecidas como entradas de dicionário genéricas. Por exemplo, para a instrução List<T> list = new List<T>(); em T que é uma variável de tipo genérico, o runtime deve pesquisar e, possivelmente, criar a instanciação exata em runtime, por exemplo, List<Object>, List<String>e assim por diante. Isso pode falhar por várias razões além do controle do desenvolvedor, como ficar sem memória.
Esse MDA só deve ser ativado no momento da compilação JIT, não quando houver uma instanciação exata.
Quando esse MDA é ativado, os sintomas prováveis são que as CERs não são funcionais para as instâncias ruins. Na verdade, o runtime não tentou implementar um CER sob as circunstâncias que fizeram com que o MDA fosse ativado. Portanto, se o desenvolvedor usar uma instanciação compartilhada do CER, erros de compilação JIT, erros de carregamento de tipo genérico ou anulações de thread dentro da região do CER pretendido não serão capturados.
Resolução
Não use variáveis de tipo genérico que sejam do tipo de referência de objeto para métodos que possam conter um CER.
Efeito no Runtime
Esse MDA não tem nenhum efeito sobre o CLR.
Saída
Veja a seguir um exemplo de saída deste 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"
Configuração
<mdaConfig>
<assistants>
<openGenericCERCall/>
</assistants>
</mdaConfig>
Example
O código CER não é executado.
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.");
}
}
}