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

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

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

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

Process for accessing COM objects through the RCW.

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

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

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

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

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

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

Screenshot of the runtime callable wrapper with interfaces.

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

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

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

— Идентификация объектов
Среда выполнения различает COM-объекты, сравнивая значение интерфейса IUnknown для каждого из них.
— Приведение типов
Вызываемая оболочка времени выполнения распознает динамическое обнаружение типов, выполняемое методом QueryInterface.
— Управление жизненным циклом объекта
С помощью метода QueryInterface вызываемая оболочка времени выполнения получает и сохраняет ссылку на неуправляемый объект, пока среда выполнения не выполнит для оболочки сбор мусора, освободив неуправляемый объект.

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

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

См. также