マネージ スレッドとアンマネージ スレッド

更新 : 2007 年 11 月

COM のコンポーネントは、アパートメントを使用してリソースへのアクセスを同期します。一方、マネージ オブジェクトは、同期された領域、ミューテックス、ロック、完了ポートなどの同期プリミティブ、および同期されたコンテキストを使用して、すべての共有リソースがスレッド セーフに使用されることを保証します。.NET スレッド モデルの詳細については、「マネージ スレッド処理」を参照してください。

相互運用性を確保するために、共通言語ランタイムは、COM オブジェクトを呼び出すときにアパートメントを作成し、初期化します。マネージ スレッドは、スレッドが 1 つだけ含まれているシングルスレッド アパートメント (STA) か、または 1 つ以上のスレッドが含まれているマルチスレッド アパートメント (MTA) を作成し、登録できます。COM のアパートメントと、スレッドが生成されているアパートメントに互換性があるときは、COM は、呼び出し元のスレッドが直接 COM オブジェクトを呼び出すのを許可します。アパートメントに互換性がない場合は、COM は互換性のあるアパートメントを作成し、その新しいアパートメントのプロキシを経由してすべての呼び出しをマーシャリングします。

ランタイムは、CoInitializeEx を呼び出して、COM アパートメントを MTA アパートメントまたは STA アパートメントとして初期化します。.NET Framework Version 2.0 では、スレッドを開始する前にアパートメントの状態が設定されていない場合、マネージ スレッドは MTA として初期化されます。スレッドを開始する前にアパートメントの状態を設定するには、SetApartmentState メソッドまたは TrySetApartmentState メソッドを使用します。

.NET Framework Version 2.0 では、エントリ ポイント プロシージャに STAThreadAttribute が適用されない場合、メイン アプリケーション スレッドは MTA として初期化されます。

メモ :

.NET Framework Version 1.0 と 1.1 では、System.Threading.ApartmentState プロパティを使用してスレッドを実行した後にアパートメントの状態を設定できたため、競合状態が発生しました。.NET Framework Version 2.0 では、これは許可されていません。

一部のプログラミング モデルでは、スレッドに対して STA プロパティを設定する必要があります。たとえば、Windows フォームでドラッグ アンド ドロップなどの要素を初期化するには、シングル スレッド アパートメントを作成し、登録します。

メモ :

プロキシおよびスタブと、タイプ ライブラリのいずれも登録されていない場合は、マネージ コードから COM オブジェクトを呼び出したときに InvalidCastException が発生する場合があります。

ApartmentState 列挙値を一覧し、対応する COM アパートメント初期化呼び出しを示す表を次に示します。

ApartmentState 列挙値

COM アパートメントの初期化

MTA

CoInitializeEx(NULL, COINIT_MULTITHREADED)

STA

CoIntializeEx(NULL, COINIT_APARTMENTTHREADED)

Unknown

CoInitializeEx(NULL, COINIT_MULTITHREADED)

COM オブジェクトとマネージ スレッドが互換性のないアパートメントである場合は、オブジェクトに対する呼び出しはすべて、COM によって作成されたプロキシを経由して実行されます。

参照

概念

.NET Framework への COM コンポーネントの公開

COM への .NET Framework コンポーネントの公開

その他の技術情報

高度な COM 相互運用性