Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 assistente openGenericCERCall de depuração gerida é ativado para avisar que um grafo de região de execução restrita (CER) com variáveis de tipo genéricas no método raiz está a ser processado em tempo de compilação JIT ou geração nativa de imagem e que pelo menos uma das variáveis genéricas de tipo é um tipo de referência de objeto.
Sintomas
O código CER não é executado quando uma thread é abortada ou quando um domínio de aplicação é descarregado.
Motivo
No momento da compilação JIT, uma instanciação contendo um tipo de referência de objeto só é representativa porque o código resultante é partilhado, e cada variável de tipo de referência de objeto pode ser qualquer tipo de referência de objeto. Isto pode impedir a preparação de alguns recursos de execução antecipadamente.
Em particular, métodos com variáveis de tipo genéricas podem alocar recursos de forma preguiçosa em segundo plano. Estas são referidas como entradas genéricas de dicionário. Por exemplo, para a instrução List<T> list = new List<T>(); onde T é uma variável de tipo genérica, o tempo de execução deve procurar e possivelmente criar a instância exata em tempo de execução, por exemplo, List<Object>, List<String>, e assim sucessivamente. Isto pode falhar por várias razões fora do controlo do programador, como ficar sem memória.
Este MDA só deve ser ativado no momento da compilação do JIT, não quando existe uma instanciação exata.
Quando este MDA é ativado, os sintomas prováveis são que as CERs não funcionam para as instâncias negativas. Na verdade, o tempo de execução não tentou implementar uma CER nas circunstâncias que levaram à ativação da MDA. Assim, se o programador usar uma instância partilhada da CER, então erros de compilação JIT, erros de carregamento genéricos ou abortos de thread dentro da região da CER pretendida não são detetados.
Resolução
Não use variáveis genéricas de tipo que sejam de referência de objeto para métodos que possam conter uma CER.
Efeito no tempo de execução
Este MDA não tem efeito no CLR.
Resultado
Segue-se uma amostra da 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.");
}
}
}