disconnectedContext MDA

更新 : 2007 年 11 月

CLR が COM オブジェクトに関する要求を処理中に、切断されたアパートメントまたはコンテキストへ遷移しようとすると、disconnectedContext マネージ デバッグ アシスタント (MDA: Managed Debugging Assistant) がアクティブ化されます。

症状

ランタイム呼び出し可能ラッパー (RCW) 上で行われた呼び出しは、その呼び出しが存在するアパートメントまたはコンテキストではなく、現在のアパートメントまたはコンテキストにおいて、基になる COM コンポーネントへ伝達されます。これが原因で、シングルスレッド アパートメント (STA) コンポーネントのように COM コンポーネントがマルチスレッド化されていない場合に、破損やデータ損失が発生することがあります。一方、RCW 自体がプロキシである場合、呼び出しによって、COMException がスローされ、RPC_E_WRONG_THREAD が HRESULT になることがあります。

原因

OLE アパートメントまたはコンテキストは、CLR が遷移を試みたときに、既にシャットダウンしています。ほとんどの場合、STA アパートメントが所有しているすべての COM コンポーネントが完全に解放される前に、その STA アパートメントがシャットダウンしていることが原因です。これは、RCW 上でユーザー コードから明示的に呼び出しを行った結果として発生することがあります。また、たとえば、関連付けられた RCW が既にガベージ コレクションされているのに CLR が COM コンポーネントを解放しているときなど、CLR 自体が COM コンポーネントを操作しているために発生することもあります。

解決策

この問題を回避するには、アパートメント内のすべての有効なオブジェクトでアプリケーションが終了してから、STA を所有するスレッドを終了するようにします。同様のことがコンテキストにも適用されます。コンテキスト内の有効な COM コンポーネントでアプリケーションが完全に終了してから、コンテキストをシャットダウンするようにします。

ランタイムへの影響

この MDA は、CLR への影響はありません。切断されたコンテキストに関するデータを報告するだけです。

出力

切断されたアパートメントまたはコンテキストのコンテキスト Cookie を報告します。

構成

<mdaConfig>
  <assistants>
    <disconnectedContext enable="false" />
  </assistants>
</mdaConfig>

参照

概念

マネージ デバッグ アシスタントによるエラーの診断

相互運用マーシャリングの概要

参照

MarshalAsAttribute

その他の技術情報

相互運用性