COM ラッパー
更新 : 2007 年 11 月
COM は、次のいくつかの重要な点で、.NET Framework オブジェクト モデルとは異なります。
COM オブジェクトのクライアントは、COM オブジェクトの有効期間を管理する必要があります。共通言語ランタイムはその環境でのオブジェクトの有効期間を管理します。
COM オブジェクトのクライアントは、サービスを提供するインターフェイスを要求し、インターフェイス ポインタを取得して、そのサービスが利用可能かどうかを確認します。.NET オブジェクトのクライアントは、リフレクションを使用してオブジェクトの機能の記述を取得できます。
.NET オブジェクトは、.NET Framework の実行環境によって管理されるメモリに常駐します。.NET Framework の実行環境では、パフォーマンス上の理由からオブジェクトをメモリ内で移動させることができ、移動するオブジェクトに合わせてすべての参照を更新できます。オブジェクトへのポインタを取得するアンマネージ クライアントは、そのオブジェクトに依存するので同じ場所にとどまります。アンマネージ クライアントには、場所が固定されていないオブジェクトを扱う機構が用意されていません。
このような相違を克服するために、ランタイムは、ラッパー クラスを用意して、マネージ クライアントとアンマネージ クライアントの両方がそれぞれの環境内でオブジェクトを呼び出していると認識するようにします。マネージ クライアントが COM オブジェクトのメソッドを呼び出すと、ランタイムがランタイム呼び出し可能ラッパー (RCW: Runtime Callable Wrapper) を作成します。RCW の主な役割は、マネージ参照機構とアンマネージ参照機構の相違を克服することです。また、ランタイムは、COM 呼び出し可能ラッパー (CCW: COM Callable Wrapper) を作成して、その逆のプロセスを使用し、COM クライアントがシームレスに .NET オブジェクトのメソッドを呼び出すことができるようにします。呼び出し元のコードと、ランタイムが作成するラッパー クラスの関係を示す図を次に示します。
COM ラッパーの概要
ほとんどの場合、ランタイムによって生成される標準の RCW または CCW は、COM と .NET Framework の境界をまたがる呼び出しに対して適切なマーシャリングを提供します。カスタム属性を使用することにより、オプションで、ランタイムがマネージ コードおよびアンマネージ コードを表現する方法を調整できます。