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

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 相互運用性