この記事は、コンポーネント オブジェクト モデル (COM) 呼び出しを複数の AppDomain と共に実行すると、 FatalExecutionEngineError エラーがスローされる可能性がある問題を解決するのに役立ちます。
元の製品バージョン: .NET Framework 4.5
元の KB 番号: 2997900
症状
ASP.NET アプリケーションでは、複数の AppDomain を作成し、省略可能なパラメーターの値を指定せずに IDispatch::Invoke
を使用して省略可能なパラメーターを使用してメソッドを開始すると、アプリケーションがクラッシュし、次のエラー メッセージが表示されることがあります。
Managed Debugging Assistant FatalExecutionEngineError で、xxx.exeで問題が検出されました。 追加情報: ランタイムで致命的なエラーが発生しました。 エラーのアドレスは、スレッド 0x20a8の0x0e888517でした。 エラー コードは0xc0000005。
原因
.NET は、メソッド呼び出しが行われる最初の AppDomain
に内部 GC ハンドルを作成し、使用されている AppDomain
に関係なく、アプリケーションの有効期間全体で同じ内部 GC ハンドルを再利用します。 この AppDomain
がアンロードされると、アプリケーションがクラッシュする可能性があります。
対処法
この問題を回避するには、コード例として共有されている変更を実装します。
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ITestInterface
{
.
.
}
この作業を行うには、次の手順に従ってください。
アセンブリ レベルの
IDispatchImplAttribute(IDispatchImplType.CompatibleImpl)
を適用して、代わりにオペレーティング システムITypeInfo
実装を使用します。NET の実装:[assembly:IDispatchImplAttribute(IDispatchImplType.CompatibleImpl)]
または、
IDispatch
を介してアクセスする必要がある任意の型にこのような属性を適用できます。InterfaceIsDual
実装で提供されるオペレーティング システムでは純粋なディスパッチ インターフェイスがサポートされていないため、インターフェイスの種類をITypeInfo
に変更します。インターフェイスが実際に型 lib に表示され、対応する
typeinfo
が型 lib で見つかるように、インターフェイスをパブリックにして COM に表示します。