次の方法で共有


ランタイム呼び出し可能ラッパー

共通言語ランタイムは、ランタイム呼び出し可能ラッパー (RCW) と呼ばれるプロキシを介して COM オブジェクトを公開します。 RCW は .NET クライアントの通常のオブジェクトのように見えますが、その主な機能は、.NET クライアントと COM オブジェクトの間の呼び出しをマーシャリングすることです。

ランタイムは、そのオブジェクトに存在する参照の数に関係なく、COM オブジェクトごとに 1 つの RCW を作成します。 ランタイムは、各オブジェクトのプロセスごとに 1 つの RCW を保持します。 あるアプリケーション ドメインまたはアパートメントに RCW を作成し、別のアプリケーション ドメインまたはアパートメントへの参照を渡すと、最初のオブジェクトへのプロキシが使用されます。 このプロキシは新しいマネージド オブジェクトであり、初期 RCW と同じではないことに注意してください。これは、2 つのマネージド オブジェクトが等しくないが、同じ COM オブジェクトを表していることを意味します。 次の図に示すように、任意の数のマネージド クライアントが、 INew および INewer インターフェイスを公開する COM オブジェクトへの参照を保持できます。

次の図は、ランタイム呼び出し可能ラッパーを介して COM オブジェクトにアクセスするプロセスを示しています。

RCW を介して COM オブジェクトにアクセスするためのプロセス。

ランタイムは、タイプ ライブラリから派生したメタデータを使用して、呼び出される COM オブジェクトとそのオブジェクトのラッパーの両方を作成します。 各 RCW は、ラップする COM オブジェクト上のインターフェイス ポインターのキャッシュを保持し、RCW が不要になったときに COM オブジェクトの参照を解放します。 ランタイムは、RCW でのガベージ コレクションを実行します。

他のアクティビティの中でも、RCW はラップされたオブジェクトに代わって、マネージド コードとアンマネージド コードの間でデータをマーシャリングします。 具体的には、RCW は、クライアントとサーバーの間で渡されるデータの表現が異なる場合に、メソッド引数とメソッドの戻り値のマーシャリングを提供します。

標準ラッパーは、組み込みのマーシャリング規則を適用します。 たとえば、.NET クライアントが引数の一部として string 型をアンマネージ オブジェクトに渡すと、ラッパーは stringBSTR 型に変換します。 COM オブジェクトがマネージド呼び出し元に BSTR を返した場合、呼び出し元は stringを受け取ります。 クライアントとサーバーの両方で、使い慣れたデータを送受信します。 その他の型では、変換は必要ありません。 たとえば、標準ラッパーは、型を変換せずに、マネージド コードとアンマネージド コードの間で常に 4 バイトの整数を渡します。

選択したインターフェイスのマーシャリング

ランタイム呼び出し可能ラッパー (RCW) の主な目的は、マネージド プログラミング モデルとアンマネージド プログラミング モデルの違いを非表示にすることです。 シームレスな切り替えを作成するために、RCW は、次の図に示すように、選択した COM インターフェイスを .NET クライアントに公開せずに使用します。

次の図は、COM インターフェイスとランタイム呼び出し可能ラッパーを示しています。

インターフェイスを含むランタイム呼び出し可能ラッパーのスクリーンショット。

事前バインド されたオブジェクトとして作成された場合、RCW は特定の型です。 COM オブジェクトが実装するインターフェイスを実装し、オブジェクトのインターフェイスからメソッド、プロパティ、およびイベントを公開します。 この図では、RCW は INew インターフェイスを公開していますが、 IUnknown インターフェイスと IDispatch インターフェイスを使用しています。 さらに、RCW は INew インターフェイスのすべてのメンバーを .NET クライアントに公開します。

RCW は、それがラップするオブジェクトによって公開されている、次の表にリストされたインターフェイスを使用します。

インターフェイス 説明
IDispatch リフレクションによる COM オブジェクトへの遅延バインディングの場合。
IErrorInfo エラー、そのソース、ヘルプ ファイル、ヘルプ コンテキスト、およびエラーを定義したインターフェイスの GUID (.NET クラスの場合は常に GUID_NULL ) のテキスト説明を提供します。
IProvideClassInfo ラップされている COM オブジェクトが IProvideClassInfo を実装している場合、RCW はこのインターフェイスから型情報を抽出して、より適切な型 ID を提供します。
の IUnknown オブジェクト ID、強制型変換、および有効期間管理のために使用します。

- オブジェクト ID
ランタイムは、各オブジェクトの IUnknown インターフェイスの値を比較することで、COM オブジェクトを区別します。
- 強制型変換
RCW は 、QueryInterface メソッドによって実行される動的な型検出を認識します。
- 有効期間管理
QueryInterface メソッドを使用すると、ランタイムがラッパーでガベージ コレクションを実行し、アンマネージ オブジェクトを解放するまで、RCW はアンマネージ オブジェクトへの参照を取得および保持します。

必要に応じて、RCW はそれがラップするオブジェクトによって公開されている、次の表にリストされたインターフェイスを使用することもできます。

インターフェイス 説明
IConnectionPointIConnectionPointContainer RCW は、コネクション ポイント イベント スタイルを公開するオブジェクトをデリゲート ベースのイベントに変換します。
IDispatchEx (.NET Framework のみ) クラスが IDispatchEx を実装する場合、RCW は IExpando を実装します。 IDispatchEx インターフェイスは IDispatch インターフェイスの拡張機能であり、IDispatch とは異なり、メンバーの列挙、追加、削除、および大文字と小文字を区別する呼び出しを有効にします。
IEnumVARIANT 列挙型をサポートする COM 型をコレクションとして扱うことができるようにします。

こちらも参照ください