Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Interop marshalling mengatur bagaimana data diteruskan dalam argumen metode serta nilai pengembalian antara memori terkelola dan tidak terkelola selama panggilan. Interop marshalling adalah aktivitas runtime yang dilakukan oleh layanan marshalling runtime bahasa umum.
Sebagian besar jenis data memiliki representasi umum dalam memori terkelola dan tidak terkelola. Marshaller interop mengelola tipe-tipe ini bagi Anda. Jenis lain dapat ambigu atau tidak diwakili sama sekali dalam memori terkelola.
Jenis ambigu dapat memiliki beberapa representasi tidak terkelola yang memetakan ke satu jenis terkelola, atau informasi jenis yang hilang, seperti ukuran array. Untuk jenis ambigu, marshaller menyediakan representasi default dan representasi alternatif di mana beberapa representasi ada. Anda dapat memberikan instruksi eksplisit kepada marshaller tentang cara memarshall jenis yang ambigu.
Model Invoke Platform dan COM Interop
Runtime bahasa umum menyediakan dua mekanisme untuk beroperasi dengan kode yang tidak dikelola:
- Panggilan Platform, yang memungkinkan kode terkelola untuk memanggil fungsi yang diekspor dari perpustakaan tidak terkelola.
- Interop COM, yang memungkinkan kode terkelola berinteraksi dengan objek Model Objek Komponen (COM) melalui antarmuka.
Baik pemanggilan platform interop maupun COM menggunakan interop marshalling untuk memindahkan argumen metode secara akurat antara penelepon dan penerima panggilan dan kembali, jika diperlukan. Seperti yang ditunjukkan oleh ilustrasi berikut, panggilan metode platform berpindah dari kode yang dikelola ke yang tidak dikelola dan tidak pernah sebaliknya, kecuali ketika fungsi panggilan balik terlibat. Meskipun panggilan platform invoke hanya dapat mengalir dari kode terkelola ke kode tidak terkelola, data dapat mengalir dalam kedua arah sebagai parameter input atau output. Panggilan metode interop COM dapat mengalir ke arah mana pun.
Pada tingkat terendah, kedua mekanisme menggunakan layanan interop marshalling yang sama; namun, jenis data tertentu didukung secara eksklusif oleh interop COM atau pemanggilan platform. Untuk detailnya, lihat Perilaku Marshalling Default.
Marshalling dan Apartemen COM
Marshaller interop menangani data antara memori Common Language Runtime (CLR) dan memori yang tidak dikelola. Marshalling terjadi setiap kali penelepon dan penerima panggilan tidak dapat beroperasi pada instans data yang sama. Marshaller interop memungkinkan penelepon dan penerima panggilan tampaknya beroperasi pada data yang sama bahkan jika mereka memiliki salinan data mereka sendiri.
COM juga memiliki marshaller yang mengelola data antar apartemen-apartemen COM atau proses-proses COM yang berbeda. Ketika memanggil antara kode terkelola dan tidak terkelola dalam apartemen COM yang sama, interop marshaller adalah satu-satunya marshaller yang terlibat. Saat memanggil antara kode terkelola dan kode tak terkelola di komponen COM yang berbeda atau proses yang berbeda, marshaller interop dan marshaller COM terlibat.
Klien COM dan Server Terkelola
Server yang dikelola dan diekspor dengan pustaka tipe yang didaftarkan oleh Regasm.exe (Alat Pendaftaran Perakitan), memiliki entri registri yang ThreadingModel ditetapkan ke Both. Nilai ini menunjukkan bahwa server dapat diaktifkan di apartemen berulir tunggal (STA) atau apartemen multithreaded (MTA). Objek server dibuat di apartemen yang sama dengan pemanggilnya, seperti yang ditunjukkan dalam tabel berikut:
| Klien COM | Server .NET | Persyaratan pengaturan |
|---|---|---|
| STA |
Both berubah menjadi STA. |
Pengaturan apartemen yang sama. |
| MTA |
Both menjadi MTA. |
Pengaturan apartemen yang sama. |
Karena klien dan server berada di apartemen yang sama, layanan interop marshalling secara otomatis menangani semua pengelolaan data. Ilustrasi berikut menunjukkan layanan marshalling interop yang beroperasi antara tumpukan terkelola dan tidak terkelola dalam apartemen bergaya COM yang sama.
Jika Anda berencana untuk mengekspor server terkelola, ketahuilah bahwa klien COM menentukan apartemen server. Server terkelola yang dipanggil oleh klien COM yang diinisialisasi dalam MTA harus memastikan keamanan utas.
Klien Terkelola dan Server COM
Pengaturan default untuk apartemen klien terkelola adalah MTA; namun, jenis aplikasi klien .NET dapat mengubah pengaturan default. Misalnya, pengaturan apartemen klien Visual Basic adalah STA. Anda dapat menggunakan System.STAThreadAttribute, System.MTAThreadAttribute properti, Thread.ApartmentState properti, atau Page.AspCompatMode properti untuk memeriksa dan mengubah pengaturan apartemen klien terkelola.
Penulis komponen mengatur afinitas utas server COM. Tabel berikut menunjukkan kombinasi pengaturan apartemen untuk klien .NET dan server COM. Ini juga menunjukkan kebutuhan marshalling yang timbul untuk kombinasi.
| Klien .NET | Server COM | Persyaratan pengaturan |
|---|---|---|
| MTA (bawaan) | MTA STA |
Pengelolaan antaroperabilitas (Interop) dan marshalling. Interop dan COM marshalling. |
| STA | MTA STA |
Interop dan COM marshalling. Pengelolaan antaroperabilitas (Interop) dan marshalling. |
Ketika klien terkelola dan server tidak terkelola berada di apartemen yang sama, layanan interop marshalling menangani semua pemrosesan data. Namun, ketika klien dan server diinisialisasi di apartemen yang berbeda, marshalling COM juga diperlukan. Ilustrasi berikut menunjukkan elemen panggilan lintas apartemen:
Untuk marshalling lintas apartemen, Anda dapat melakukan hal berikut:
Terima biaya overhead untuk marshalling antar apartemen, yang hanya terlihat ketika ada banyak panggilan yang melintasi batas. Anda harus mendaftarkan pustaka jenis komponen COM agar panggilan berhasil melewati batas apartemen.
Ubah utas utama dengan menetapkan utas klien menjadi STA atau MTA. Misalnya, jika klien C# Anda memanggil banyak komponen STA COM, Anda dapat menghindari marshalling lintas apartemen dengan mengatur utas utama ke STA.
Nota
Setelah utas klien C# diatur ke STA, panggilan ke komponen MTA COM akan memerlukan proses marshalling untuk lintas apartemen.
Untuk petunjuk tentang memilih model apartemen secara eksplisit, lihat Utas Terkelola dan Tidak Terkelola.
Pengaturan Panggilan Jarak Jauh
Seperti halnya marshalling lintas apartemen, marshalling COM berperan dalam setiap pemanggilan antara kode yang dikelola dan tidak dikelola di mana objek berada pada proses yang berbeda. Contohnya:
- Klien COM yang memanggil server terkelola pada host jarak jauh menggunakan COM terdistribusi (DCOM).
- Klien terkelola yang memanggil server COM pada host jarak jauh menggunakan DCOM.
Ilustrasi berikut menunjukkan bagaimana interop marshalling dan COM marshalling menyediakan saluran komunikasi di seluruh batas proses dan host:
Mempertahankan Identitas
CLR (Common Language Runtime) mempertahankan identitas referensi terkelola dan tidak terkelola. Ilustrasi berikut menunjukkan alur referensi tidak terkelola langsung (baris atas) dan referensi terkelola langsung (baris bawah) di seluruh batas proses dan host.
Dalam ilustrasi ini:
Klien yang tidak dikelola mendapatkan referensi ke objek COM dari objek terkelola yang mendapatkan referensi ini dari host jarak jauh. Mekanisme jarak jauh adalah DCOM.
Klien terkelola mendapatkan referensi ke objek terkelola dari objek COM yang mendapatkan referensi ini dari host jarak jauh. Mekanisme jarak jauh adalah DCOM.
Nota
Pustaka tipe yang diekspor dari server terkelola harus didaftarkan.
Jumlah batas proses antara penelepon dan penerima panggilan tidak relevan; referensi langsung yang sama terjadi untuk panggilan dalam proses dan di luar proses.
Pengelolaan Jarak Jauh
Runtime juga menyediakan remoting terkelola, yang dapat Anda gunakan untuk membangun saluran komunikasi antara objek terkelola melintasi batas proses dan host. Akses jarak jauh terkelola dapat mengakomodasi firewall di antara komponen komunikasi, seperti yang ditunjukkan dalam ilustrasi berikut:
Panggilan Panggilan jarak jauh melintasi firewall menggunakan SOAP atau kelas TcpChannel
Beberapa panggilan yang tidak dikelola dapat disalurkan melalui SOAP, seperti panggilan antara komponen layanan dan COM.
Topik Terkait
| Judul | Deskripsi |
|---|---|
| Perilaku Penyusunan Default | Menjelaskan aturan yang digunakan layanan marshalling interop untuk data marshal. |
| Marshalling Data dengan Platform Invoke | Menjelaskan cara mendeklarasikan parameter metode dan meneruskan argumen ke fungsi yang diekspor oleh pustaka yang tidak dikelola. |
| Pengelompokan Data dengan COM Interop | Menjelaskan bagaimana menyesuaikan pembungkus COM untuk mengubah perilaku marshalling. |
| Cara: Memigrasikan Managed-Code DCOM ke WCF | Menjelaskan cara bermigrasi dari DCOM ke WCF. |
| Cara Memetakan HRESULT dan Pengecualian | Menjelaskan cara memetakan pengecualian kustom ke HRESULT dan menyediakan pemetaan lengkap dari setiap HRESULT ke kelas pengecualian yang sebanding di .NET Framework. |
| Mengoperasikan Menggunakan Jenis Generik | Menjelaskan tindakan mana yang didukung saat menggunakan jenis generik untuk interoperabilitas COM. |
| Menginteroperasikan dengan Unmanaged Code | Menjelaskan layanan interoperabilitas yang disediakan oleh bahasa umum runtime. |
| Interoperabilitas COM Tingkat Lanjut | Menyediakan tautan ke informasi selengkapnya tentang memasukkan komponen COM ke dalam aplikasi .NET Framework Anda. |
| Pertimbangan Desain untuk Interoperabilitas | Menyediakan tips untuk menulis komponen COM terintegrasi. |