Вызываемая оболочка времени выполнения
Среда CLR предоставляет доступ к COM-объектам через посредник, называемый вызываемой оболочкой времени выполнения. Хотя вызываемая оболочка времени выполнения выглядит для клиентов .NET обычным объектом, ее основная функция состоит в маршалинге вызовов между клиентом .NET и COM-объектом.
Среда выполнения создает по одной вызываемой оболочке времени выполнения для каждого COM-объекта независимо от числа существующих ссылок на этот объект. Среда выполнения поддерживает одну вызываемую оболочку времени выполнения на процесс для каждого объекта. Если вы создаете вызываемую оболочку времени выполнения в одном домене приложения или подразделении, а затем передаете ссылку в другой домен приложения или подразделение, будет использоваться посредник для первого объекта. Обратите внимание, что этот прокси-сервер является новым управляемым объектом, а не таким же, как и начальный RCW; Это означает, что два управляемых объекта не равны, но представляют один и тот же COM-объект. Как показано на следующем рисунке, любое количество управляемых клиентов может содержать ссылку на COM-объекты, предоставляющие INew
и INewer
интерфейсы.
На следующем рисунке показана процедура доступа к COM-объектам с помощью вызываемой оболочки времени выполнения:
Используя метаданные, полученные из библиотеки типов, среда выполнения создает и вызываемый COM-объект, и оболочку для него. Каждая вызываемая оболочка времени выполнения содержит кэш указателей интерфейса для COM-объекта, для которого она используется, и освобождает ссылку на COM-объект, когда она больше не нужна. Среда выполнения выполняет сборку мусора для вызываемой оболочки времени выполнения.
Среди прочих операций вызываемая оболочка времени выполнения осуществляет маршалинг данных между управляемым и неуправляемым кодом от имени упакованного в оболочку объекта. В частности, RCW обеспечивает маршалирование для аргументов метода и возвращаемых значений метода, когда клиент и сервер имеют различные представления данных, передаваемых между ними.
Стандартная оболочка применяет встроенные правила маршаллинга. Например, когда клиент .NET передает string
тип как часть аргумента неуправляемым объекту, оболочка преобразует его в string
BSTR
тип. Если COM-объект возвращает управляемый вызывающий BSTR
объект, вызывающий объект получает объект string
. И клиент, и сервер отправляют и получают данные в понятном им представлении. Преобразование других типов не требуется. Например, стандартная оболочка всегда передает 4-байтовое целое число между управляемым и неуправляемым кодом, не преобразуя тип.
Маршаллирование выбранных интерфейсов
Основная цель вызываемой оболочки времени выполнения — скрыть различия между управляемыми и неуправляемыми моделями программирования. Чтобы обеспечить беспроблемный переход, вызываемая оболочка времени выполнения использует выбранные COM-интерфейсы, не предоставляя доступа к ним клиенту .NET, как показано на схеме ниже.
На следующем рисунке показаны COM-интерфейсы и вызываемая оболочка времени выполнения:
Вызываемая оболочка времени выполнения, если она создается как объект с ранним связыванием, является особым типом. Она реализует интерфейсы, реализуемые 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-типы, позволяющие работать с перечислениями как с коллекциями. |