Маршалинг - что это и зачем он нам нужен?

94

Что такое маршаллинг и зачем он нам нужен?

Мне трудно поверить, что я не могу послать intпо сети с C # на C и должен его упорядочить. Почему C # не может просто послать 32 бита с сигналом запуска и завершения, сообщая коду C, что он получил int?

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

Джеймс
источник
3
Фактически, вы можете просто послать 32 бита с сигналом запуска и завершения. Это было бы написанием вашего собственного маршаллинга для int. Но как передать Dictionary <CustomClassA, List <CustomClassB>> коду C?
Винко Врсалович
4
На ум приходит порядок байтов, когда вы говорите «по сети».
user7116
true позволяет игнорировать большой / малый порядок байтов или любые другие варианты.
56
Это немного странный вопрос. Это скорее похоже на вопрос: «Зачем нам нужна почтовая система, если мы могли бы просто иметь систему, в которой курьеры забирают корреспонденцию, доставляют ее в центральные пункты для сортировки, а затем доставляют адресатам?» Но ... это почтовая система. Вы спрашиваете, зачем нам нужна маршаллинговая система, если вместо этого у нас может быть ... маршаллинговая система. Думаю, я упускаю суть вашего вопроса. Вы можете уточнить?
Эрик Липперт,
1
Я думаю, что лучший способ понять это - понять, как «методы» работают в сборке - как последний адрес инструкции сохраняется в стеке, параметры передаются через стек, регистр указателя стека изменяется методом, указатель инструкции register, и, в частности, как могут быть небольшие различия в различных методах реализации методов. По сути, понимание «проволоки» должно пролить свет на ваш вопрос.
ylax

Ответы:

77

Потому что разные языки и среды имеют разные соглашения о вызовах, разные соглашения о макете, разные размеры примитивов (см. charC # и charC), разные соглашения о создании / уничтожении объектов и разные рекомендации по проектированию. Вам нужен способ вывести материал из управляемой земли в место, где неуправляемая земля может это увидеть и понять, и наоборот. Вот для чего нужен маршаллинг.

Джейсон
источник
26

Код .NET (C #, VB) называется «управляемым», потому что он «управляется» средой CLR ( Common Language Runtime ).

Если вы пишете код на C, C ++ или ассемблере, все это называется «неуправляемым», поскольку в нем нет среды CLR. Вы несете ответственность за все распределение / освобождение памяти.

Маршалинг - это процесс между управляемым и неуправляемым кодом; Это одна из самых важных услуг, предлагаемых CLR .

Войта
источник
11

Маршаллинг - intэто в идеале именно то, что вы сказали: копирование памяти из управляемого стека CLR в место, где ее может увидеть код C. Маршалинг строк, объектов, массивов и других типов - это сложная задача.

Но уровень взаимодействия P / Invoke позаботится почти обо всех этих вещах за вас.

JSB ձոգչ
источник
3
Действительно ли Marshalling выполняет операции копирования? Я смотрю на операции обработки изображений в реальном времени и предпочел бы не копировать все в памяти.
МСФО
7

Как говорит Винко в комментариях, вы можете передавать примитивные типы без какого-либо специального маршалинга. Они называются «непреобразуемыми» типами и включают такие типы, как byte, short, int, long и т.д., а также их беззнаковые аналоги.

Эта страница содержит список непреобразуемых и непреобразуемых типов .

Джош
источник
7

Маршаллинг - это «среда», из-за отсутствия лучшего слова или шлюза, для связи с типами данных неуправляемого мира и наоборот с помощью pinvoke и гарантирует безопасный возврат данных.

t0mm13b
источник
2

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

Марьям Шейх
источник