Error del motor de ejecución fatal al obtener el descriptor de seguridad de una clase genérica de un módulo de imagen nativa en un entorno .NET Framework ejecución
Este artículo le ayuda a resolver el error del motor de ejecución fatal que se produce al obtener el descriptor de seguridad de una clase genérica de un módulo de imagen nativa en un entorno .NET Framework ejecución.
Versión del producto original: Microsoft .NET Framework 3.5 Service Pack 1
Número KB original: 2468429
Síntomas
Cuando intenta obtener el descriptor de seguridad de una clase genérica de un módulo de imagen nativa (Ngen.exe) en un entorno de Microsoft .NET Framework, recibe un mensaje de error error del motor de ejecución fatal. Este problema puede producirse si se cumplen las siguientes condiciones:
- La aplicación incluye un ensamblado cargado sin dominio (
LoaderOptimization.MultiDomainoLoaderOptimization.MultiDomainHost). - El ensamblado contiene una instancia de una clase genérica.
- El ensamblado se ha compilado en una imagen nativa mediante la herramienta Generador de imágenes nativas (Ngen.exe).
- La aplicación carga la imagen nativa en un dominio de aplicación.
- La aplicación intenta usar la clase genérica de un segundo dominio de aplicación sin cargar la imagen nativa en ese dominio de aplicación.
Causa
Common Language Runtime (CLR) podría permitir que el código de la imagen nativa neutral del dominio se ejecute en el segundo dominio de aplicación, aunque la imagen nativa aún no se haya cargado en ese dominio de aplicación. Si CLR intenta obtener un descriptor de seguridad antes de cargar la imagen nativa (por ejemplo, cuando se crea un delegado para un método del tipo genérico instanciado), puede producirse un error fatal en el motor de ejecución.
Este problema es difícil de reproducir. CLR carga de forma agresiva ensamblados en dominios de aplicación. Por ejemplo, si un objeto se pasa a un dominio de aplicación, esto hace que Type CLR cargue el ensamblado que define el tipo. Por lo tanto, no es fácil para el segundo dominio de aplicación obtener información sobre la clase genérica instanciada sin hacer que CLR cargue el ensamblado. Las rutas de acceso de código que contribuyen a este problema solo se producen en escenarios complejos.
Soluciones alternativas
Para solucionar este problema, use uno de los métodos siguientes:
Cargue explícitamente el ensamblado en cada dominio de aplicación que lo usará. Por ejemplo, cargue el ensamblado llamando al
Assembly.Loadmétodo.No cargue el ensamblado como neutro de dominio.
Nota
Esta solución alternativa puede afectar al tamaño del conjunto de trabajo de la aplicación.
No use la herramienta Ngen.exe para crear una imagen nativa para el ensamblado.
Nota
Esta solución alternativa puede afectar al rendimiento de la aplicación.
Actualice la aplicación a la .NET Framework versión 4. Todos los problemas que se sabe que contribuyen a este problema se han tratado en el .NET Framework 4.