Marshal.ReleaseComObject(Object) Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Mengurangi jumlah referensi Runtime Callable Wrapper (RCW) yang terkait dengan objek COM yang ditentukan.
public:
static int ReleaseComObject(System::Object ^ o);
[System.Security.SecurityCritical]
public static int ReleaseComObject (object o);
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public static int ReleaseComObject (object o);
public static int ReleaseComObject (object o);
[<System.Security.SecurityCritical>]
static member ReleaseComObject : obj -> int
[<System.Runtime.Versioning.SupportedOSPlatform("windows")>]
static member ReleaseComObject : obj -> int
static member ReleaseComObject : obj -> int
Public Shared Function ReleaseComObject (o As Object) As Integer
Parameter
- o
- Object
Objek COM yang akan dilepaskan.
Mengembalikan
Nilai baru jumlah referensi RCW yang terkait dengan o
. Nilai ini biasanya nol karena RCW hanya menyimpan satu referensi ke objek COM yang dibungkus terlepas dari jumlah klien terkelola yang memanggilnya.
- Atribut
Pengecualian
o
bukan objek COM yang valid.
o
adalah null
.
Keterangan
Metode ini digunakan untuk secara eksplisit mengontrol masa pakai objek COM yang digunakan dari kode terkelola. Anda harus menggunakan metode ini untuk membebaskan objek COM yang mendasarinya yang menyimpan referensi ke sumber daya secara tepat waktu atau ketika objek harus dikosongkan dalam urutan tertentu.
Setiap kali penunjuk antarmuka COM memasuki runtime bahasa umum (CLR), ia dibungkus dalam RCW.
RCW memiliki jumlah referensi yang bertambah setiap kali penunjuk antarmuka COM dipetakan ke dalamnya. Metode ini ReleaseComObject mengurangi jumlah referensi RCW. Ketika jumlah referensi mencapai nol, runtime melepaskan semua referensinya pada objek COM yang tidak dikelola, dan melempar System.NullReferenceException jika Anda mencoba menggunakan objek lebih lanjut. Jika antarmuka COM yang sama diteruskan lebih dari satu kali dari kode yang tidak dikelola ke kode terkelola, jumlah referensi pada pembungkus bertambah setiap kali, dan panggilan ReleaseComObject mengembalikan jumlah referensi yang tersisa.
Metode ini memungkinkan Anda untuk memaksa rilis jumlah referensi RCW sehingga terjadi dengan tepat ketika Anda menginginkannya. Namun, penggunaan ReleaseComObject yang tidak tepat dapat menyebabkan aplikasi Anda gagal, atau dapat menyebabkan pelanggaran akses.
Pertimbangkan skenario di mana kode terkelola dalam domain aplikasi memegang RCW yang mewakili komponen COM. Jika Anda memanggil ReleaseComObject metode pada RCW, kode terkelola tidak akan dapat mengakses RCW dan akan menimbulkan InvalidComObjectException pengecualian.
Kesalahan yang lebih serius dapat terjadi jika panggilan ke RCW dijalankan ketika RCW dirilis. Dalam hal ini, ada kemungkinan besar bahwa utas yang melakukan panggilan akan menyebabkan pelanggaran akses. Namun, memori proses mungkin menjadi rusak, dan prosesnya dapat terus berjalan sampai gagal karena alasan yang sangat sulit untuk di-debug.
Risiko ini diperparah ketika komponen COM yang digunakan adalah singleton, karena alasan berikut: CLR mengaktifkan komponen COM dengan memanggil fungsi COM CoCreateInstance , yang mengembalikan penunjuk antarmuka yang sama setiap kali dipanggil untuk komponen COM singleton. Dengan demikian, potongan kode terkelola yang terpisah dan independen dalam domain aplikasi dapat menggunakan RCW yang sama untuk komponen COM singleton, dan jika salah satu memanggil ReleaseComObject metode pada komponen COM, yang lain akan rusak.
Oleh karena itu, gunakan satu-satunya ReleaseComObject jika benar-benar diperlukan. Jika Anda ingin memanggil metode ini untuk memastikan bahwa komponen COM dirilis pada waktu yang ditentukan, pertimbangkan untuk menggunakan metode sebagai gantinya FinalReleaseComObject . FinalReleaseComObject akan merilis komponen COM yang mendasar terlepas dari berapa kali ia telah memasukkan kembali CLR. Jumlah referensi internal RCW bertambah satu per satu setiap kali komponen COM memasukkan kembali CLR. Oleh karena itu, Anda dapat memanggil ReleaseComObject metode dalam perulangan sampai nilai yang dikembalikan adalah nol. Ini mencapai hasil yang sama dengan FinalReleaseComObject metode .