ライセンス認証コンテキスト
COM+ では、すべての COM オブジェクトが関連付けられたコンテキストで作成されます。 つまり、新しいコンテキストを作成して初期化するか、適切な既存のコンテキストを使用する必要があります。 このプロセスはアクティブ化と 呼ばれます。 COM+ では、オブジェクトは独自のコンテキストまたは作成者のコンテキスト (たとえば、CoCreateInstance を呼び出すことによって、オブジェクトのアクティブ化を要求したオブジェクト) でアクティブ化されます。
オブジェクト プールなど、状況によっては、最初から作成されずにオブジェクトがアクティブ化されます。 この場合、実行中のインスタンスはコンテキスト内でアクティブ化されます。 有効期間の間、さまざまなコンテキストで繰り返しアクティブ化される可能性があります。
基本的なメカニズムはどちらの場合も同じです。オブジェクトはコンテキストに関連付けられています。コンテキストは、オブジェクトの実行時のニーズを表すために適切に初期化されます。
コンテキスト プロパティの使用
別のオブジェクトからの作成要求に応答してオブジェクトがアクティブ化されている場合、COM+ は、ダウンストリーム オブジェクトを適切にアクティブ化するために、オブジェクト間を仲介する必要があります。 COM+ は、呼び出し元のコンテキストと呼び出されたコンポーネントの構成を比較し、ダウンストリーム コンポーネントをアクティブ化する場所とそのコンテキスト プロパティを初期化する方法を決定する必要があります。
コンポーネントの構成を検出するために、COM+ は、非常に高速な実行時参照用に最適化された COM+ クラス登録データベースでそれを検索します。 (これは、COM+ アプリケーションにコンポーネントをインストールするときにコンポーネントを構成した方法によって決まります)。その後、コンポーネントの構成は、呼び出し元のコンテキスト プロパティの状態に対して調べられます。
場合によっては、構成は呼び出し元のコンテキストと一致し、コンポーネントは呼び出し元のコンテキスト内でアクティブ化できます。 これは、呼び出し元のコンテキストが新しいオブジェクトのすべての実行時要件を満たしている場合にのみ発生します。
呼び出し元のコンテキスト内でダウンストリーム コンポーネントをアクティブ化できない場合は、適切なアパートメント内の独自のコンテキストでアクティブ化されます。 この場合、特定のコンテキスト プロパティが呼び出し元から呼び出し先に流れる場合があります。 たとえば、呼び出し元がトランザクションに関連付けられている場合、呼び出し先がトランザクションをサポートしている場合、新しいオブジェクトは独自のコンテキストを取得し (トランザクションで投票するには、独自の一貫性のあるフラグが必要です)、呼び出し元のトランザクション ID とアクティビティ ID (同じトランザクションと同期内に存在する) を継承しますメイン。
無視されたコンテキスト プロパティ
コンポーネントの構成方法によっては、一部のコンテキスト プロパティは、作成者のコンテキストまたは独自のコンテキストでアクティブ化されているかどうかを判断する際に役立たない場合があります。 たとえば、[トランザクションの無効化] と [同期が無効] の設定は、トランザクションまたは同期の存在を示しますメインコンポーネントのアクティブ化では何の役割も果たしません。 これらのプロパティは、コンテキストがフローされるときに基本的に無視されます。 または、コンポーネントがプロセス レベルのアクセスチェックのみを使用する場合、そのセキュリティ コンテキスト プロパティは無視されます。コンポーネントのセキュリティ構成は、アクティブ化で役割を果たしません。
呼び出し元のコンテキストでのアクティブ化の強制
状況によっては、オブジェクトを呼び出し元のコンテキストでのみアクティブ化することが必要な場合があります。つまり、独自のコンテキストではアクティブ化されません。 たとえば、コンテキスト境界を越えて呼び出されたときのオブジェクトの動作を制御できます。
コンポーネント サービス管理ツールを使用して、[コンポーネントのプロパティ] ページの [アクティブ化] タブで [呼び出し元コンテキストでアクティブ化する必要があります] オプションを選択することで、オブジェクトを独自のコンテキストでアクティブ化できないようにすることができます。 (「 詳細な手順については、呼び出し元のコンテキスト でアクティブ化を適用します)。)このオプションを選択すると、呼び出し元のコンテキストでオブジェクトをアクティブ化できない場合、 CoCreateInstance は失敗し、CO_E_ATTEMPT_TO_CREATE_OUTSIDE_CLIENT_CONTEXTが返されます。
既定のコンテキスト
既定のコンテキストは、未構成のコンポーネントをサポートするために存在します。つまり、COM コンポーネントは COM+ アプリケーションにインストールされず、COM+ クラス登録データベースには登録されません。 構成されていないコンポーネントに互換性のあるスレッド モデルがある場合は、呼び出し元のコンテキストでアクティブ化されます。 それ以外の場合は、適切なアパートメントの既定のコンテキストでアクティブ化されます。 各アパートメントには、COM+ サービスを使用しない COM オブジェクトをサポートするための既定のコンテキストがあります。
フックのアクティブ化
IObjectControl::Activate と IObjectControl::D eactivate を実装することで、アクティブ化と非アクティブ化をフックして、新しいコンテキストで特別な初期化を実行できます。 これらのメソッドは、オブジェクトが JIT アクティブ化またはオブジェクト プールを使用するように構成されている場合、オブジェクトのライフサイクル内の特定の時点で COM+ によって呼び出されます。 詳細については、「 COM+ Just-In-Time Activation 」および 「COM+ Object Pooling 」を参照してください。
関連トピック