Marshaling - apa itu dan mengapa kita membutuhkannya?


94

Apa itu marshalling dan mengapa kita membutuhkannya?

Saya merasa sulit untuk percaya bahwa saya tidak dapat mengirim intmelalui 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.


3
Faktanya, Anda bisa mengirim 32 bit dengan sinyal awal dan akhir. Itu akan menjadi penulisan marshalling Anda sendiri untuk int. Tetapi bagaimana Anda akan meneruskan kode Dictionary <CustomClassA, List <CustomClassB>> ke C?
Vinko Vrsalovic

4
Ketekunan muncul di benak Anda saat Anda mengatakan "tanpa kabel".
pengguna7116

true mari kita abaikan Endian besar / kecil atau variasi lainnya.

56
Ini pertanyaan yang agak aneh. Ini seperti bertanya "mengapa kita memerlukan sistem pos, padahal kita bisa memiliki sistem di mana pembawa surat mengambil korespondensi, membawanya ke lokasi pusat untuk disortir, dan kemudian mengirimkannya ke penerima?" Tapi ... itu sistem pos. Anda bertanya mengapa kita membutuhkan sistem marshalling padahal kita bisa memiliki ... sistem marshalling. Saya pikir saya kehilangan inti dari pertanyaan Anda. Bisakah Anda menjelaskan?
Eric Lippert

1
Saya pikir cara terbaik untuk memahami ini adalah dengan memahami bagaimana "metode" bekerja dalam perakitan - bagaimana alamat instruksi terakhir disimpan di tumpukan, parameter dilewatkan melalui tumpukan, register penunjuk tumpukan dimodifikasi dengan metode, penunjuk instruksi register digunakan, dan, secara khusus, bagaimana mungkin ada sedikit variasi dalam teknik yang berbeda untuk menerapkan metode. Akibatnya, memahami "kawat" harus menjelaskan pertanyaan Anda.
ylax

Jawaban:


77

Karena bahasa dan lingkungan yang berbeda memiliki konvensi pemanggilan yang berbeda, konvensi tata letak yang berbeda, ukuran primitif yang berbeda (lih. charDi C # dan chardi 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.


26

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 .


11

Marshalling an intidealnya 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.


3
Apakah Marshalling benar-benar melakukan operasi penyalinan? Saya melihat operasi pemrosesan gambar waktu nyata, dan lebih memilih untuk tidak membuat salinan semua yang ada di memori.
ias

7

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 .


7

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.


2

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).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.