Errore irreversibile del motore di esecuzione quando si ottiene il descrittore di sicurezza di una classe generica da un modulo di immagine nativa in un ambiente .NET Framework

Questo articolo illustra come risolvere l'errore irreversibile del motore di esecuzione che si verifica quando si ottiene il descrittore di sicurezza di una classe generica da un modulo immagine nativo in un ambiente .NET Framework.

Versione originale del prodotto: Microsoft .NET Framework 3.5 Service Pack 1
Numero KB originale: 2468429

Sintomi

Quando si tenta di ottenere il descrittore di sicurezza di una classe generica da un modulo di immagine nativa (Ngen.exe) in un ambiente Microsoft .NET Framework, viene visualizzato un messaggio di errore irreversibile del motore di esecuzione. Questo problema può verificarsi se le condizioni seguenti sono vere:

  • L'applicazione include un assembly caricato indipendente dal dominio (LoaderOptimization.MultiDomain o LoaderOptimization.MultiDomainHost).
  • L'assembly contiene un'istanza di una classe generica.
  • L'assembly è stato compilato in un'immagine nativa usando lo strumento Native Image Generator (Ngen.exe).
  • L'applicazione carica l'immagine nativa in un dominio applicazione.
  • L'applicazione tenta di usare la classe generica da un secondo dominio applicazione senza caricare l'immagine nativa in tale dominio applicazione.

Motivo

Common Language Runtime (CLR) potrebbe consentire l'esecuzione del codice nell'immagine nativa indipendente dal dominio nel secondo dominio applicazione anche se l'immagine nativa non è ancora stata caricata in tale dominio applicazione. Se CLR tenta di ottenere un descrittore di sicurezza prima del caricamento dell'immagine nativa( ad esempio, quando viene creato un delegato per un metodo del tipo generico di cui è stata creata un'istanza), può verificarsi un errore irreversibile del motore di esecuzione.

Questo problema è difficile da riprodurre. CLR carica in modo aggressivo gli assembly nei domini applicazione. Ad esempio, se un Type oggetto viene passato in un dominio applicazione, in questo modo CLR carica l'assembly che definisce il tipo. Pertanto, non è facile per il secondo dominio applicazione ottenere informazioni sulla classe generica di cui è stata creata un'istanza senza causare il caricamento dell'assembly da parte di CLR. I percorsi di codice che contribuiscono a questo problema si verificano solo in scenari complessi.

Soluzioni alternative

Per risolvere questo problema, usare uno dei metodi seguenti:

  • Caricare in modo esplicito l'assembly in ogni dominio applicazione che lo userà. Ad esempio, caricare l'assembly chiamando il Assembly.Load metodo .

  • Non caricare l'assembly come indipendente dal dominio.

    Annotazioni

    Questa soluzione alternativa potrebbe influire sulle dimensioni del working set dell'applicazione.

  • Non usare lo strumento Ngen.exe per creare un'immagine nativa per l'assembly.

    Annotazioni

    Questa soluzione alternativa potrebbe influire sulle prestazioni dell'applicazione.

  • Aggiornare l'applicazione a .NET Framework versione 4. Tutti i problemi noti per contribuire a questo problema sono stati risolti in .NET Framework 4.