Marshalling: cos'è e perché ne abbiamo bisogno?


92

Cos'è il marshalling e perché ne abbiamo bisogno?

Trovo difficile credere che non posso inviare un intover the wire da C # a C e devo eseguirne il marshalling. Perché C # non può semplicemente inviare i 32 bit con un segnale di inizio e di fine, dicendo al codice C che ha ricevuto un int?

Se ci sono dei buoni tutorial o siti sul motivo per cui abbiamo bisogno del marshalling e su come usarlo, sarebbe fantastico.


3
In effetti, puoi semplicemente inviare i 32 bit con un segnale di inizio e di fine. Sarebbe scrivere il tuo marshalling per un int. Ma come passeresti un dizionario <CustomClassA, List <CustomClassB>> al codice C?
Vinko Vrsalovic

4
Endianness viene in mente quando dici "over the wire".
user7116

true ignoriamo il grande / piccolo Endian o qualsiasi altra variazione.

54
Questa è una domanda un po 'strana. È un po 'come chiedere "perché abbiamo bisogno di un sistema postale, quando potremmo semplicemente avere un sistema in cui i corrieri raccolgono la corrispondenza, la portano in luoghi centrali per lo smistamento e poi la consegnano ai destinatari?" Ma ... questo è un sistema postale. Mi chiedi perché abbiamo bisogno di un sistema di smistamento quando invece potremmo avere ... un sistema di smistamento. Penso di perdere il punto della tua domanda. Puoi chiarire?
Eric Lippert,

1
Penso che il modo migliore per capire questo sia capire come funzionano i "metodi" in assembly - come l'ultimo indirizzo di istruzione viene salvato nello stack, i parametri vengono passati attraverso lo stack, il registro del puntatore dello stack viene modificato dal metodo, il puntatore dell'istruzione register e, in particolare, come potrebbero esserci leggere variazioni nelle diverse tecniche di implementazione dei metodi. In effetti, capire "il filo" dovrebbe far luce sulla tua domanda.
ylax

Risposte:


75

Poiché linguaggi e ambienti differenti hanno convenzioni di chiamata differenti, convenzioni di layout differenti, differenti dimensioni di primitive (cfr. charIn C # e charin C), differenti convenzioni di creazione / distruzione di oggetti e differenti linee guida di progettazione. Hai bisogno di un modo per portare le cose fuori dalla terra gestita e da qualche parte dove la terra non gestita possa vederla e comprenderla e viceversa. Ecco a cosa serve il marshalling.


25

Il codice .NET (C #, VB) è chiamato "gestito" perché è "gestito" da CLR ( Common Language Runtime )

Se scrivi codice in C o C ++ o in assembler, tutto viene chiamato "non gestito", poiché non è coinvolto alcun CLR. Sei responsabile di tutta l'allocazione / de-allocazione della memoria.

Il marshalling è il processo tra codice gestito e codice non gestito; È uno dei servizi più importanti offerti dal CLR .


11

Il marshalling di un intè idealmente proprio quello che hai detto: copiare la memoria dallo stack gestito di CLR in un posto dove il codice C può vederlo. Il marshalling di stringhe, oggetti, array e altri tipi sono le cose difficili.

Ma il livello di interoperabilità P / Invoke si occupa di quasi tutte queste cose per te.


2
Marshalling sta effettivamente eseguendo operazioni di copia? Sto osservando le operazioni di elaborazione delle immagini in tempo reale e preferirei non dover fare copie di tutto in memoria.
ias

7

Come dice Vinko nei commenti, puoi passare tipi primitivi senza alcun marshalling speciale. Questi sono chiamati tipi "blittable" e includono tipi come byte, short, int, long, ecc e le loro controparti non firmate.

Questa pagina contiene l'elenco dei tipi copiabili e non copiabili .


7

Il marshalling è un "mezzo" per la mancanza di una parola migliore o di un gateway, per comunicare con i tipi di dati del mondo non gestito e viceversa, utilizzando il pinvoke, e garantisce che i dati vengano restituiti in modo sicuro.


2

Il marshalling sta passando la firma di una funzione a un processo diverso che si trova su una macchina diversa, e di solito è implementato dalla conversione di dati strutturati in un formato dedicato, che può essere trasferito ad altri sistemi di processore (serializzazione / deserializzazione).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.