Класс System.Runtime.InteropServices.ComWrappers

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

API ComWrappers обеспечивает поддержку IUnknown API независимо от встроенной поддержки взаимодействия COM. ComWrappers API предоставляет минимальную поддержку среды выполнения, необходимую разработчикам для эффективной замены встроенной версии.

Традиционно в среде выполнения собственный прокси-сервер для управляемого объекта называется вызываемой оболочкой 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.