Condividi tramite


FatalExecutionEngineError si verifica quando si eseguono chiamate COM con più AppDomain

Questo articolo consente di risolvere il problema in cui potrebbe essere generato un errore FatalExecutionEngineError quando si eseguono chiamate COM (Component Object Model) insieme a più AppDomain.

Versione originale del prodotto: .NET Framework 4.5
Numero KB originale: 2997900

Sintomi

In un'applicazione ASP.NET, quando si creano più AppDomain e si avvia un metodo con un parametro facoltativo usando IDispatch::Invoke senza specificare un valore per il parametro facoltativo, l'applicazione può arrestarsi in modo anomalo e viene visualizzato il messaggio di errore seguente:

L'Assistente debug gestito FatalExecutionEngineError ha rilevato un problema in xxx.exe. Informazioni aggiuntive: il runtime ha rilevato un errore irreversibile. L'indirizzo dell'errore si trovava in 0x0e888517, nel thread 0x20a8. Il codice di errore è 0xc0000005.

Motivo

.NET crea un handle GC interno nel primo AppDomain punto in cui viene eseguita la chiamata al metodo e riutilizza lo stesso handle GC interno per tutta la durata dell'applicazione indipendentemente dal quale AppDomain viene usata. Potrebbe verificarsi un arresto anomalo dell'applicazione se l'operazione AppDomain viene scaricata.

Soluzione

Per risolvere questo problema, implementare le modifiche condivise come esempio di codice:

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ITestInterface
{
    .
    .
}

Per farlo, segui questi passaggi:

  1. Applicare il livello IDispatchImplAttribute(IDispatchImplType.CompatibleImpl) di assembly per usare un'implementazione fornita ITypeInfo dal sistema operativo anziché . Implementazione di NET:

    [assembly:IDispatchImplAttribute(IDispatchImplType.CompatibleImpl)]
    

    In alternativa, è possibile applicare tale attributo a qualsiasi tipo a cui è necessario accedere tramite IDispatch.

  2. Modificare il tipo di interfaccia in modo che sia InterfaceIsDual, perché l'implementazione fornita ITypeInfo dal sistema operativo non supporta le interfacce dispatch pure.

  3. Rendere pubblica e visibile l'interfaccia a COM in modo che l'interfaccia venga effettivamente visualizzata nella libreria dei tipi e che il corrispondente typeinfo sia disponibile nella libreria dei tipi.