openGenericCERCall (MDA)openGenericCERCall MDA

L'assistente al debug gestito openGenericCERCall viene attivato per avvisare che il grafico dell'area a esecuzione vincolata con variabili di tipo generico in corrispondenza del metodo radice viene elaborato in fase di compilazione JIT o di generazione delle immagini native e almeno una delle variabili di tipo generico è un tipo riferimento oggetto.The openGenericCERCall managed debugging assistant is activated to warn that a constrained execution region (CER) graph with generic type variables at the root method is being processed at JIT-compilation or native image generation time and at least one of the generic type variables is an object reference type.

SintomiSymptoms

Il codice dell'area a esecuzione vincolata non viene eseguito quando un thread viene interrotto o quando viene scaricato un dominio dell'applicazione.CER code does not run when a thread is aborted or when an application domain is unloaded.

CausaCause

In fase di compilazione JIT, la creazione di un'istanza che contiene un tipo riferimento oggetto è rappresentativa solo perché il codice risultante è condiviso e ognuna delle variabili di tipo riferimento oggetto potrebbe essere qualsiasi tipo riferimento oggetto.At JIT-compilation time, an instantiation containing an object reference type is only representative because the resultant code is shared, and each of the object reference type variables might be any object reference type. Ciò può impedire la preparazione anticipata di alcune risorse in fase di esecuzione.This can prevent the preparation of some run-time resources ahead of time.

In particolare, i metodi con variabili di tipo generico possono allocare risorse in background in modo differito.In particular, methods with generic type variables can lazily allocate resources in the background. Queste sono note come voci di dizionario generiche.These are referred to as generic dictionary entries. Ad esempio, per l'istruzione List<T> list = new List<T>(); in cui T è una variabile di tipo generico, il runtime deve cercare ed eventualmente creare un'istanza esatta in fase di esecuzione, ad esempio List<Object>, List<String> e così via.For instance, for the statement List<T> list = new List<T>(); where T is a generic type variable the runtime must look up and possibly create the exact instantiation at run time, for example, List<Object>, List<String>,and so forth. Questa operazione può non riuscire per svariati motivi non sotto il controllo dello sviluppatore, ad esempio memoria insufficiente.This can fail for a variety of reasons beyond the developer's control, such as running out of memory.

Questo assistente al debug gestito deve essere attivato solo in fase di compilazione JIT e non quando è prevista la creazione di un'istanza esatta.This MDA should only be activated at JIT-compilation time, not when there is an exact instantiation.

Quando viene attivato questo assistente al debug gestito, i sintomi più probabili sono il mancato funzionamento delle aree a esecuzione vincolata per le creazioni di istanze non valide.When this MDA is activated, the likely symptoms are that CERs are not functional for the bad instantiations. In effetti, il runtime non ha tentato di implementare un'area a esecuzione vincolata nelle circostanze che hanno causato l'attivazione dell'assistente al debug gestito.In fact, the runtime has not attempted to implement a CER under the circumstances that caused the MDA to be activated. Pertanto, se lo sviluppatore usa la creazione d'istanza condivisa dell'area a esecuzione vincolata, gli errori di compilazione JIT, gli errori di caricamento di tipi generici o le interruzioni di thread all'interno dell'area a esecuzione vincolata prevista non vengono intercettati.So if the developer uses a shared instantiation of the CER, then JIT-compilation errors, generics type loading errors, or thread aborts within the region of the intended CER are not caught.

RisoluzioneResolution

Non usare variabili di tipo generico che sono di tipo riferimento oggetto per i metodi che possono contenere un'area a esecuzione vincolata.Do not use generic type variables that are of object reference type for methods that may contain a CER.

Effetto sull'ambiente di esecuzioneEffect on the Runtime

L'assistente al debug gestito non ha alcun effetto su CLR.This MDA has no effect on the CLR.

OutputOutput

Di seguito è riportato un esempio di output di questo assistente al debug gestito.The following is a sample of output from this 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"

ConfigurazioneConfiguration

<mdaConfig>  
  <assistants>  
    <openGenericCERCall/>  
  </assistants>  
</mdaConfig>  

EsempioExample

Il codice dell'area a esecuzione vincolata non viene eseguito.The CER code is not executed.

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.");  
        }  
    }  
}  

Vedere ancheSee Also

PrepareMethod
System.Runtime.ConstrainedExecution
Diagnostica degli errori tramite gli assistenti al debug gestitoDiagnosing Errors with Managed Debugging Assistants