System.Runtime.InteropServices.ComWrappers クラス
この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。
この ComWrappers API は、組み込みの COM 相互運用性のサポート IUnknown
とは無関係に、API のサポートを提供します。 この API は ComWrappers
、開発者が組み込みのバージョンを効率的に置き換えるために必要な最小限のランタイム サポートを公開します。
従来、ランタイムでは、マネージド オブジェクトへのネイティブ プロキシは 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)示しています。 "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
.
.NET