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


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

Обновлен: Ноябрь 2007

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

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

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

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

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

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

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

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

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

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

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

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

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

COM-клиент и сервер .NET

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

COM-клиент

Сервер .NET

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

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

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

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

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

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

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

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

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

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

Клиент .NET и COM-сервер

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

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

.NET-клиент

COM-сервер

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    eaw10et3.alert_note(ru-ru,VS.90).gifПримечание.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    eaw10et3.alert_note(ru-ru,VS.90).gifПримечание.

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

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

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

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

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

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

См. также

Другие ресурсы

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

Характеристики маршалинга по умолчанию

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

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