System.Runtime.InteropServices.ComWrappers クラス

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

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

従来、ランタイムでは、マネージド オブジェクトへのネイティブ プロキシは COM 呼び出し可能ラッパー (CCW) と呼ばれ、ネイティブ オブジェクトへのマネージド プロキシはランタイム呼び出し可能ラッパー (RCW) と呼ばれます。 ただし、ここで使用する場合、これらの用語は、同じ名前 (つまり、CCW と RCW) の組み込み機能と混同しないでください。 組み込み機能とは異なり、正確な有効期間管理、メソッドのディスパッチ、引数と戻り値のマーシャリングの大部分は実装者に 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)示しています。 "IDENTITY" の概念は、次の規則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 実装者) によって実行されるものと見なされます。 マネージド プロキシにはオプションの厳密な参照 (つまりAddRef()) メンションがあります。これは、前にメンションシナリオ (3) をサポートするために使用されます。 以下を参照してください。CreateObjectFlags.TrackerObject このオプションの厳密な参照では、参照数は +2.