Оболочки COM

Модель COM имеет несколько важных отличий от объектной модели среды выполнения .NET:

  • Клиенты COM-объектов должны управлять временем существования этих объектов. В общеязыковой среде выполнения управление временем существования объектов осуществляет сама среда.

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

  • Объекты .NET располагаются в памяти под управлением среды выполнения .NET. Среда выполнения может перемещать объекты в памяти в целях оптимизации производительности и обновлять все ссылки на перемещаемые объекты. Неуправляемые клиенты после получения указателя на объект работают с объектом, находящимся в указанном расположении. У этих клиентов отсутствуют механизмы для работы с объектами, не имеющими фиксированного расположения.

Чтобы обойти эти различия, среда выполнения предоставляет классы-оболочки, которые моделируют вызов объектов в соответствующих им средах для управляемых и неуправляемых клиентов. Каждый раз, когда управляемый клиент вызывает метод для COM-объекта, среда выполнения создает вызываемую оболочку времени выполнения (RCW). Помимо прочего, вызываемая оболочка времени выполнения позволяет абстрагировать различия между управляемыми и неуправляемыми механизмами ссылок. Среда выполнения также создает вызываемую оболочку COM (CCW) для работы в обратном направлении, когда COM-клиенту требуется вызвать метод для объекта .NET. Как показано на следующем рисунке, класс-оболочка, который создается средой выполнения, зависит от контекста вызывающего кода.

COM wrapper overview

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

См. также