COM は、いくつかの重要な点で .NET ランタイム オブジェクト モデルとは異なります。
COM オブジェクトのクライアントは、それらのオブジェクトの有効期間を管理する必要があります。共通言語ランタイムは、その環境内のオブジェクトの有効期間を管理します。
COM オブジェクトのクライアントは、そのサービスを提供するインターフェイスを要求し、インターフェイス ポインターを取得することで、サービスが使用可能かどうかを検出します。 .NET オブジェクトのクライアントは、リフレクションを使用してオブジェクトの機能の説明を取得できます。
NET オブジェクトは、.NET ランタイム実行環境によって管理されるメモリ内に存在します。 実行環境では、パフォーマンス上の理由からオブジェクトをメモリ内で移動し、移動するオブジェクトへのすべての参照を更新できます。 オブジェクトへのポインターを取得したアンマネージド クライアントは、オブジェクトに依存して同じ場所に残ります。 これらのクライアントには、場所が固定されていないオブジェクトを処理するためのメカニズムはありません。
これらの違いを克服するために、ランタイムは、マネージド クライアントとアンマネージド クライアントの両方がそれぞれの環境内でオブジェクトを呼び出していると考えるようにするラッパー クラスを提供します。 マネージド クライアントが COM オブジェクトのメソッドを呼び出すたびに、 ランタイムはランタイム呼び出し可能ラッパー (RCW) を作成します。 RCW は、特にマネージドとアンマネージドの参照メカニズムの違いを抽象化します。 また、ランタイムは COM 呼び出し可能ラッパー (CCW) を作成してプロセスを逆にし、COM クライアントが .NET オブジェクトのメソッドをシームレスに呼び出すこともできます。 次の図に示すように、呼び出し元のコードの観点によって、ランタイムが作成するラッパー クラスが決まります。
ほとんどの場合、ランタイムによって生成される標準の RCW または CCW は、COM と .NET ランタイムの間の境界を越える呼び出しに対して適切なマーシャリングを提供します。 カスタム属性を使用すると、必要に応じて、ランタイムがマネージド コードとアンマネージド コードを表す方法を調整できます。
こちらも参照ください
.NET