Apa itu marshalling dan mengapa kita membutuhkannya?
Saya merasa sulit untuk percaya bahwa saya tidak dapat mengirim int
melalui kabel dari C # ke C dan harus mengaturnya. Mengapa C # tidak bisa mengirim 32 bit saja dengan sinyal awal dan akhir, memberi tahu kode C bahwa ia telah menerima int
?
Jika ada tutorial atau situs bagus tentang mengapa kita perlu marshalling dan bagaimana menggunakannya, itu akan bagus.
Jawaban:
Karena bahasa dan lingkungan yang berbeda memiliki konvensi pemanggilan yang berbeda, konvensi tata letak yang berbeda, ukuran primitif yang berbeda (lih.
char
Di C # danchar
di C), konvensi pembuatan / penghancuran objek yang berbeda, dan pedoman desain yang berbeda. Anda memerlukan cara untuk mengeluarkan barang-barang dari tanah yang dikelola dan ke suatu tempat di mana tanah yang tidak dikelola dapat melihat dan memahaminya dan sebaliknya. Untuk itulah marshalling.sumber
Kode .NET (C #, VB) disebut "dikelola" karena "dikelola" oleh CLR ( Common Language Runtime )
Jika Anda menulis kode dalam C atau C ++ atau assembler, semuanya disebut "tidak terkelola", karena tidak ada CLR yang terlibat. Anda bertanggung jawab atas semua alokasi / pembatalan alokasi memori.
Marshaling adalah proses antara kode yang dikelola dan kode yang tidak dikelola; Ini adalah salah satu layanan terpenting yang ditawarkan oleh CLR .
sumber
Marshalling an
int
idealnya persis seperti yang Anda katakan: menyalin memori dari tumpukan terkelola CLR ke suatu tempat di mana kode C dapat melihatnya. Marshalling string, object, array, dan jenis lainnya adalah hal yang sulit.Tetapi lapisan interop P / Invoke menangani hampir semua hal ini untuk Anda.
sumber
Seperti yang dikatakan Vinko di komentar, Anda bisa meneruskan tipe primitif tanpa marshalling khusus. Ini disebut tipe "blittable" dan termasuk tipe seperti byte, short, int, long, dll dan unsigned rekannya.
Halaman ini berisi daftar tipe blittable dan non-blittable .
sumber
Marshalling adalah "media" untuk menginginkan kata atau gateway yang lebih baik, untuk berkomunikasi dengan tipe data dunia yang tidak dikelola dan sebaliknya, dengan menggunakan pinvoke, dan memastikan data dikembalikan kembali dengan cara yang aman.
sumber
Marshalling adalah meneruskan tanda tangan suatu fungsi ke proses berbeda yang ada di mesin berbeda, dan biasanya diimplementasikan dengan konversi data terstruktur ke format khusus, yang dapat ditransfer ke sistem prosesor lain (serialisasi / deserialisasi).
sumber