Pembungkus yang Dapat Dipanggil Runtime

Runtime bahasa umum mengekspos objek COM melalui proksi yang disebut pembungkus yang dapat dipanggil runtime (RCW). Meskipun RCW tampaknya merupakan objek biasa untuk klien .NET, fungsi utamanya adalah untuk mengerahkan panggilan antara klien .NET dan objek COM.

Runtime membuat tepat satu RCW untuk setiap objek COM, terlepas dari jumlah referensi yang ada pada objek tersebut. Runtime menjaga satu RCW per proses untuk setiap objek. Jika Anda membuat RCW dalam satu domain aplikasi atau apartemen, dan kemudian meneruskan referensi ke domain aplikasi atau apartemen lain, proksi ke objek pertama akan digunakan. Perhatikan bahwa proksi ini adalah objek terkelola baru dan tidak sama dengan RCW awal; artinya dua objek terkelola tersebut tidak setara tetapi mewakili objek COM yang sama. Seperti yang ditunjukkan ilustrasi berikut, berapa pun klien terkelola dapat menyimpan referensi ke objek COM yang mengekspos antarmuka INew dan INewer.

Gambar berikut menunjukkan proses untuk mengakses objek COM melalui pembungkus yang dapat dipanggil runtime:

Process for accessing COM objects through the RCW.

Menggunakan metadata yang berasal dari pustaka jenis, runtime membuat objek COM yang dipanggil dan pembungkus untuk objek tersebut. Setiap RCW mempertahankan satu cache pointer antarmuka pada objek COM yang dibungkusnya dan melepaskan referensinya pada objek COM ketika RCW tidak lagi diperlukan. Runtime melakukan pengumpulan sampah di RCW.

Di antara kegiatan lainnya, RCW mengawal data antara kode terkelola dan tidak terkelola, atas nama objek yang dibungkus. Secara khusus, RCW mengawal argumen metode dan nilai pengembalian metode setiap kali klien dan server memiliki pernyataan yang berbeda atas data yang diteruskan di antara keduanya.

Pembungkus standar memberlakukan aturan pengawalan bawaan. Misalnya, ketika klien .NET meneruskan jenis string sebagai bagian dari argumen ke objek yang tidak dikelola, pembungkus mengonversi string menjadi jenis BSTR. Jika objek COM mengembalikan BSTR ke pemanggil terkelolanya, pemanggil akan menerima string. Klien dan server mengirim dan menerima data yang sudah mereka kenali. Jenis lain tidak memerlukan konversi. Misalnya, pembungkus standar akan selalu meneruskan bilangan bulat 4 byte antara kode terkelola dan tidak terkelola tanpa mengonversi jenisnya.

Mengawal antarmuka yang dipilih

Tujuan utama pembungkus yang dapat dipanggil runtime (RCW) adalah untuk menyembunyikan perbedaan antara model pemrograman yang dikelola dan tidak dikelola. Untuk membuat transisi yang mulus, RCW menggunakan antarmuka COM yang dipilih tanpa mengeksposnya ke klien .NET, seperti yang ditunjukkan dalam ilustrasi berikut.

Gambar berikut menunjukkan antarmuka COM dan pembungkus yang dapat dipanggil runtime:

Screenshot of the runtime callable wrapper with interfaces.

Saat dibuat sebagai objek terikat awal, RCW adalah jenis tertentu. RCW mengimplementasikan antarmuka yang diterapkan objek COM dan mengekspos metode, properti, dan peristiwa dari antarmuka objek tersebut. Dalam ilustrasi, RCW mengekspos antarmuka INew tetapi menggunakan antarmuka IUnknown dan IDispatch. Selanjutnya, RCW mengekspos semua anggota antarmuka INew ke klien .NET.

RCW menggunakan antarmuka yang tercantum dalam tabel berikut, yang diekspos oleh objek yang dibungkusnya.

Antarmuka Deskripsi
IDispatch Untuk pengikatan terlambat ke objek COM melalui pantulan.
IErrorInfo Menyediakan deskripsi tekstual tentang kesalahan, sumbernya, file Bantuan, konteks Bantuan, dan GUID antarmuka yang menentukan kesalahan (selalu GUID_NULL untuk kelas .NET).
IProvideClassInfo Jika objek COM yang dibungkus mengimplementasikan IProvideClassInfo, RCW mengekstrak informasi jenis dari antarmuka ini untuk memberikan identitas jenis yang lebih baik.
IUnknown Untuk identitas objek, koersi jenis, dan manajemen seumur hidup:

- Identitas objek
Runtime membedakan antara objek COM dengan membandingkan nilai antarmuka IUnknown untuk setiap objek.
- Koersi jenis
RCW mengenali penemuan jenis dinamis yang dilakukan oleh metode QueryInterface.
- Manajemen seumur hidup
Dengan menggunakan metode QueryInterface, RCW mendapatkan dan menyimpan referensi ke objek yang tidak dikelola hingga runtime melakukan pengumpulan sampah pada pembungkus, yang melepaskan objek yang tidak dikelola.

RCW menggunakan antarmuka yang tercantum dalam tabel berikut, yang diekspos oleh objek yang dibungkusnya.

Antarmuka Deskripsi
IConnectionPoint dan IConnectionPointContainer RCW mengonversi objek yang mengekspos gaya peristiwa titik koneksi ke peristiwa berbasis delegasi.
IDispatchEx (Hanya .NET Framework) Jika kelas mengimplementasikan IDispatchEx, RCW mengimplementasikan IExpando. Antarmuka IDispatchEx adalah ekstensi antarmuka IDispatch yang, tidak seperti IDispatch, memungkinkan enumerasi, penambahan, penghapusan, dan panggilan anggota yang peka huruf besar/kecil.
IEnumVARIANT Memungkinkan jenis COM yang mendukung enumerasi untuk diperlakukan sebagai koleksi.

Lihat juga