2010-02-10 16 views
63

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

Trovo difficile credere che non sia possibile inviare uno int sul cavo da C# a C e doverlo marshallare. Perché C# non può semplicemente inviare i 32 bit con un segnale di avvio e di terminazione, dicendo al codice C di aver ricevuto uno int?

Se ci sono buoni tutorial o siti sul perché abbiamo bisogno del marshalling e su come usarlo, sarebbe fantastico.

+2

Infatti, ** puoi ** inviare solo i 32 bit con un segnale di avvio e di terminazione. Quello sarebbe scrivere il tuo marshalling per un int. Ma come passeresti un dizionario > in codice C? –

+2

L'endianità viene in mente quando dici "oltre il filo". – user7116

+0

true consente di ignorare big/little Endian o qualsiasi altra variazione. –

risposta

54

Perché linguaggi e ambienti diversi hanno diverse convenzioni di chiamata, diverse convenzioni di layout, diverse dimensioni di primitive (cfr char in C# e char in C), la creazione di diversi oggetti/convegni distruzione, e le linee guida di progettazione diversi. Hai bisogno di un modo per portare la roba fuori dalla terra gestita e in un luogo dove la terra non gestita possa vederla e comprenderla e viceversa. Ecco a cosa serve lo smistamento.

8

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

Ma il livello di interoperabilità P/Invoke si prende cura di quasi tutte queste cose per voi.

3

Il marshalling è un "mezzo" per 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.

4

Come dice Vinko nei commenti, è possibile 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 di blittable and non-blittable types.

10

codice .NET (C#, VB) si chiama "gestito" perché è "gestito" dal CLR (Common Language Runtime)

Se si scrive il codice in C o C++ o Assembler è tutto definito "non gestito", dal momento che nessun CLR è coinvolto. Sei responsabile per l'allocazione/disallocazione della memoria.

Marshalling è il processo tra codice gestito e codice non gestito; È uno dei servizi più importanti offerti dallo CLR.

Problemi correlati