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