Маршалинг взаимодействия

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

Представление большинства типов данных является общим как для управляемого, так и в неуправляемого кода. Эти типы обрабатываются упаковщиком взаимодействия. Другие типы могут иметь неоднозначное представление или они могут вообще не быть представленными в управляемой памяти.

У неоднозначного типа может либо быть несколько представлений в неуправляемом коде, отображаемых в один управляемый тип, либо у него может быть пропущены сведения о типе, такие как размер массива. Для неоднозначных типов маршалер предоставляет представление по умолчанию и альтернативные представления, если существует несколько представлений. Упаковщик можно предоставить явные инструкции для маршалинга неопределенного типа.

Обзор включает следующие разделы.

  • Вызов неуправляемого кода и модели взаимодействий COM

  • Маршалинг и апартаменты COM

  • Маршалинг удаленных вызовов

  • Связанные разделы

  • Ссылки

Вызов неуправляемого кода и модели взаимодействий COM

Среда CLR предоставляет два механизма взаимодействия с управляемым кодом.

  • Вызов неуправляемого кода, позволяющий управляемому коду вызывать функции, экспортированные из неуправляемой библиотеки.

  • COM-взаимодействие, позволяющее управляемому коду взаимодействовать с объектами модели COM с помощью интерфейсов.

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

Вызовы неуправляемого кода и направление вызовов COM-взаимодействия

Вызов неуправляемого кода

На самом нижнем уровне оба механизма используют одну и ту же службу маршалинга. Однако некоторые типы данных поддерживаются только COM-взаимодействиями или только платформозависимыми вызовами. Дополнительные сведения см. в разделе Поведение маршалинга по умолчанию.

К началу

Маршалинг и апартаменты COM

Маршалер взаимодействия выполняет маршалинг данных между кучей общеязыковой среды выполнения и неуправляемой кучей. Маршалинг происходит всегда, когда вызывающий и вызываемый объекты не могут работать с одним и тем же экземпляром данных. Благодаря маршалеру взаимодействия может казаться, что вызывающий и вызываемый объекты работают с одними и теми же данными, даже если каждый из них использует свою собственную копию данных.

В COM имеется также маршалер, который выполняет маршалинг данных между апартаментами COM, или различными процессами COM. При вызове между управляемым и неуправляемым кодом в одном и том же COM-подразделении задействован только упаковщик взаимодействия. При вызовах между управляемым и неуправляемым кодом в различных COM-подразделениях или различных процессах задействованы и упаковщик взаимодействия, и упаковщик COM.

Клиенты модели COM и управляемые серверы

Для экспортированного управляемого сервера с библиотекой типов, зарегистрированной с помощью средства Regasm.exe (средство регистрации сборок), существует запись реестра ThreadingModel со значением Both. Это значение показывает, что данный сервер может быть активирован как в однопотоковом подразделении, так и в многопотоковом подразделении. Как показано в следующей таблице, серверный объект создается в том же подразделении, что и вызывающий объект.

Клиент модели COM

Сервер .NET

Требования к маршалингу

Однопотоковое подразделение

Both указывает на однопотоковое подразделение.

Маршалинг в том же подразделении.

Многопотоковое подразделение

Both указывает на многопотоковое подразделение.

Маршалинг в том же подразделении.

Поскольку клиент и сервер находятся в одном и том же подразделении, служба маршалинга взаимодействия автоматически обрабатывает все маршалируемые данные. На следующем рисунке показана работа службы маршалинга взаимодействия между управляемой и неуправляемой кучами в одном и том же подразделении стиля COM.

Процесс маршалинга в одном и том же подразделении

Маршалинг взаимодействия

Если планируется экспортировать управляемый сервер, следует проверить, что COM-клиент определил подразделение сервера. Управляемый сервер, вызванный клиентом COM, инициализированным в многопотоковом разделении, должен обеспечить потокобезопасность.

Управляемые клиенты и серверы модели COM

По умолчанию для подразделений управляемых клиентов используется многопотоковое подразделение, однако тип приложения клиента .NET может изменить значение по умолчанию. Например, настройкой для подразделения клиента Visual Basic 2005 однопотоковое подразделение. Для проверки и изменения настройки подразделения для управляемого клиента можно использовать атрибут System.STAThreadAttribute, атрибут System.MTAThreadAttribute, свойство Thread.ApartmentState или свойство Page.AspCompatMode.

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

Клиент .NET

COM-сервер

Требования к маршалингу

Многопотоковое подразделение (по умолчанию)

Многопотоковое подразделение

Однопотоковое подразделение

Маршалинг взаимодействия

Маршалинг взаимодействия и маршалинг COM.

Однопотоковое подразделение

Многопотоковое подразделение

Однопотоковое подразделение

Маршалинг взаимодействия и маршалинг COM.

Маршалинг взаимодействия

