Bagikan melalui


Marshal.ReleaseComObject(Object) Metode

Definisi

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.

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

Berlaku untuk

Lihat juga