コンテキスト間呼び出しのインターセプト
特定のコンテキストでオブジェクトがアクティブ化されると、コンテキスト内での後続の呼び出しは、コンテキスト境界を越えた呼び出しとは異なる方法で処理されます。 コンテキスト境界を越えた呼び出しは、軽量のプロキシで処理されます。 これらのプロキシは、呼び出し元を収容する環境から呼び出し先を収容する環境にランタイム環境を調整するのに必要なメディエーションをすべて処理します。 このプロセスはインターセプトと呼ばれます。
コンテキスト間呼び出しのインターセプトが必要なのは、異なるコンテキストのオブジェクトは実行時要件が異なるためです。これがまさにコンテキストの理由です。 COM+ は、メソッド パラメーターとして渡すオブジェクト参照をインターセプトし、新しいコンテキストで使用できるようにプロキシに自動的に変換します。
グローバル変数など、コンテキスト境界を越えてオブジェクト参照を共有する場合、必ず CoMarshalInterface と CoUnmarshalInterface を使用する必要があります。 これらの関数は、オブジェクト参照を別のコンテキストで使用できるプロキシに変換できます。 未加工のオブジェクト参照を、コンテキスト境界を越えて共有しないでください。
コンテキスト間呼び出しの動作は、マーシャリングできないインターフェイスを公開するオブジェクトの場合に望ましくない結果を招く可能性があります。 このような状況では、マーシャリングできないオブジェクトは呼び出し元のコンテキストでのみアクティブ化され、独自のコンテキストではアクティブ化されないと考えることもできます。 これを行うには、コンポーネントのプロパティ ページにある [アクティブ化] タブの [呼び出し元のコンテキストでアクティブ化する必要があります] オプションを選択します。 (詳しい手順については、「呼び出し元のコンテキストにおけるアクティブ化の適用」を参照)。
関連トピック