"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

Problembeschreibung

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

Managed Debugging Assistant FatalExecutionEngineError has detected a problem in xxx.exe. Zusätzliche Informationen: Für die Laufzeit ist ein schwerwiegender Fehler aufgetreten. The address of the error was at 0x0e888517, on thread 0x20a8. Der Fehlercode ist 0xc0000005.

Ursache

.NET erstellt an der ersten Stelle, an der der Methodenaufruf ausgeführt wird, ein internes AppDomain GC-Handle und verwendet den gleichen internen GC-Handle während der gesamten Lebensdauer der Anwendung, unabhängig davon, welche verwendet AppDomain wird. Es kann zu einem Anwendungsabbruch führen, wenn dies AppDomain entladen wird.

Problemumgehung

Um dieses Problem zu umgehen, implementieren Sie die als Codebeispiel freigegebenen Änderungen:

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

Gehen Sie dazu wie folgt vor:

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

    [assembly:IDispatchImplAttribute(IDispatchImplType.CompatibleImpl)]
    

    Sie können ein solches Attribut auch auf alle Typen anwenden, auf die über zugegriffen werden IDispatch muss.

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

  3. Machen Sie die Schnittstelle öffentlich und für COM sichtbar, sodass die Schnittstelle tatsächlich in der Typ-lib angezeigt wird und die entsprechende typeinfo in der Typ-LIB zu finden ist.