Marshaling: ¿qué es y por qué lo necesitamos?

92

¿Qué es la clasificación y por qué la necesitamos?

Me cuesta creer que no pueda enviar un intcable de C # a C y tener que ordenarlo. ¿Por qué C # no puede simplemente enviar los 32 bits con una señal de inicio y finalización, indicando al código C que ha recibido una int?

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

ZenLulz
fuente
3
De hecho, puede enviar los 32 bits con una señal de inicio y finalización. Eso sería escribir su propia clasificación para un int. Pero, ¿cómo pasaría un Dictionary <CustomClassA, List <CustomClassB>> al código C?
Vinko Vrsalovic
4
Endianness viene a la mente cuando dices "por cable".
user7116
true permite ignorar el endian grande / pequeño o cualquier otra variación.
54
Esta es una pregunta un poco extraña. Es más bien como preguntar "¿por qué necesitamos un sistema postal, cuando simplemente podríamos tener un sistema en el que los carteros recojan la correspondencia, la lleven a ubicaciones centrales para clasificarla y luego la entreguen a los destinatarios?" Pero ... eso es un sistema postal. Usted pregunta por qué necesitamos un sistema de clasificación cuando en su lugar podríamos tener ... un sistema de clasificación. Creo que me estoy perdiendo el sentido de tu pregunta. ¿Puedes aclarar?
Eric Lippert
1
Creo que la mejor manera de entender esto es entender cómo funcionan los "métodos" en el ensamblaje: cómo se guarda la última dirección de instrucción en la pila, cómo se pasan los parámetros a través de la pila, el método modifica el registro del puntero de la pila, el puntero de la instrucción se utiliza el registro y, en particular, cómo podrían existir ligeras variaciones en las diferentes técnicas de implementación de métodos. En efecto, entender "el cable" debería arrojar algo de luz sobre su pregunta.
ylax

Respuestas:

75

Debido a que los diferentes lenguajes y entornos tienen diferentes convenciones de llamada, diferentes convenciones de diseño, diferentes tamaños de primitivas (cf. charen C # y charen C), diferentes convenciones de creación / destrucción de objetos y diferentes pautas de diseño. Necesita una forma de sacar las cosas de las tierras administradas y llevarlas a algún lugar donde las tierras no administradas puedan verlas y comprenderlas y viceversa. Para eso está la clasificación.

jason
fuente
25

El código .NET (C #, VB) se denomina "administrado" porque es "administrado" por CLR ( Common Language Runtime )

Si escribe código en C o C ++ o ensamblador, todo se llama "no administrado", ya que no hay CLR involucrado. Usted es responsable de toda 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 CLR .

Vojta
fuente
11

intIdealmente, ordenar una es exactamente lo que dijo: copiar la memoria de la pila administrada de CLR en algún lugar donde el código C pueda verla. Clasificar cadenas, objetos, matrices y otros tipos son las cosas difíciles.

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

JSB ձոգչ
fuente
2
¿Marshalling realiza realmente operaciones de copia? Estoy viendo operaciones de procesamiento de imágenes en tiempo real y preferiría no tener que hacer copias de todo lo que hay en la memoria.
ias
7

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

Esta página contiene la lista de tipos blittables y no blittables .

Josh
fuente
7

Marshalling es un "medio" a falta de una palabra mejor o una puerta de enlace, para comunicarse con los tipos de datos del mundo no administrado y viceversa, utilizando el pinvoke, y garantiza que los datos se devuelvan de manera segura.

t0mm13b
fuente
2

Marshalling es pasar la firma de una función a un proceso diferente que está en una máquina diferente, y generalmente se implementa mediante la conversión de datos estructurados a un formato dedicado, que se puede transferir a otros sistemas de procesamiento (serialización / deserialización).

Maryam Sheikh
fuente