次の方法で共有


FatalExecutionEngineError は、複数の AppDomain と共に COM 呼び出しを実行するときに発生します

この記事は、コンポーネント オブジェクト モデル (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
{
    .
    .
}

この作業を行うには、次の手順に従ってください。

  1. アセンブリ レベルの IDispatchImplAttribute(IDispatchImplType.CompatibleImpl) を適用して、代わりにオペレーティング システム ITypeInfo 実装を使用します。NET の実装:

    [assembly:IDispatchImplAttribute(IDispatchImplType.CompatibleImpl)]
    

    または、 IDispatchを介してアクセスする必要がある任意の型にこのような属性を適用できます。

  2. InterfaceIsDual実装で提供されるオペレーティング システムでは純粋なディスパッチ インターフェイスがサポートされていないため、インターフェイスの種類をITypeInfoに変更します。

  3. インターフェイスが実際に型 lib に表示され、対応する typeinfo が型 lib で見つかるように、インターフェイスをパブリックにして COM に表示します。