COM+ コンテキスト
COM+ アプリケーション内で実行されている構成済みコンポーネントの場合、コンテキストは COM+ サービスが提供される基盤となります。 COM+では、コンテキストは、1 つ以上の COM オブジェクトに関連付けられ、それらのオブジェクトにサービスを提供するために使用される、ランタイム プロパティのセットとして定義されます。
COM+ では、すべての COM オブジェクトは実行時 (つまり、アクティブ化と非アクティブ化の間) に 1 つのコンテキストに関連付けられます。また、すべてのコンテキストは 1 つだけの COM アパートメント内に存在します。 複数のオブジェクトが同じコンテキスト内で実行でき、複数のコンテキストが同じアパートメント内に存在できます。 オブジェクトがアクティブになったときに初期化されるセキュリティ コンテキスト プロパティなどのコンテキスト プロパティは、オブジェクトの実行時のニーズを表します。
Note
COM+ サービスを使用しない未構成コンポーネントの場合、コンテキストはほとんどの場合無視されます。
COM+ は、コンテキスト プロパティを、ランタイム サービスを提供するための基礎として使用します。 これらのプロパティは、実行環境がコンテキスト内のオブジェクトに対してどのようにサービスを実行するかを決定する状態を保持します。 場合によっては、オブジェクトのコンテキスト プロパティと直接やり取りして、オブジェクトに対して提供されているサービスに関連する状態を示すことができます。 たとえば、自動トランザクションに参加しているオブジェクトがトランザクションの結果に投票するときに、これ行うことができます。
これらの概念の COM 基盤の詳細については、「プロセス、スレッド、およびアパートメント」を参照してください。
プログラムによるコンテキスト プロパティの操作
各コンテキストには、そのプロパティを追跡する ObjectContext オブジェクトが関連付けられています。 ObjectContext にアクセスするには、GetObjectContext 関数を呼び出します。 ObjectContext にアクセスしたら、公開されている IObjectContext インターフェイスでメソッドを呼び出して、コンテキスト プロパティを操作することができます。
たとえば、IObjectContext::SetComplete を呼び出すと、オブジェクトに関連付けられているコンテキストで、トランザクション整合性ビットが "consistent" に、JIT アクティベーションの完了ビットが "done" に設定されます。 "consistent" は、トランザクションのコミットに投票することを COM+ に通知し、"done" は、メソッドが戻ったときにオブジェクトを非アクティブ化する準備ができていることを示します。
IObjectContext に加えて、コンテキスト プロパティへのアクセスを提供するその他の特殊なインターフェイスには、IObjectContextInfo、IContextState、および IObjectContextActivity があります。 ISecurityCallContext も、ある程度、コンテキスト プロパティにアクセスします。 ISecurityCallContext は、IGetSecurityCallContext::GetSecurityCallContext を使用して取得することができます。
アクティブ化とインターセプトについて
一般に、コンテキストを考慮する必要があるのは、コンポーネントに COM+ サービスを提供するために使用される、設定または取得可能ないくつかのプロパティを表す場合に限られます。 ただし、状況によっては、コンテキストの次の 2 つの相互に関連する側面をより詳細に検討する必要がある場合があります。
- コンテキストのアクティブ化、または適切なコンテキストでのオブジェクトの初期化。
- インターセプト、またはコンテキスト境界を越えた呼び出しに対して COM+ が行う処理。
MTS コンテキスト ラッパーとの関係
コンテキストは、効果的に MTS のコンテキスト ラッパーに置き換わるものです。 作成要求をトラップして自動サービスを提供するというコンテキスト ラッパーの役割は、現在 COM+ の機能に統合されています。 このため、SafeRef 関数を使用する必要がなくなりました。 MTS では、SafeRef は、コンテキスト ラッパーの外部で渡すことができるオブジェクトへの参照を取得するために使用されていました。 COM+ では、これは不要です。通常のオブジェクト参照 (this ポインター) が機能します。