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
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 existe de bons didacticiels ou sites expliquant pourquoi nous avons besoin d'un marshalling et comment l'utiliser, ce serait génial.
Réponses:
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 # etchar
en 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.la source
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 .
la source
Le marshalling
int
est 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.
la source
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 .
la source
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.
la source
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).
la source