次の方法で共有


System.Runtime.InteropServices.ComWrappers クラス

この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。

ComWrappers API は、組み込みの COM 相互運用性のサポートとは無関係に、IUnknown API のサポートを提供します。 ComWrappers API は、開発者が組み込みのバージョンを効率的に置き換えるために必要な最小限のランタイム サポートを公開します。

従来、ランタイムでは、マネージド オブジェクトへのネイティブ プロキシは COM 呼び出し可能ラッパー (CCW) と呼ばれ、ネイティブ オブジェクトへのマネージド プロキシはランタイム呼び出し可能ラッパー (RCW) と呼ばれます。 ただし、ここで使用する場合、これらの用語は、同じ名前 ( つまり、CCWRCW) の組み込み機能と混同しないでください。 組み込み機能とは異なり、正確な有効期間管理、ディスパッチ メソッド、引数と戻り値のマーシャリングの大部分は、 ComWrappers 実装者に任されます。

"最小限のサポート" は、次の機能によって定義されます。

  1. マネージド オブジェクトとネイティブ プロキシ (CCW など) の間の効率的なマッピング。
  2. ネイティブ IUnknown とそのマネージド プロキシ (RCW など) 間の効率的なマッピング。
  3. IReferenceTrackerHost インターフェイス コントラクトを介したガベージ コレクターとの統合。

これを活用することは高度なシナリオです。

プロキシの状態

このセクションでは、それぞれの作成後のネイティブおよびマネージド プロキシの状態について説明し、図を示します。

次の図では、強い参照が実線 (===) として示され、弱参照は破線 (= = =) として示されています。 "厳密な参照" と "弱い参照" という用語は、特定の実装を表すのではなく、"有効期間を延長する" および "有効期間を延長しない" と解釈する必要があります。

次の図は、 ComWrappers.GetOrCreateComInterfaceForObject(Object, CreateComInterfaceFlags)の呼び出し後のマネージド オブジェクトとネイティブ プロキシの状態を示しています。

 --------------------                  ----------------------
|   Managed object   |                |     Native proxy     |
|                    |                | Ref count: 1         |
|  ----------------  |                |  ------------------  |
| | Weak reference |=| = = = = = = = >| | Strong reference | |
| |    to proxy    | |<===============|=|    to object     | |
|  ----------------  |                |  ------------------  |
 --------------------                  ----------------------

次の図は、 ComWrappers.GetOrCreateObjectForComInstance(IntPtr, CreateObjectFlags)の呼び出し後のネイティブ オブジェクトとマネージド プロキシの状態を示しています。 "id" の概念は、IUnknownの規則に従います。

 ------------------               ------------------
|  Native object   |< = = = = = =|                  |
| Ref count: +1    |             | Mapping from     |
 ------------------              | native identity  |
 ------------------------        | to managed proxy |
|   Managed proxy        |< = = =|                  |
| Created by ComWrappers |        ------------------
|   implementer.        |
| Optional AddRef() on   |
|   native object.      |
 ------------------------

ランタイムの観点から弱い参照のみが存在することを確認します。 ネイティブ オブジェクトの +1 参照カウントは、ネイティブ オブジェクトとそのマネージド プロキシの間の関連する有効期間を確保するために、マネージド プロキシ作成者 (つまり、 ComWrappers 実装者) によって実行されるものと見なされます。 マネージド プロキシには、前述のシナリオ (3) をサポートするために使用される、オプションの強参照 (つまり、AddRef()) があります。 CreateObjectFlags.TrackerObjectを参照してください。 このオプションの厳密な参照がある場合、参照カウントは+2になるでしょう。