Penyusunan Interop

Penyusunan interop mengatur bagaimana data diteruskan dalam argumen metode dan nilai yang ditampilkan antara memori terkelola dan tidak dikelola selama panggilan. Penyusunan interop adalah aktivitas run-time yang dilakukan oleh layanan penyusunan runtime bahasa umum.

Sebagian besar jenis data memiliki representasi umum dalam memori terkelola dan tidak dikelola. Penyusun interop menangani jenis ini untuk Anda. Jenis lain bisa ambigu atau tidak diwakili sama sekali dalam memori terkelola.

Jenis ambigu dapat memiliki beberapa representasi tidak terkelola yang dipetakan ke satu jenis terkelola, atau informasi jenis yang hilang, seperti ukuran larik. Untuk jenis ambigu, penyusun menyediakan representasi default dan representasi alternatif tempat beberapa representasi berada. Anda dapat memberikan instruksi eksplisit kepada penyusun tentang cara menyusun jenis yang ambigu.

Model Interop COM dan Pemanggilan Platform

Runtime bahasa umum menyediakan dua mekanisme untuk beroperasi dengan kode yang tidak dikelola:

  • Platform invoke, yang memungkinkan kode terkelola untuk memanggil fungsi yang diekspor dari pustaka yang tidak terkelola.
  • Interop COM, yang memungkinkan kode terkelola untuk berinteraksi dengan objek Model Objek Komponen (COM) melalui antarmuka.

Pemanggilan platform dan interop COM menggunakan penyusunan interop untuk secara akurat memindahkan argumen metode antara pemanggil dan yang dipanggil dan kembali, jika perlu. Seperti yang ditunjukkan dalam ilustrasi berikut, panggilan metode pemanggilan platform mengalir dari kode terkelola ke kode yang tidak dikelola dan tidak pernah dengan cara lain, kecuali saat fungsi panggilan balik digunakan. Meskipun panggilan platform invoke hanya dapat mengalir dari kode yang dikelola ke kode yang tidak dikelola, data dapat mengalir ke dua arah sebagai parameter input atau output. Panggilan metode interop COM dapat mengalir ke kedua arah.

Platform invoke

Pada tingkat terendah, kedua mekanisme menggunakan layanan penyusunan interop yang sama; namun, jenis data tertentu didukung secara khusus oleh interop COM atau pemanggilan platform. Untuk detailnya, lihat Perilaku Penyusunan Default.

Apartemen COM dan Penyusunan

Penyusun interop menyusun data antara timbunan runtime bahasa umum dan timbunan yang tidak dikelola. Penyusunan terjadi setiap kali pemanggil dan penerima panggilan tidak dapat beroperasi pada instans data yang sama. Penyusun interop memungkinkan pemanggil dan penerima panggilan muncul beroperasi pada data yang sama meskipun memiliki salinan datanya sendiri.

COM juga memiliki penyusun yang menyusun data antara apartemen COM atau proses COM yang berbeda. Saat memanggil antara kode terkelola dan tidak dikelola di dalam apartemen COM yang sama, penyusun interop adalah satu-satunya penyusun yang digunakan. Saat memanggil antara kode terkelola dan kode yang tidak dikelola di apartemen COM yang berbeda atau proses yang berbeda, penyusun interop dan penyusun COM digunakan.

Klien COM dan Server Terkelola

Server terkelola yang diekspor dengan pustaka jenis yang didaftarkan oleh Regasm.exe (Alat Pendaftaran Perakitan) memiliki ThreadingModel entri registri yang diatur menjadi Both. Nilai ini menunjukkan bahwa server dapat diaktifkan di apartemen alur tunggal (STA) atau apartemen beberapa alur (MTA). Objek server dibuat di apartemen yang sama dengan pemanggilnya, seperti yang ditunjukkan pada tabel berikut:

klien COM Server .NET Persyaratan penyusunan
STA Both menjadi STA. Penyusunan apartemen yang sama.
MTA Both menjadi MTA. Penyusunan apartemen yang sama.

Karena klien dan server berada di apartemen yang sama, layanan penyusunan interop menangani semua penyusunan data secara otomatis. Ilustrasi berikut menunjukkan layanan penyusunan interop yang beroperasi antara timbunan terkelola dan tidak dikelola di dalam apartemen bergaya COM yang sama.

Interop marshalling between managed and unmanaged heaps

Jika Anda berencana untuk mengekspor server terkelola, pahami 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 properti System.STAThreadAttribute, System.MTAThreadAttribute, Thread.ApartmentState, atau Page.AspCompatMode untuk memeriksa dan mengubah pengaturan apartemen klien terkelola.

Penulis komponen menetapkan afinitas utas dari server COM. Tabel berikut menunjukkan kombinasi setelan apartemen untuk klien .NET dan server COM. Ini juga menunjukkan persyaratan penyusunan yang dihasilkan untuk kombinasi.

