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:

  1. Aplicar el nivel de IDispatchImplAttribute(IDispatchImplType.CompatibleImpl) ensamblado para usar una implementación proporcionada por el sistema operativo en lugar de ITypeInfo . 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 .

  2. Cambie el tipo de interfaz para que sea , ya que la implementación proporcionada por el sistema operativo InterfaceIsDual ITypeInfo no admite interfaces de envío puras.

  3. 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 typeinfo en el tipo lib.