FatalExecutionEngineError tritt auf, wenn Sie COM-Aufrufe zusammen mit mehreren AppDomains ausführen

Dieser Artikel hilft Ihnen, das Problem zu beheben, bei dem ein FatalExecutionEngineError-Fehler ausgelöst werden kann, wenn Sie COM-Aufrufe (Component Object Model) zusammen mit mehreren AppDomains ausführen.

Ursprüngliche Produktversion: .NET Framework 4.5
Ursprüngliche KB-Nummer: 2997900

Symptome

Wenn Sie in einer ASP.NET Anwendung mehrere AppDomains erstellen und eine Methode mit einem optionalen Parameter mithilfe von IDispatch::Invoke starten, ohne einen Wert für den optionalen Parameter anzugeben, stürzt die Anwendung möglicherweise ab, und Sie erhalten die folgende Fehlermeldung:

Der Assistent für verwaltetes Debuggen FatalExecutionEngineError hat ein Problem in xxx.exe erkannt. Zusätzliche Informationen: Bei der Laufzeit ist ein schwerwiegender Fehler aufgetreten. Die Adresse des Fehlers befand sich bei 0x0e888517 im Thread 0x20a8. Der Fehlercode wird 0xc0000005.

Ursache

.NET erstellt ein internes GC-Handle in der ersten AppDomain Instanz, in der der Methodenaufruf erfolgt, und verwendet dasselbe interne GC-Handle während der gesamten Lebensdauer der Anwendung, unabhängig davon, welches AppDomain verwendet wird. Dies kann zu einem Anwendungsabsturz führen, wenn dieser AppDomain entladen wird.

Problemumgehung

Um dieses Problem zu umgehen, implementieren Sie die änderungen, die als Codebeispiel freigegeben wurden:

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

Gehen Sie dazu wie folgt vor:

  1. Wenden Sie die Assemblyebene an IDispatchImplAttribute(IDispatchImplType.CompatibleImpl) , um anstelle von eine vom Betriebssystem bereitgestellte ITypeInfo Implementierung zu verwenden. NET-Implementierung:

    [assembly:IDispatchImplAttribute(IDispatchImplType.CompatibleImpl)]
    

    Alternativ können Sie ein solches Attribut auf alle Typen anwenden, auf die über IDispatchzugegriffen werden muss.

  2. Ändern Sie den Schnittstellentyp in InterfaceIsDual, da die vom Betriebssystem bereitgestellte ITypeInfo Implementierung keine reinen Dispatchschnittstellen unterstützt.

  3. Machen Sie die Schnittstelle öffentlich und für COM sichtbar, sodass die Schnittstelle tatsächlich in der Typbibliothek angezeigt wird und die entsprechende typeinfo in der Typbibliothek gefunden werden kann.