この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
ComWrappers API は、組み込みの COM 相互運用性のサポートとは無関係に、IUnknown
API のサポートを提供します。
ComWrappers
API は、開発者が組み込みのバージョンを効率的に置き換えるために必要な最小限のランタイム サポートを公開します。
従来、ランタイムでは、マネージド オブジェクトへのネイティブ プロキシは COM 呼び出し可能ラッパー (CCW) と呼ばれ、ネイティブ オブジェクトへのマネージド プロキシはランタイム呼び出し可能ラッパー (RCW) と呼ばれます。 ただし、ここで使用する場合、これらの用語は、同じ名前 ( つまり、CCW と RCW) の組み込み機能と混同しないでください。 組み込み機能とは異なり、正確な有効期間管理、ディスパッチ メソッド、引数と戻り値のマーシャリングの大部分は、 ComWrappers
実装者に任されます。
"最小限のサポート" は、次の機能によって定義されます。
- マネージド オブジェクトとネイティブ プロキシ (CCW など) の間の効率的なマッピング。
- ネイティブ
IUnknown
とそのマネージド プロキシ (RCW など) 間の効率的なマッピング。 - 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
になるでしょう。
.NET