2010-02-10 15 views
63

¿Qué es organizar y por qué lo necesitamos?Marshalling: ¿qué es y por qué lo necesitamos?

Me resulta difícil de creer que no puedo enviar un int sobre el alambre de C# a C y tienen que ordenar de ella. ¿Por qué no puede C# enviar los 32 bits con una señal de inicio y finalización, diciendo al código C que ha recibido un int?

Si hay buenos tutoriales o sitios sobre por qué necesitamos una clasificación y cómo usarlos, sería genial.

+2

De hecho, ** puedes ** simplemente enviar los 32 bits con una señal de inicio y finalización. Eso sería escribir tu propia clasificación para un int. ¿Pero cómo pasaría un diccionario > al código C? –

+2

Endianidad viene a la mente cuando dices "por cable". – user7116

+0

true deja de lado el Endian grande/pequeño o cualquier otra variación. –

Respuesta

54

Debido a que diferentes lenguajes y entornos tienen diferentes convenciones de llamada, diferentes convenciones de diseño, diferentes tamaños de primitivas (cf. char en C# y char en C), diferente de creación de objetos/convenciones de destrucción, y diferentes pautas de diseño. Necesitas una forma de sacar las cosas de la tierra administrada a un lugar donde la tierra no administrada pueda verla y entenderla y viceversa. Para eso es la clasificación.

8

Marshalling un int es idealmente justo lo que dijiste: copiar la memoria de la pila administrada del CLR en algún lugar donde el código C pueda verla. Las cadenas difíciles, los objetos, las matrices y otros tipos son las cosas difíciles.

Pero la capa de interoperabilidad de P/Invoke se ocupa de casi todas estas cosas por usted.

3

Marshalling es un "medio" por falta de una mejor palabra o una puerta de enlace, para comunicarse con los tipos de datos del mundo no administrado y viceversa, mediante el uso del pinvoke, y garantiza que los datos vuelvan de forma segura.

4

Como dice Vinko en los comentarios, puede pasar tipos primitivos sin ninguna clasificación especial. Estos se llaman tipos "blittables" e incluyen tipos como byte, short, int, long, etc. y sus contrapartes sin firmar.

Esta página contiene la lista de blittable and non-blittable types.

10

código .NET (C#, VB) se llama "gestionado" porque es "administrada" por CLR (Common Language Runtime)

Si se escribe código en C o C++ o ensamblador todo se llama "no administrado", ya no CLR está involucrado. Usted es responsable de la asignación/desasignación de memoria.

Marshaling es el proceso entre el código administrado y el código no administrado; Es uno de los servicios más importantes que ofrece el CLR.

Cuestiones relacionadas