Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:
Applicare il livello
IDispatchImplAttribute(IDispatchImplType.CompatibleImpl)
di assembly per usare un'implementazione fornitaITypeInfo
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
.Modificare il tipo di interfaccia in modo che sia
InterfaceIsDual
, perché l'implementazione fornitaITypeInfo
dal sistema operativo non supporta le interfacce dispatch pure.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.