gcManagedToUnmanaged MDA

更新 : 2007 年 11 月

gcManagedToUnmanaged マネージ デバッグ アシスタント (MDA: Managed Debugging Assistant) は、マネージ コードからアンマネージ コードへのスレッド遷移時に、毎回ガベージ コレクションが行われるようにします。

症状

COM に公開されたマネージ オブジェクトの使用を試みると、アンマネージ ユーザー コンポーネントでアクセス違反がスローされます。COM オブジェクトは、解放済みであるかのように見えます。アクセス違反は、非確定的です。

原因

アンマネージ コンポーネントがマネージ COM オブジェクトを正しくカウントしている参照ではない場合、アンマネージ コンポーネントがそのオブジェクトに対する参照を引き続き保持しているときに、ランタイムで COM に公開されたマネージ オブジェクトを収集できるようになります。ランタイムは、ガベージ コレクション中に Release を呼び出します。そのため、ユーザー コンポーネントがガベージ コレクションの発生前にオブジェクトを使用する場合は、そのオブジェクトは収集されていないことになります。これが非確定的となる原因です。

解決策

このアシスタントを有効にすると、オブジェクトを収集できるようになってから Release が呼び出されるまでの時間が短縮されます。これは、収集されたオブジェクトに最初にアクセスしようとしたアンマネージ コンポーネントを追跡するのに役立ちます。

ランタイムへの影響

マネージ コードからアンマネージ コードへのスレッド遷移時に、必ずガベージ コレクションを発生させます。

出力

この MDA は、出力を生成しません。

構成

<mdaConfig>
  <assistants>
    <gcManagedToUnmanaged/>
  </assistants>
</mdaConfig>

参照

概念

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

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

参照

MarshalAsAttribute

gcUnmanagedToManaged MDA

その他の技術情報

相互運用性