Seperti yang kita ketahui bersama, di dunia .net, pemrogram hanya bertanggung jawab membuat objek menggunakan yang baru, dan pemusnahan objek sepenuhnya diserahkan kepada pengumpul sampah. Hanya ketika pengumpulan sampah terjadi, tipe di .net akan dimusnahkan. Hal ini biasanya tidak menimbulkan masalah. Namun, masalah khusus muncul ketika menggunakan objek COM yang tidak dikelola.
COM menggunakan penghitungan referensi untuk menentukan masa pakai objek. Setiap kali klien COM mereferensikan objek, ia akan memanggil
IUnKnown->AddRef(), dan setiap kali objek dilepaskan, objek tersebut dipanggil
IUnKnown->Release(), melepaskan instance setelah jumlah referensi mencapai nol.
Masalah muncul, mari kita lihat kode berikut:
Ini adalah kode c# yang menggunakan komponen excel com untuk mengekspor file excel ke klien yang beredar luas di CSDN versi asp.net Sebelum menambahkan kode ini, wizard untuk menambahkan referensi com dijalankan.
Excel.Aplikasi oExcel;
Excel.Buku Kerja oBuku;
Objek oMissing = Sistem.Refleksi.Nilai Hilang;
oExcel = Excel.Aplikasi baru();
oBook = oExcel.Workbooks.Add(oMissing);
untuk (int i=1;i <=4;i++)
{
oExcel.Sel[i,1]=i.ToString();
oExcel.Sel[i,2]= "'bbb2 ";
oExcel.Sel[i,3]= "'ccc3 ";
oExcel.Sel[i,4]= "'aaa4 ";
}
oBuku.Tersimpan = benar;
oExcel.UserControl = salah;
string nama file = DateTime.Sekarang.Ticks.ToString();
string mm=Server.MapPath( ".")+ "\" + nama file + ".xls";//Alamat penyimpanan server
oExcel.ActiveWorkbook.SaveCopyAs (mm);
oExcel.Keluar();
//GC.Kumpulkan();
Respon.Redirect(namafile+".xls");
Kode ini dapat mewujudkan fungsi mengekspor file, tetapi jika Anda melihat Windows Task Manager, Anda akan menemukan pemandangan indah seperti yang ditunjukkan di bawah ini
Jadi, seseorang menambahkan "GC.Collect();" Bagus sekali, EXCEL.EXE tidak begitu banyak, seperti yang ditunjukkan di bawah ini.
Namun bagaimana kita bisa mencapai pembebasan penuh?
Untungnya, di .net, pemrogram diizinkan untuk memanggil sendiri metode Rilis com secara eksplisit. Metode ini dikemas oleh .net dan disebut System.Runtime.InteropServices.Marshal.ReleaseComObject.
Sebelum memanggil "GC.Collect();", panggil dulu "System.Runtime.InteropServices.Marshal.ReleaseComObject((object)oExcel);"
Kurangi jumlah referensi sebanyak satu, sehingga jumlah referensi menjadi nol. Saat pengumpulan sampah terjadi, objek COM yang terkait dengan oExcel akan tersapu.