openGenericCERCall MDA
The openGenericCERCall Assistente de depuração gerenciada está ativada para avisar que um gráfico de região (CER) de execução restrita com variáveis de tipo genérico no método raiz está sendo processado na compilação JIT ou time 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
Código CER não é executado quando um thread é anulado ou quando um domínio do aplicativo é descarregado.
Causa
No time de compilação JIT, uma instanciação contendo um tipo de referência de objeto é representante somente 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 time de execução antes do time.
Em particular, os métodos com variáveis de tipo genérico ociosamente podem alocar recursos no plano de fundo.Eles são chamados entradas de dicionário genérico.Por exemplo, para a demonstrativo List<T> list = new List<T>(); onde T é uma variável de tipo genérico o tempo de execução deve pesquisar e possivelmente criar a instanciação exata em time de execução, por exemplo, List<Object>, List<String>,e assim por diante. Isso pode falhar por várias razões além do controle do desenvolvedor, tais sistema autônomo execução fora da memória.
Este MDA só deve ser ativado em time de compilação JIT, não quando não houver uma instanciação exata.
Quando este MDA é ativado, os sintomas provavelmente são que as CERs não são funcionais para instanciações incorretas.Na verdade, o tempo de execução não tentou a implementar uma CER sob as circunstâncias que causaram o MDA ser ativado.Portanto, se o desenvolvedor usa uma instanciação compartilhada de CER, em seguida, erros de compilação JIT, genéricos digite erros de carregamento ou anulações de thread dentro da região de CER pretendida não são detectadas.
Resolução
Não use variáveis de tipo genérico do tipo de referência de objeto para métodos que podem conter uma CER.
Efeito sobre o tempo de execução
Este MDA não tem efeito sobre o CLR.
Saída
A seguir está 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 run time prior to execution.
method name="GenericMethodWithCer"
declaringType name="OpenGenericCERCall"
Configuração
<mdaConfig>
<assistants>
<openGenericCERCall/>
</assistants>
</mdaConfig>
Exemplo
O código CER não será 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 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.");
}
}
}
Consulte também
Conceitos
Diagnosticar erros com assistentes de depuração gerenciadas