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

Что такое сортировка и зачем она нам нужна?

Мне трудно поверить, что я не могу отправить 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 передает сигнатуру функции другому процессу, который находится на другой машине, и это обычно реализуется путем преобразования структурированных данных в специальный формат, который может быть перенесен в другие процессорные системы (сериализация / десериализация)

Другие вопросы по тегам