ดังที่เราทุกคนทราบกันดีว่าในโลกของ .net โปรแกรมเมอร์มีหน้าที่สร้างวัตถุโดยใช้สิ่งใหม่เท่านั้น และการทำลายวัตถุนั้นตกเป็นหน้าที่ของผู้รวบรวมขยะโดยสิ้นเชิงเท่านั้น เมื่อมีการรวบรวมขยะ ประเภทต่างๆ ใน .net จะถูกทำลาย ซึ่งมักจะไม่ทำให้เกิดสิ่งผิดปกติ อย่างไรก็ตาม ปัญหาพิเศษเกิดขึ้นเมื่อใช้วัตถุ COM ที่ไม่มีการจัดการ
COM ใช้การนับการอ้างอิงเพื่อกำหนดอายุการใช้งานของวัตถุ ทุกครั้งที่ไคลเอนต์ COM อ้างอิงวัตถุ จะเรียก
IUnKnown->AddRef() และทุกครั้งที่อ็อบเจ็กต์ถูกรีลีส อ็อบเจ็กต์จะถูกเรียก
IUnKnown->Release() ปล่อยอินสแตนซ์เมื่อจำนวนการอ้างอิงถึงศูนย์
ปัญหาเกิดขึ้น ลองดูที่รหัสต่อไปนี้:
นี่คือโค้ด c# ที่ใช้ส่วนประกอบ excel com เพื่อส่งออกไฟล์ Excel ไปยังไคลเอ็นต์ที่มีการเผยแพร่อย่างกว้างขวางใน CSDN เวอร์ชัน asp.net ก่อนที่จะเพิ่มโค้ดนี้ ตัวช่วยสร้างสำหรับการเพิ่มการอ้างอิง com จะถูกเรียกใช้
Excel แอปพลิเคชัน oExcel;
Excel.Workbook oBook;
วัตถุ oMissing = System.Reflection.Missing.Value;
oExcel = Excel.Application ใหม่ ();
oBook = oExcel.Workbooks.Add (oMissing);
สำหรับ (int i=1;i <=4;i++)
-
oExcel.Cells[i,1]=i.ToString();
oExcel.Cells[i,2]= "'bbb2 ";
oExcel.Cells[i,3]= "'ccc3 ";
oExcel.Cells[i,4]= "'aaa4 ";
-
oBook.Saved = จริง;
oExcel.UserControl = เท็จ;
ชื่อไฟล์สตริง = DateTime.Now.Ticks.ToString();
string mm=Server.MapPath( ".")+ "\" + ชื่อไฟล์ + ".xls";//ที่อยู่เก็บข้อมูลเซิร์ฟเวอร์
oExcel.ActiveWorkbook.SaveCopyAs (มม.);
oExcel.Quit();
//GC.Collect();
Response.Redirect(ชื่อไฟล์+".xls");
รหัสนี้สามารถรับรู้ถึงฟังก์ชั่นการส่งออกไฟล์ แต่ถ้าคุณดูที่ Windows Task Manager คุณจะพบฉากที่ยอดเยี่ยมดังที่แสดงด้านล่าง
มีคนเพิ่ม "GC.Collect();" ลงในโค้ด ดีมาก มี EXCEL.EXE ไม่มากนักดังที่แสดงด้านล่าง
แต่เราจะบรรลุการเปิดตัวอย่างสมบูรณ์ได้อย่างไร?
โชคดีที่ใน .net โปรแกรมเมอร์ได้รับอนุญาตให้เรียกวิธีการ Release ของ com ได้อย่างชัดเจน วิธีการนี้จัดทำโดย .net และเรียกว่า System.Runtime.InteropServices.Marshal.ReleaseComObject
ก่อนที่จะเรียก "GC.Collect();" ให้เรียก "System.Runtime.InteropServices.Marshal.ReleaseComObject((object)oExcel);" ก่อน
ลดจำนวนการอ้างอิงลงหนึ่ง เพื่อให้จำนวนการอ้างอิงกลายเป็นศูนย์ เมื่อการรวบรวมขยะเกิดขึ้น วัตถุ COM ที่สอดคล้องกับ oExcel จะถูกกวาดออกไป