Что такое маршаллинг и зачем он нам нужен?
Мне трудно поверить, что я не могу послать int
по сети с C # на C и должен его упорядочить. Почему C # не может просто послать 32 бита с сигналом запуска и завершения, сообщая коду C, что он получил int
?
Если есть какие-нибудь хорошие учебники или сайты о том, зачем нам нужен маршаллинг и как его использовать, это было бы здорово.
Ответы:
Потому что разные языки и среды имеют разные соглашения о вызовах, разные соглашения о макете, разные размеры примитивов (см.
char
C # иchar
C), разные соглашения о создании / уничтожении объектов и разные рекомендации по проектированию. Вам нужен способ вывести материал из управляемой земли в место, где неуправляемая земля может это увидеть и понять, и наоборот. Вот для чего нужен маршаллинг.источник
Код .NET (C #, VB) называется «управляемым», потому что он «управляется» средой CLR ( Common Language Runtime ).
Если вы пишете код на C, C ++ или ассемблере, все это называется «неуправляемым», поскольку в нем нет среды CLR. Вы несете ответственность за все распределение / освобождение памяти.
Маршалинг - это процесс между управляемым и неуправляемым кодом; Это одна из самых важных услуг, предлагаемых CLR .
источник
Маршаллинг -
int
это в идеале именно то, что вы сказали: копирование памяти из управляемого стека CLR в место, где ее может увидеть код C. Маршалинг строк, объектов, массивов и других типов - это сложная задача.Но уровень взаимодействия P / Invoke позаботится почти обо всех этих вещах за вас.
источник
Как говорит Винко в комментариях, вы можете передавать примитивные типы без какого-либо специального маршалинга. Они называются «непреобразуемыми» типами и включают такие типы, как byte, short, int, long и т.д., а также их беззнаковые аналоги.
Эта страница содержит список непреобразуемых и непреобразуемых типов .
источник
Маршаллинг - это «среда», из-за отсутствия лучшего слова или шлюза, для связи с типами данных неуправляемого мира и наоборот с помощью pinvoke и гарантирует безопасный возврат данных.
источник
Маршаллинг - это передача сигнатуры функции другому процессу, который находится на другом компьютере, и обычно он реализуется путем преобразования структурированных данных в специальный формат, который может быть передан другим процессорным системам (сериализация / десериализация).
источник