ランタイム呼び出し可能ラッパー
更新 : 2007 年 11 月
共通言語ランタイムは、ランタイム呼び出し可能ラッパー (RCW: Runtime Callable Wrapper) と呼ばれるプロキシを経由して COM オブジェクトを公開します。RCW は、.NET クライアントからは普通のオブジェクトのように見えますが、RCW の主な機能は、.NET クライアントと COM オブジェクト間の呼び出しをマーシャリングすることです。
ランタイムは、オブジェクトに存在する参照の数に関係なく、各 COM オブジェクトに 1 つの RCW を作成します。ランタイムは、各オブジェクトについてプロセスごとに 1 つの RCW を保持します。RCW をアプリケーション ドメインまたはアパートメントに作成し、別のアプリケーション ドメインまたはアパートメントへの参照を渡す場合は、最初のオブジェクトへのプロキシが使用されます。次の図に示すように、任意の数のマネージ クライアントが、INew インターフェイスおよび INewer インターフェイスを公開する COM オブジェクトへの参照を保持できます。
ランタイム呼び出し可能ラッパー経由の COM オブジェクト アクセス
ランタイムは、タイプ ライブラリから派生したメタデータを使用して、呼び出される COM オブジェクトとそのオブジェクトのためのラッパーを作成します。各 RCW は、RCW でラップした COM オブジェクトのインターフェイス ポインタのキャッシュを保持し、RCW が不要になった時点で COM オブジェクトの参照を解放します。ランタイムは、RCW に対してガベージ コレクションを実行します。
RCW は、他の目的にも利用されますが、ラップされたオブジェクトに代わって、マネージ コードとアンマネージ コード間のデータをマーシャリングします。つまり、クライアントとサーバーの間で異なる表現のデータを受け渡しする場合は、RCW は常にメソッドの引数とメソッドの戻り値をマーシャリングします。
標準のラッパーは、組み込みのマーシャリング規則を適用します。たとえば、.NET クライアントがアンマネージ オブジェクトに引数の一部として文字列型を渡すと、ラッパーはその文字列を BSTR 型に変換します。また、COM オブジェクトがマネージ呼び出し元に BSTR を返した場合、呼び出し元は文字列型を受け取ります。クライアントもサーバーも、それぞれが使い慣れたデータ型を使用して送信と受信を行うことができます。これ以外の型の場合、変換は不要になります。たとえば、4 バイト整数の場合、標準のラッパーは、型を変換せずに、マネージ コードとアンマネージ コードの間で常に 4 バイト整数を受け渡します。