FatalExecutionEngineError se produce cuando se hacen llamadas COM junto con varios AppDomains
Este artículo le ayuda a resolver el problema en el que se puede provocar un error FatalExecutionEngineError al realizar llamadas del Modelo de objetos componentes (COM) junto con varios AppDomains.
Versión del producto original: .NET Framework 4.5
Número KB original: 2997900
Síntomas
En una aplicación ASP.NET, al crear varios AppDomains e iniciar un método con un parámetro opcional mediante el uso sin especificar un valor para el parámetro opcional, la aplicación puede bloquearse y recibir el siguiente mensaje IDispatch::Invoke de error:
El Asistente para depuración administrada FatalExecutionEngineError ha detectado un problema en xxx.exe. Información adicional: el tiempo de ejecución ha encontrado un error grave. La dirección del error estaba en 0x0e888517, en el 0x20a8. El código de error es 0xc0000005.
Causa
.NET crea un identificador de GC interno en el primero donde se realiza la llamada al método y reutilizará el mismo controlador de GC interno durante toda la vigencia de la aplicación, independientemente de cuál AppDomain AppDomain se utilice. Puede provocar un bloqueo de la aplicación si AppDomain se descarga.
Solución alternativa
Para evitar este problema, implemente los cambios compartidos como ejemplo de código:
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ITestInterface
{
.
.
}
Para ello, siga estos pasos:
Aplicar el nivel de
IDispatchImplAttribute(IDispatchImplType.CompatibleImpl)ensamblado para usar una implementación proporcionada por el sistema operativo en lugar deITypeInfo. Implementación de NET:[assembly:IDispatchImplAttribute(IDispatchImplType.CompatibleImpl)]O bien, puede aplicar dicho atributo en cualquier tipo al que se tenga que tener acceso a través de
IDispatch.Cambie el tipo de interfaz para que sea , ya que la implementación proporcionada por el sistema operativo
InterfaceIsDualITypeInfono admite interfaces de envío puras.Haga que la interfaz sea pública y visible para COM de modo que la interfaz se muestre realmente en el tipo lib y se pueda encontrar la correspondiente
typeinfoen el tipo lib.