Marshaling - qu'est-ce que c'est et pourquoi en avons-nous besoin?

92

Qu'est-ce que le marshalling et pourquoi en avons-nous besoin?

J'ai du mal à croire que je ne peux pas envoyer un intfil de C # à C et que je dois le rassembler. Pourquoi C # ne peut-il pas simplement envoyer les 32 bits avec un signal de début et de fin, indiquant au code C qu'il a reçu un int?

S'il existe de bons didacticiels ou sites expliquant pourquoi nous avons besoin d'un marshalling et comment l'utiliser, ce serait génial.

ZenLulz
la source
3
En fait, vous pouvez simplement envoyer les 32 bits avec un signal de début et de fin. Ce serait écrire votre propre marshalling pour un int. Mais comment passeriez-vous un Dictionary <CustomClassA, List <CustomClassB>> au code C?
Vinko Vrsalovic
4
Endianness vient à l'esprit quand vous dites "over the wire".
user7116
true permet de ne pas tenir compte du grand / petit Endian ou de toute autre variation.
54
C'est une question un peu étrange. C'est un peu comme se demander «pourquoi avons-nous besoin d'un système postal, alors que nous pourrions simplement avoir un système où les facteurs récupèrent la correspondance, l'emmènent à des centres centraux pour la trier, puis la livrent aux destinataires? Mais ... c'est un système postal. Vous demandez pourquoi nous avons besoin d'un système de rassemblement alors qu'à la place nous pourrions avoir ... un système de rassemblement. Je pense que je passe à côté de votre question. Pouvez-vous clarifier?
Eric Lippert
1
Je pense que la meilleure façon de comprendre cela est de comprendre comment les "méthodes" fonctionnent dans l'assemblage - comment la dernière adresse d'instruction est enregistrée sur la pile, les paramètres sont passés à travers la pile, le registre du pointeur de pile est modifié par la méthode, le pointeur d'instruction registre est utilisé, et, en particulier, comment il pourrait y avoir de légères variations dans les différentes techniques de mise en œuvre des méthodes. En effet, comprendre «le fil» devrait éclairer votre question.
ylax

Réponses:

75

Parce que différents langages et environnements ont différentes conventions d'appel, différentes conventions de mise en page, différentes tailles de primitives (cf. charen C # et charen C), différentes conventions de création / destruction d'objets et différentes directives de conception. Vous avez besoin d'un moyen de faire sortir les choses des terres gérées pour les placer dans un endroit où les terres non gérées peuvent les voir et les comprendre et vice versa. C'est à cela que sert le rassemblement.

Jason
la source
25

Le code .NET (C #, VB) est appelé «géré» car il est «géré» par CLR ( Common Language Runtime )

Si vous écrivez du code en C ou C ++ ou en assembleur, tout est appelé "non managé", car aucun CLR n'est impliqué. Vous êtes responsable de toutes les allocations / désallocations de mémoire.

Le marshaling est le processus entre le code managé et le code non managé; C'est l'un des services les plus importants offerts par le CLR .

Vojta
la source
11

Le marshalling intest idéalement ce que vous avez dit: copier la mémoire de la pile gérée du CLR dans un endroit où le code C peut le voir. Le marshalling des chaînes, des objets, des tableaux et d'autres types sont les choses difficiles.

Mais la couche d'interopérabilité P / Invoke s'occupe de presque toutes ces choses pour vous.

JSB ձոգչ
la source
2
Marshalling effectue-t-il réellement des opérations de copie? Je regarde les opérations de traitement d'image en temps réel et je préférerais ne pas avoir à faire des copies de tout ce qui est en mémoire.
ias le
7

Comme Vinko le dit dans les commentaires, vous pouvez passer des types primitifs sans aucun marshalling spécial. Ceux-ci sont appelés types «blittables» et incluent des types comme byte, short, int, long, etc. et leurs équivalents non signés.

Cette page contient la liste des types blittables et non blittables .

Josh
la source
7

Le marshalling est un "moyen" à défaut d'un meilleur mot ou d'une passerelle, pour communiquer avec les types de données du monde non géré et vice versa, en utilisant le pinvoke, et garantit que les données sont renvoyées de manière sûre.

t0mm13b
la source
2

Le marshalling consiste à transmettre la signature d'une fonction à un processus différent qui se trouve sur une machine différente, et il est généralement mis en œuvre par conversion de données structurées en un format dédié, qui peut être transféré vers d'autres systèmes de traitement (sérialisation / désérialisation).

Maryam Sheikh
la source