Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Среда 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-типы, поддерживающие перечисления, рассматривать как коллекции. |