103 votes

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

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

J'ai du mal à croire que je ne puisse pas envoyer un int sur le fil de C# à C et je dois le rassembler. Pourquoi C# ne peut-il pas simplement envoyer les 32 bits avec un signal de départ et un signal d'arrivée, indiquant au code C qu'il a reçu un message de type int ?

S'il existe de bons tutoriels ou des sites expliquant pourquoi nous avons besoin de la maréchaussée et comment l'utiliser, ce serait formidable.

83voto

Jason Points 125291

Parce que les différents langages et environnements ont des conventions d'appel différentes, des conventions de mise en page différentes, des tailles de primitives différentes (cf. char en C# et char 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 du terrain géré vers un endroit où le terrain non géré peut les voir et les comprendre et vice versa. C'est à cela que sert le marshalling.

34voto

Vojta Points 922

Le code .NET (C#, VB) est appelé "géré" parce qu'il est "géré" par le CLR ( Common Language Runtime )

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

Marshaling est le processus entre le code géré et le code non géré ; il s'agit de l'un des services les plus importants offerts par le système de gestion de l'information. CLR .

11voto

JSBձոգչ Points 25069

La mise en place d'un int est idéalement juste 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 la voir. Les chaînes de caractères, les objets, les tableaux et les autres types sont les choses les plus difficiles.

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

9voto

Josh Points 38617

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

Cette page contient la liste des les types blittable et non blittable .

7voto

t0mm13b Points 21031

Le maréchalage est un "moyen", faute d'un meilleur mot, ou 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X