Маршалінг - що це таке і навіщо він нам потрібен?


92

Що таке маршірування і навіщо це нам потрібно?

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

Якщо є якісь хороші навчальні посібники чи сайти про те, навіщо нам потрібен маршалінг та як ним користуватися, це було б чудово.


3
Насправді ви можете просто надіслати 32 біта разом із сигналом запуску та завершення. Це було б написанням власного розподілу для int. Але як би ви передали словник <CustomClassA, List <CustomClassB>> в код C?
Вінко Врсалович

4
Ендіанс приходить на розум, коли ви говорите "по дроту".
user7116

true дозволяє нехтувати великим / маленьким ендіаном чи будь-якою іншою варіацією.

54
Це трохи дивне питання. Це швидше як запитання "навіщо нам поштова система, коли ми могли б просто мати систему, де перевізники листів забирають кореспонденцію, доставляють її в центральні місця для сортування, а потім доставляють адресатам?" Але ... це поштова система. Ви запитуєте, навіщо нам потрібна система маршового управління, коли замість цього ми могли б мати ... маршальну систему. Думаю, я втрачаю суть вашого запитання. Ви можете пояснити?
Eric Lippert,

1
Я думаю, найкращий спосіб зрозуміти це - зрозуміти, як "методи" працюють у збірці - як остання адреса інструкції зберігається в стеку, параметри передаються через стек, регістр вказівника стека модифікується методом, вказівник інструкції реєстру, і, зокрема, як можуть бути незначні розбіжності в різних техніках реалізації методів. По суті, розуміння "дроту" повинно пролити світло на ваше питання.
ylax

Відповіді:


75

Оскільки різні мови та середовища мають різні конвенції викликів, різні конвенції макета, різні розміри примітивів (пор. На charC # та charна C), різні конвенції створення / знищення об’єктів та різні керівні принципи проектування. Вам потрібен спосіб дістати речі з керованої землі кудись, де некерована земля може це побачити і зрозуміти, і навпаки. Ось для чого призначений маршал.


25

.NET-код (C #, VB) називається "керованим", оскільки ним "керує" CLR ( Common Language Runtime )

Якщо ви пишете код на C або C ++ або асемблер, це все називається "некерованим", оскільки жоден CLR не задіяний. Ви несете відповідальність за все розподіл / де-розподіл пам'яті.

Маршалінг - це процес між керованим кодом і некерованим кодом; Це одна з найважливіших послуг, яку пропонує CLR .


11

Маршалінг an int- це в ідеалі саме те, що ви сказали: копіювання пам’яті з керованого стека CLR туди, де його може бачити код C. Маршалінг рядків, об’єктів, масивів та інших типів - важкі речі.

Але рівень взаємодії P / Invoke піклується про майже всі ці речі для вас.


2
Чи насправді Маршаллінг виконує копіювальні операції? Я розглядаю операції з обробки зображень у режимі реального часу і вважаю за краще не робити копії всього, що є в пам'яті.
МСФЗ

7

Як каже Вінко в коментарях, ви можете передавати примітивні типи без особливого маршування. Вони називаються типами "blittable" і включають типи, такі як byte, short, int, long тощо та їхні неподібні аналоги.

На цій сторінці міститься перелік типів, що піддаються висвітленню та без висвітлення .


7

Маршалінг - це «засіб» для відсутності кращого слова або шлюзу для спілкування з некерованими світовими типами даних, і навпаки, за допомогою обертання, і забезпечує безпечне повернення даних назад.


2

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.