Когда управляемый клиент и неуправляемый сервер находятся в одном и том же подразделении, служба маршалинга взаимодействия обрабатывает все маршалируемые данные. Но если клиент и сервер инициализированы в разных подразделениях, также требуется маршалинг COM. На следующем рисунке показаны элементы вызова между подразделениями.

Вызов между клиентом .NET и объектом COM, находящимися в разных подразделениях

COM маршалинг

Для маршалинга между подразделениями можно выполнить следующее:

  • Согласиться на дополнительные издержки маршалинга между подразделениями, которые становятся заметными только в случае, когда границу пересекает много вызовов. Чтобы вызовы успешно пересекали границу подразделения, необходимо зарегистрировать библиотеку типов компонента COM.

  • Изменить основной поток, выбирая для клиентского потока на однопотоковое или многопотоковое подразделение. Например, если клиент C# вызывает много COM-компонентов однопотоковых подразделений, можно избежать маршалинга между подразделениями, задав для основного потока однопотоковое подразделение.

    ПримечаниеПримечание

    Как только для потока клиента C# задается однопотоковое подразделение, для вызова COM-компонентов многопотоковых подразделений потребуется маршалинг между подразделениями.

Инструкции для выбора модели подразделения в явном виде см. в разделе Управляемые и неуправляемые потоки.

К началу

Маршалинг удаленных вызовов

При маршалинге между подразделениями маршалинг COM используется в каждом вызове между управляемым и неуправляемым кодами, если объекты находятся в отдельных процессах. Пример.

  • Клиент модели COM, вызывающий управляемый сервер на удаленном узле, использует DCOM.

  • Управляемый клиент, обращающийся к серверу СОМ на удаленном компьютере, использует DCOM.

На следующем рисунке показано, как маршалинг взаимодействия и маршалинг COM обеспечивают коммуникационные каналы между процессами и через границы основного приложения.

Маршалинг между процессами

COM маршалинг

Сохранение идентификации

Среда CLR сохраняет идентификацию управляемых и неуправляемых ссылок. На следующем рисунке показан поток прямых неуправляемых ссылок (верхняя строка) и прямых управляемых ссылок (нижняя строка) через границы между процессами и компьютерами.

Передача ссылок через границы между процессами и компьютерами

Вызываемая оболочка COM в вызываемая оболочка во время выполнения

На этом рисунке:

  • Неуправляемый клиент получает ссылку на COM-объект из управляемого объекта, получившего эту ссылку с удаленного компьютера. Механизмом удаленного взаимодействия является DCOM.

  • Управляемый клиент получает ссылку на управляемый объект из COM-объекта, получившего эту ссылку с удаленного компьютера. Механизмом удаленного взаимодействия является DCOM.

    ПримечаниеПримечание

    Экспортированная библиотека типов управляемого сервера должна быть зарегистрирована.

Число границ процессов между вызывающим и вызываемым объектами несущественно; одни и те же прямые ссылки возникают для вызовов, входящих в процессы и исходящих из них.

Управляемое удаленное взаимодействие

Во время выполнения также обеспечивается управляемое удаленное взаимодействие, которое можно использовать для установления канала связи между управляемыми объектами через границы между процессами и компьютерами. Управляемое удаленное взаимодействие может предусматривать брандмауэр между связывающимися компонентами, как показано на следующем рисунке.

Удаленные вызовы через брандмауэры с использованием SOAP или класса TcpChannel

SOAP или TcpChannel

Некоторые неуправляемые вызовы, например вызовы между обслуживаемыми компонентами и COM, могут быть проведены через SOAP. Дополнительные сведения об управляемом удаленном взаимодействии см. в разделе .NET Remoting Overview.

К началу

Связанные разделы

Заголовок

Описание

Поведение маршалинга по умолчанию

Описывает правила, используемые службами маршалинга взаимодействия, для выполнения маршалинга данных.

Маршалинг данных при вызове неуправляемого кода

Описывает способ объявления параметров метода и передачи аргументов в функции, экспортируемые неуправляемыми библиотеками.

Маршалинг с помощью COM- взаимодействия

Описывает настройку оболочек COM для изменения характеристик маршалинга.

Практическое руководство. Сопоставление значений HRESULT и исключений

Описание сопоставления пользовательских исключений со значениями HRESULT и полный перечень сопоставлений значений HRESULT со сравнимыми классами исключений платформы .NET Framework.

Взаимодействие с помощью универсальных типов

Описывает действия, поддерживаемые при использовании универсальных типов для взаимодействия COM.

Взаимодействие с неуправляемым кодом

Описывает службы взаимодействия, предоставляемые средой CLR.

Расширенное COM-взаимодействие

Содержит ссылки на дополнительные сведения о включении COM-компонентов в разрабатываемое приложение .NET Framework.

Вопросы разработки для взаимодействия

Содержит советы по написанию кода встроенных COM-компонентов.

.NET Remoting

Описание различных методов удаленного взаимодействия, доступных в платформе .NET Framework.

К началу

Ссылки

System.Runtime.InteropServices

К началу