Поделиться через


Сведения о маршалинге

При использовании стандартного маршалинга COM обрабатывает все сведения, описанные здесь. Однако есть те немногие программисты, которые нуждаются в этих деталях и для тех, кто заинтересован в базовой информации. Маршалинг — это процесс упаковки и распаковки параметров, поэтому удаленный вызов процедуры может произойти.

Различные типы параметров маршалируются разными способами. Например, маршалинг целочисленного параметра подразумевает простое копирование значения в буфер сообщений. (Хотя даже в этом простом случае существуют такие проблемы, как порядок байтов для решения меж компьютерных вызовов.) Однако маршалинг массива является более сложным процессом. Элементы массива копируются в определенном порядке, чтобы другая сторона точно может восстановить массив. При маршалинге указателя данные, на которые указывает указатель, копируются следующие правила и соглашения для работы с вложенными указателями в структурах. Уникальные функции существуют для обработки маршалинга каждого типа параметра.

При стандартном маршалинге прокси-серверы и заглушки — это системные ресурсы для интерфейса, и они взаимодействуют с каналом через стандартный протокол. Стандартное маршалинг можно использовать как стандартными com-определяемыми интерфейсами, так и пользовательскими интерфейсами следующим образом:

  • В случае большинства интерфейсов COM прокси-серверы и заглушки для стандартного маршалинга являются объектами компонентов процесса, загруженными из системной библиотеки DLL, предоставляемой COM в Ole32.dll.
  • В случае пользовательских интерфейсов прокси-серверы и заглушки для стандартного маршалинга создаются конструктором интерфейсов, как правило, с ПОМОЩЬЮ MIDL. Эти прокси-серверы и заглушки статически настроены в реестре, поэтому любой потенциальный клиент может использовать пользовательский интерфейс через границы процесса. Эти прокси-серверы и заглушки загружаются из библиотеки DLL, расположенной через системный реестр, используя идентификатор интерфейса (IID) для пользовательского интерфейса, который они маршалируют.
  • Альтернатива использованию MIDL для создания прокси-серверов и заглушки для пользовательских интерфейсов, можно создать библиотеку типов, а системе, управляемой маршалингом библиотеки типов, будет маршалировать интерфейс.

В качестве альтернативы стандартному маршалингу интерфейс (стандартный или настраиваемый) может использовать пользовательский маршалинг. При использовании пользовательского маршалинга объект динамически реализует прокси-серверы во время выполнения для каждого интерфейса, который он поддерживает. Для любого заданного интерфейса объект может выбрать стандартный маршалинг com или пользовательский маршалинг. Этот выбор делается объектом на основе интерфейса. После выбора для данного интерфейса он остается в силе во время существования объекта. Однако один интерфейс в объекте может использовать пользовательский маршалинг, а другой использует стандартное маршалинг.

Настраиваемое маршалинг по сути уникально для объекта, реализующего его. Он использует прокси-серверы, реализованные объектом, и предоставляется системе по запросу во время выполнения. Объекты, реализующие пользовательский маршалинг, должны реализовать интерфейс IMarshal , в то время как объекты, поддерживающие стандартное маршалинг, не выполняются.

Если вы решили написать пользовательский интерфейс, необходимо предоставить поддержку маршалинга. Как правило, вы предоставите стандартную библиотеку DLL маршалинга для интерфейса, который вы разрабатываете. Вы можете создать код прокси-сервера или заглушки и библиотеку DLL прокси-сервера или заглушки или создать библиотеку типов, которую COM будет использовать для маршалинга на основе данных (с помощью данных в библиотеке типов).

Для того чтобы клиент вызывал метод интерфейса в объекте в другом процессе, включает сотрудничество нескольких компонентов. Стандартный прокси-сервер — это часть кода для конкретного интерфейса, который находится в пространстве процесса клиента и подготавливает параметры интерфейса для передачи. Он упаковал или маршалы таким образом, чтобы их можно было повторно создать и понять в процессе получения. Стандартная заглушка, также часть кода для конкретного интерфейса, находится в пространстве процесса сервера и изменяет работу прокси-сервера. Заглушки распаковываются или немаршалы, отправленные параметры и перенаправляют их в приложение объекта. Он также упаковает информацию ответа для отправки клиенту обратно.

Примечание.

Читатели более знакомы с RPC, чем COM, могут использоваться для просмотра терминов заглушки клиента и заглушки сервера. Эти термины аналогичны прокси-серверу и заглушки.

 

Компоненты межпроцессных коммуникаций

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

Diagram that shows the Client.exe and Server.exe flows on each side fo the Process Boundary.

Канал

Взаимодействие между объектами

Microsoft RPC

Proxy

Заглушка