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

共通言語ランタイムは、ランタイム呼び出し可能ラッパー (RCW) と呼ばれるプロキシを介して COM オブジェクトを公開します。The common language runtime exposes COM objects through a proxy called the runtime callable wrapper (RCW). .NET クライアントでは RCW が普通のオブジェクトとして示されますが、その主な機能は、.NET クライアントと COM オブジェクトの間で呼び出しをマーシャリングすることです。Although the RCW appears to be an ordinary object to .NET clients, its primary function is to marshal calls between a .NET client and a COM object.

ランタイムは、COM オブジェクトごとに 1 つの RCW を、そのオブジェクトに存在する参照の数に関係なく作成します。The runtime creates exactly one RCW for each COM object, regardless of the number of references that exist on that object. ランタイムは、各オブジェクトで、プロセスごとに 1 つの RCW を保持します。The runtime maintains a single RCW per process for each object. 1 つのアプリケーション ドメインまたはアパートメントで RCW を作成し、別のアプリケーション ドメインまたはアパートメントへの参照を渡すと、最初のオブジェクトへのプロキシが使用されます。If you create an RCW in one application domain or apartment, and then pass a reference to another application domain or apartment, a proxy to the first object will be used. 次の図が示すように、任意の数のマネージド クライアントが、INew および INewer のインターフェイスを公開する COM オブジェクトへの参照を保持できます。As the following illustration shows, any number of managed clients can hold a reference to the COM objects that expose INew and INewer interfaces.

次の図は、ランタイム呼び出し可能ラッパー経由で COM オブジェクトにアクセスするプロセスを示しています。The following image shows the process for accessing COM objects through the runtime callable wrapper:

RCW 経由で COM オブジェクトにアクセスするプロセス。

ランタイムは、タイプ ライブラリから派生したメタデータを使用して、呼び出される COM オブジェクトとそのオブジェクトのラッパーの両方を作成します。Using metadata derived from a type library, the runtime creates both the COM object being called and a wrapper for that object. 各 RCW は、ラップする COM オブジェクトでインターフェイス ポインターのキャッシュを保持し、RCW が不要になった時点で、COM オブジェクトでのその参照を解放します。Each RCW maintains a cache of interface pointers on the COM object it wraps and releases its reference on the COM object when the RCW is no longer needed. ランタイムは、RCW でのガベージ コレクションを実行します。The runtime performs garbage collection on the RCW.

RCW は、他のさまざまなアクティビティも実行しますが、ラップされたオブジェクトのために、マネージド コードとアンマネージド コードの間でデータをマーシャリングします。Among other activities, the RCW marshals data between managed and unmanaged code, on behalf of the wrapped object. 具体的には、RCW はクライアントとサーバーの間でデータの異なる表現が渡されるとき、常にメソッド引数やメソッドの戻り値のマーシャリングを提供します。Specifically, the RCW provides marshaling for method arguments and method return values whenever the client and server have different representations of the data passed between them.

標準ラッパーは、組み込みのマーシャリング規則を適用します。The standard wrapper enforces built-in marshaling rules. たとえば、.NET クライアントが文字列型を引数の一部としてアンマネージ オブジェクトに渡すとき、ラッパーは文字列を BSTR 型に変換します。For example, when a .NET client passes a String type as part of an argument to an unmanaged object, the wrapper converts the string to a BSTR type. COM オブジェクトが、マネージド呼び出し元に BSTR を返す場合、呼び出し元は文字列を受信します。Should the COM object return a BSTR to its managed caller, the caller receives a String. クライアントとサーバーはどちらも、それぞれが使い慣れているデータを送受信します。Both the client and the server send and receive data that is familiar to them. その他の型は、変換する必要がありません。Other types require no conversion. たとえば、標準的なラッパーはマネージド コードとアンマネージド コードの間で、型を変換しないで 4 バイトの整数を常に受け渡しします。For instance, a standard wrapper will always pass a 4-byte integer between managed and unmanaged code without converting the type.

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

ランタイム呼び出し可能ラッパー (RCW) の主な目標は、マネージドとアンマネージドのプログラミング モデルの違いを見えなくすることです。The primary goal of the runtime callable wrapper (RCW) is to hide the differences between the managed and unmanaged programming models. 次の図に示すように、RCW は選択された COM インターフェイスを .NET クライアントに公開することなく使用して、シームレスな移行を実現します。To create a seamless transition, the RCW consumes selected COM interfaces without exposing them to the .NET client, as shown in the following illustration.

