Поделиться через


Вызываемая оболочка среды выполнения

Среда CLR предоставляет COM-объекты через прокси-сервер, называемый вызываемой оболочкой среды выполнения (RCW). Хотя RCW, как представляется, является обычным объектом для клиентов .NET, его основная функция — осуществлять маршалинг вызовов между клиентом .NET и COM-объектом.

Среда выполнения создает ровно один RCW для каждого COM-объекта независимо от количества ссылок, существующих в этом объекте. Среда выполнения поддерживает один RCW на процесс для каждого объекта. Если вы создаете RCW в одном домене приложения или квартире, а затем передаете ссылку на другой домен приложения или квартиру, будет использоваться прокси-сервер к первому объекту. Обратите внимание, что этот прокси-сервер является новым управляемым объектом, а не таким же, как и начальный RCW; Это означает, что два управляемых объекта не равны, но представляют один и тот же COM-объект. Как показано на следующем рисунке, любое количество управляемых клиентов может содержать ссылку на COM-объекты, предоставляющие INew и INewer интерфейсы.

На следующем рисунке показан процесс доступа к COM-объектам через вызываемую оболочку среды выполнения:

Процесс доступа к COM-объектам через RCW.

Используя метаданные, производные от библиотеки типов, среда выполнения создает вызываемый объект COM и оболочку для этого объекта. Каждый RCW поддерживает кэш указателей интерфейса на COM-объекте, который он оборачивает, и освобождает ссылку на COM-объект, когда RCW больше не требуется. Среда выполнения выполняет сборку мусора для RCW.

Среди других действий маршалирует данные RCW между управляемым и неуправляемым кодом от имени упаковаемого объекта. В частности, RCW обеспечивает маршалирование для аргументов метода и возвращаемых значений метода, когда клиент и сервер имеют различные представления данных, передаваемых между ними.

Стандартная оболочка применяет встроенные правила маршаллинга. Например, когда клиент .NET передает тип string как часть аргумента неуправляемому объекту, оболочка преобразует string в тип BSTR. Если COM-объект возвращает объект BSTR своему управляемому вызывающему, тот получает объект string. Клиент и сервер отправляют и получают данные, знакомые им. Другие типы не требуют преобразования. Например, стандартная оболочка всегда передает целое число 4-байтов между управляемым и неуправляемым кодом без преобразования типа.

Маршаллирование выбранных интерфейсов

Основной целью вызываемой оболочки среды выполнения является скрытие различий между управляемыми и неуправляемыми моделями программирования. Чтобы создать простой переход, RCW использует выбранные COM-интерфейсы без предоставления их клиенту .NET, как показано на следующем рисунке.

На следующем рисунке показаны COM-интерфейсы и вызываемая оболочка среды выполнения.

Снимок экрана: вызываемая оболочка среды выполнения с интерфейсами.

При создании в качестве объекта с ранней привязкой, RCW является определённым типом. Он реализует интерфейсы, которые com-объект реализует и предоставляет методы, свойства и события из интерфейсов объекта. На рисунке RCW предоставляет интерфейс INew, но использует интерфейс IUnknown и IDispatch . Кроме того, RCW предоставляет клиенту .NET всех членов интерфейса INew.

RCW использует интерфейсы, перечисленные в следующей таблице, которые предоставляются объектом, который он упаковывает.

Интерфейс Описание
IDispatch Для поздней привязки к COM-объектам через отражение.
IErrorInfo Содержит текстовое описание ошибки, его источника, файла справки, контекста справки и GUID интерфейса, определяющего ошибку (всегда GUID_NULL для классов .NET).
IProvideClassInfo Если объект COM, который упаковывается, реализует IProvideClassInfo, RCW извлекает сведения о типе из этого интерфейса, чтобы обеспечить лучшее удостоверение типа.
IUnknown Для идентификации объектов, приведения типов и управления сроком существования:

— удостоверение объекта
Среда выполнения различает com-объекты, сравнивая значение интерфейса IUnknown для каждого объекта.
— приведение типов
RCW распознает обнаружение динамического типа, выполняемого методом QueryInterface .
управление жизненным циклом
Используя метод QueryInterface , RCW получает и содержит ссылку на неуправляемый объект, пока среда выполнения не выполнит сборку мусора на оболочке, которая освобождает неуправляемый объект.

RCW опционально использует интерфейсы, перечисленные в следующей таблице, которые предоставляются объектом, который он упаковывает.

Интерфейс Описание
IConnectionPoint и IConnectionPointContainer RCW преобразует объекты, которые используют модель событий с использованием точки подключения для событий на основе делегатов.
IDispatchEx (только для .NET Framework) Если класс реализует IDispatchEx, RCW реализует IExpando. Интерфейс IDispatchEx является расширением интерфейса IDispatch, который, в отличие от IDispatch, позволяет перечисление, добавление, удаление и вызовы элементов с учетом регистра.
IEnumVARIANT Позволяет COM-типы, поддерживающие перечисления, рассматривать как коллекции.

См. также