Compartilhar via


openGenericCERCall MDA

O openGenericCERCall o Assistente de depuração gerenciada é ativado para avisar que um gráfico (CER) da região de execução restrita com variáveis de tipo genérico no método de raiz está sendo processado no compilação JIT ou 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

Código CER não é executado quando um thread for anulado, ou quando um domínio de aplicativo é descarregado.

Causa

Em tempo de compilação JIT, uma instanciação contendo um tipo de referência de objeto é o representante somente porque o código resultante é compartilhado, e cada uma das variáveis do tipo de referência de objeto pode ser qualquer tipo de referência do objeto. Isso pode impedir a preparação de alguns recursos de tempo de execução com antecedência.

Em particular, os métodos com variáveis de tipo genérico podem alocam ociosamente recursos no plano de fundo. Estes são chamados de entradas de dicionário genérico. Por exemplo, para a instrução List<T> list = new List<T>(); onde T é uma variável de tipo genérico o runtime deve pesquisar e possivelmente criar a instanciação exata em tempo de execução, por exemplo, List<Object>, List<String>,e assim por diante. Isso pode falhar por inúmeras razões além do controle do desenvolvedor, como, por exemplo, a execução fora da memória.

Este MDA só deve ser ativado em tempo de compilação JIT, não quando há uma instanciação exata.

Quando este MDA é ativada, os sintomas provavelmente são as CERs não são funcionais para as instanciações incorretas. Na verdade, o runtime não tentou 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, os erros de compilação JIT, genéricos digite erros de carregamento ou anulações de thread dentro da região de CER pretendido não são detectadas.

Resolução

Não use variáveis de tipo genérico que são do tipo de referência de objeto para os 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

Referência

PrepareMethod

System.Runtime.ConstrainedExecution

Conceitos

Diagnosticar erros com assistentes de depuração gerenciada