共通言語ランタイムは、ランタイム呼び出し可能ラッパー (RCW) と呼ばれるプロキシを介して COM オブジェクトを公開します。 RCW は .NET クライアントの通常のオブジェクトのように見えますが、その主な機能は、.NET クライアントと COM オブジェクトの間の呼び出しをマーシャリングすることです。
ランタイムは、そのオブジェクトに存在する参照の数に関係なく、COM オブジェクトごとに 1 つの RCW を作成します。 ランタイムは、各オブジェクトのプロセスごとに 1 つの RCW を保持します。 あるアプリケーション ドメインまたはアパートメントに RCW を作成し、別のアプリケーション ドメインまたはアパートメントへの参照を渡すと、最初のオブジェクトへのプロキシが使用されます。 このプロキシは新しいマネージド オブジェクトであり、初期 RCW と同じではないことに注意してください。これは、2 つのマネージド オブジェクトが等しくないが、同じ COM オブジェクトを表していることを意味します。 次の図に示すように、任意の数のマネージド クライアントが、 INew
および INewer
インターフェイスを公開する COM オブジェクトへの参照を保持できます。
次の図は、ランタイム呼び出し可能ラッパーを介して COM オブジェクトにアクセスするプロセスを示しています。
ランタイムは、タイプ ライブラリから派生したメタデータを使用して、呼び出される COM オブジェクトとそのオブジェクトのラッパーの両方を作成します。 各 RCW は、ラップする COM オブジェクト上のインターフェイス ポインターのキャッシュを保持し、RCW が不要になったときに COM オブジェクトの参照を解放します。 ランタイムは、RCW でのガベージ コレクションを実行します。
他のアクティビティの中でも、RCW はラップされたオブジェクトに代わって、マネージド コードとアンマネージド コードの間でデータをマーシャリングします。 具体的には、RCW は、クライアントとサーバーの間で渡されるデータの表現が異なる場合に、メソッド引数とメソッドの戻り値のマーシャリングを提供します。
標準ラッパーは、組み込みのマーシャリング規則を適用します。 たとえば、.NET クライアントが引数の一部として string
型をアンマネージ オブジェクトに渡すと、ラッパーは string
を BSTR
型に変換します。 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 はそれがラップするオブジェクトによって公開されている、次の表にリストされたインターフェイスを使用することもできます。
インターフェイス | 説明 |
---|---|
IConnectionPoint と IConnectionPointContainer | RCW は、コネクション ポイント イベント スタイルを公開するオブジェクトをデリゲート ベースのイベントに変換します。 |
IDispatchEx (.NET Framework のみ) | クラスが IDispatchEx を実装する場合、RCW は IExpando を実装します。 IDispatchEx インターフェイスは IDispatch インターフェイスの拡張機能であり、IDispatch とは異なり、メンバーの列挙、追加、削除、および大文字と小文字を区別する呼び出しを有効にします。 |
IEnumVARIANT | 列挙型をサポートする COM 型をコレクションとして扱うことができるようにします。 |
こちらも参照ください
.NET