次の図は、COM インターフェイスとランタイム呼び出し可能ラッパーを示しています。The following image shows COM interfaces and the runtime callable wrapper:

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

事前バインディングされたオブジェクトとして作成されると、RCW は特定の型になります。When created as an early-bound object, the RCW is a specific type. これは、COM オブジェクトが実装するインターフェイスを実装し、オブジェクトのインターフェイスからのメソッド、プロパティ、およびイベントを公開します。It implements the interfaces that the COM object implements and exposes the methods, properties, and events from the object's interfaces. 図では、RCW は INew インターフェイスを公開しますが、IUnknownIDispatch インターフェイスを使用します。In the illustration, the RCW exposes the INew interface but consumes the IUnknown and IDispatch interfaces. さらに、RCW は、INew インターフェイスのすべてのメンバーを .NET クライアントに公開します。Further, the RCW exposes all members of the INew interface to the .NET client.

RCW は、それがラップするオブジェクトによって公開されている、次の表にリストされたインターフェイスを使用します。The RCW consumes the interfaces listed in the following table, which are exposed by the object it wraps.

InterfaceInterface 説明Description
IDispatchIDispatch リフレクションによる COM オブジェクトへの遅延バインディングのために使用します。For late binding to COM objects through reflection.
IErrorInfoIErrorInfo エラー、そのソース、ヘルプ ファイル、ヘルプ コンテキスト、およびエラーを定義したインターフェイスの GUID (.NET クラスでは常に GUID_NULL) に関する説明文を示します。Provides a textual description of the error, its source, a Help file, Help context, and the GUID of the interface that defined the error (always GUID_NULL for .NET classes).
IProvideClassInfoIProvideClassInfo ラップされている COM オブジェクトが IProvideClassInfo を実装する場合、RCW はこのインターフェイスから型情報を抽出して、より優れた型 ID を提供します。If the COM object being wrapped implements IProvideClassInfo, the RCW extracts the type information from this interface to provide better type identity.
IUnknownIUnknown オブジェクト ID、強制型変換、および有効期間管理のために使用します。For object identity, type coercion, and lifetime management:

- オブジェクト ID- Object identity
ランタイムは、各オブジェクトの IUnknown インターフェイスの値を比較することによって、複数の COM オブジェクトを区別します。The runtime distinguishes between COM objects by comparing the value of the IUnknown interface for each object.
- 強制型変換- Type coercion
RCW は、QueryInterface メソッドによって実行される、動的な型の探索を認識します。The RCW recognizes the dynamic type discovery performed by the QueryInterface method.
- 有効期間管理- Lifetime management
RCW は QueryInterface メソッドを使用して、アンマネージ オブジェクトへの参照を取得し、ランタイムがラッパーでガベージ コレクションを実行してアンマネージ オブジェクトが解放されるまでその参照を保持します。Using the QueryInterface method, the RCW gets and holds a reference to an unmanaged object until the runtime performs garbage collection on the wrapper, which releases the unmanaged object.

必要に応じて、RCW はそれがラップするオブジェクトによって公開されている、次の表にリストされたインターフェイスを使用することもできます。The RCW optionally consumes the interfaces listed in the following table, which are exposed by the object it wraps.

InterfaceInterface 説明Description
IConnectionPointIConnectionPointContainerIConnectionPoint and IConnectionPointContainer RCW は、接続ポイントのイベント スタイルを公開するオブジェクトを、デリゲート ベースのイベントに変換します。The RCW converts objects that expose the connection-point event style to delegate-based events.
IDispatchExIDispatchEx クラスが IDispatchEx を実装する場合、RCW は IExpando を実装します。If the class implements IDispatchEx, the RCW implements IExpando. IDispatchEx インターフェイスは、IDispatch インターフェイスの拡張版で、IDispatch とは異なり、列挙、追加、削除、および大文字小文字を区別したメンバーの呼び出しが可能になります。The IDispatchEx interface is an extension of the IDispatch interface that, unlike IDispatch, enables enumeration, addition, deletion, and case-sensitive calling of members.
IEnumVARIANTIEnumVARIANT 列挙をサポートする COM 型がコレクションとして扱われることを可能にします。Enables COM types that support enumerations to be treated as collections.

関連項目See also