Klien .NET Server COM Persyaratan penyusunan
MTA (default) MTA

STA
Penyusunan interop.

Penyusunan interop dan COM.
STA MTA

STA
Penyusunan interop dan COM.

Penyusunan interop.

Saat klien terkelola dan server yang tidak dikelola berada di apartemen yang sama, layanan penyusunan interop menangani semua penyusunan data. Namun, saat klien dan server diinsialisasi di apartemen yang berbeda, penyusunan COM juga diperlukan. Ilustrasi berikut menunjukkan elemen panggilan lintas-apartemen:

Cross-apartment call between a .NET client and COM object

Untuk penyusunan lintas apartemen, Anda dapat melakukan tindakan berikut:

  • Terima overhead penyusunan lintas apartemen, yang hanya terlihat saat ada banyak panggilan melintasi batas. Anda harus mendaftarkan jenis pustaka komponen COM agar panggilan berhasil melewati batas apartemen.

  • Ubah utas utama dengan mengatur utas klien ke STA atau MTA. Misalnya, jika klien C# Anda memanggil banyak komponen STA COM, Anda dapat menghindari penyusunan lintas apartemen dengan mengatur rangkaian utama ke STA.

    Catatan

    Setelah rangkaian klien C# diatur ke STA, panggilan ke komponen MTA COM akan memerlukan penyusunan lintas apartemen.

Untuk petunjuk tentang memilih model apartemen secara eksplisit, lihat Pembuatan Rangkaian Terkelola dan Tidak Terkelola.

Menyusun Panggilan Jarak Jauh

Seperti halnya penyusunan lintas apartemen, penyusunan COM digunakan dalam setiap panggilan antara kode terkelola dan tidak dikelola setiap kali objek berada dalam proses yang terpisah. Misalnya:

  • 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 penyusunan interop dan penyusunan COM menyediakan saluran komunikasi lintas batas proses dan batas:

Cross-process marshalling

Mempertahankan Identitas

Runtime bahasa umum mempertahankan identitas referensi terkelola dan tidak terkelola. Ilustrasi berikut menunjukkan alur referensi langsung yang tidak dikelola (baris atas) dan referensi terkelola langsung (baris bawah) lintas batas proses dan host.

COM callable wrapper and runtime callable wrapper

Dalam ilustrasi ini:

  • Klien yang tidak dikelola mendapatkan referensi ke objek COM dari objek yang dikelola 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.

    Catatan

    Pustaka jenis yang diekspor dari server terkelola harus didaftarkan.

Jumlah batasan proses antara pemanggil dan yang dipanggil tidak relevan; referensi langsung yang sama terjadi untuk panggilan dalam proses dan di luar proses.

Jarak Jauh Terkelola

Runtime juga menyediakan jarak jauh terkelola, yang dapat Anda gunakan untuk membuat saluran komunikasi antara objek yang dikelola melintasi batas proses dan host. Jarak jauh terkelola dapat mengakomodasi firewall antara komponen yang berkomunikasi, seperti yang ditunjukkan ilustrasi berikut:

SOAP or TcpChannel Panggilan jarak jauh di seluruh firewall menggunakan SOAP atau kelas TcpChannel

Beberapa panggilan tidak terkelola dapat disalurkan melalui SOAP, seperti panggilan antara komponen yang dilayani dan COM.

Judul Deskripsi
Perilaku Penyusunan Default Menjelaskan aturan yang digunakan layanan penyusunan interop untuk menyusun data.
Menyusun Data dengan Pemanggilan Platform Menjelaskan cara mendeklarasikan parameter metode dan meneruskan argumen ke fungsi yang diekspor oleh pustaka yang tidak dikelola.
Menyusun Data dengan Interop COM Menjelaskan cara menyesuaikan pembungkus COM untuk mengubah perilaku penyusunan.
Cara: Migrasi Kode Terkelola DCOM ke WCF Menjelaskan cara bermigrasi dari DCOM ke WCF.
Cara: Memetakan HRESULT dan Pengecualian Menjelaskan cara memetakan pengecualian khusus ke HRESULTs dan menyediakan pemetaan lengkap dari setiap HRESULT ke kelas pengecualian yang sebanding di .NET Framework.
Interoperasi Menggunakan Jenis Generik Menjelaskan tindakan yang didukung saat menggunakan jenis generik untuk interoperabilitas COM.
Menginteroperasikan dengan Unmanaged Code Menjelaskan layanan interoperabilitas yang disediakan oleh common language runtime.
Interoperabilitas COM Tingkat Lanjut Menyediakan tautan ke informasi selengkapnya tentang memasukkan komponen COM ke dalam aplikasi .NET Framework Anda.
Pertimbangan Desain untuk Interoperasi Memberikan tips untuk menulis komponen COM terintegrasi.

Referensi

System.Runtime.InteropServices