Qu'est-ce que le marshalling et pourquoi en avons-nous besoin?
J'ai du mal à croire que je ne peux pas envoyer un int
sur le fil 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 y a de bons tutoriels ou sites sur les raisons pour lesquelles nous avons besoin de marshalling et comment l'utiliser, ce serait génial.
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. char
en C # et char
en C), différentes conventions de création/destruction d'objets et une conception différente des lignes directrices. Vous avez besoin d'un moyen de faire sortir les choses des terres gérées vers un endroit où les terres non gérées peuvent les voir et les comprendre et vice versa. C'est à ça que sert le triage.
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 assembleur, tout cela est appelé "non managé", car aucun CLR n'est impliqué. Vous êtes responsable de toute allocation/désallocation 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 [~ # ~] .
Idéalement, un int
est exactement 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 triage 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.
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 octet, court, entier, long, etc. et leurs homologues non signés.
Cette page contient la liste des types blittables et non blittables .
Le marshaling 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.
Le marshaling passe la signature d'une fonction à un processus différent qui se trouve sur une machine différente, et il est généralement implémenté par la conversion de données structurées dans un format dédié, qui peut être transféré à d'autres systèmes de processeurs (sérialisation/désérialisation)