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:
Wenden Sie die Assemblyebene an
IDispatchImplAttribute(IDispatchImplType.CompatibleImpl)
, um anstelle von eine vom Betriebssystem bereitgestellteITypeInfo
Implementierung zu verwenden. NET-Implementierung:[assembly:IDispatchImplAttribute(IDispatchImplType.CompatibleImpl)]
Alternativ können Sie ein solches Attribut auf alle Typen anwenden, auf die über
IDispatch
zugegriffen werden muss.Ändern Sie den Schnittstellentyp in
InterfaceIsDual
, da die vom Betriebssystem bereitgestellteITypeInfo
Implementierung keine reinen Dispatchschnittstellen unterstützt.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.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für