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