Общие сведения о маршалинге взаимодействия
Обновлен: Ноябрь 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.
Изменить основной поток, выбирая для клиентского потока на однопотоковое или многопотоковое подразделение. Например, если клиент C# вызывает много COM-компонентов однопотоковых подразделений, можно избежать маршалинга между подразделениями, задав для основного потока однопотоковое подразделение.
Примечание. Как только для потока клиента C# задается однопотоковое подразделение, для вызова COM-компонентов многопотоковых подразделений потребуется маршалинг между подразделениями.
Инструкции для выбора модели подразделения в явном виде см. в разделе Управляемые и неуправляемые потоки.
Маршалинг удаленных вызовов
При маршалинге между подразделениями маршалинг COM используется в каждом вызове между управляемым и неуправляемым кодами, если объекты находятся в отдельных процессах. Например:
COM-клиент, обращающийся к управляемому серверу на удаленном компьютере, использует DCOM.
Управляемый клиент, обращающийся к серверу СОМ на удаленном компьютере, использует DCOM.
На следующем рисунке показано, как маршалинг взаимодействия и маршалинг COM обеспечивают коммуникационные каналы между процессами и через границы основного приложения.
Маршалинг между процессами
Сохранение идентификации
Среда CLR сохраняет идентификацию управляемых и неуправляемых ссылок. На следующем рисунке показан поток прямых неуправляемых ссылок (верхняя строка) и прямых управляемых ссылок (нижняя строка) через границы между процессами и компьютерами.
Передача ссылок через границы между процессами и компьютерами
На этом рисунке:
Неуправляемый клиент получает ссылку на COM-объект из управляемого объекта, получившего эту ссылку с удаленного компьютера. Механизмом удаленного взаимодействия является DCOM.
Управляемый клиент получает ссылку на управляемый объект из COM-объекта, получившего эту ссылку с удаленного компьютера. Механизмом удаленного взаимодействия является DCOM.
Примечание. Экспортированная библиотека типов управляемого сервера должна быть зарегистрирована.
Число границ процессов между вызывающим и вызываемым объектами несущественно; одни и те же прямые ссылки возникают для вызовов, входящих в процессы и исходящих из них.
Управляемое удаленное взаимодействие
Во время выполнения также обеспечивается управляемое удаленное взаимодействие, которое можно использовать для установления канала связи между управляемыми объектами через границы между процессами и компьютерами. Управляемое удаленное взаимодействие может предусматривать брандмауэр между связывающимися компонентами, как показано на следующем рисунке.
Удаленные вызовы через брандмауэры с использованием SOAP или класса TcpChannel
Некоторые неуправляемые вызовы, например вызовы между обслуживаемыми компонентамии COM, могут быть проведены через SOAP. Дополнительные сведения об управляемом удаленном взаимодействии см. в разделе .NET Framework Remoting Overview.
См. также
Другие ресурсы
Характеристики маршалинга по умолчанию