كما نعلم جميعًا، في عالم .net، يتحمل المبرمجون مسؤولية إنشاء كائنات جديدة فقط، ويتم ترك تدمير الكائنات بالكامل لجامعي البيانات المهملة فقط عند حدوث جمع البيانات المهملة، سيتم تدمير الأنواع الموجودة في .net. هذا عادة لا يسبب أي خطأ. ومع ذلك، تنشأ مشاكل خاصة عند استخدام كائنات COM غير المُدارة.
يستخدم COM العد المرجعي لتحديد عمر الكائن في كل مرة يشير فيها عميل COM إلى الكائن، فإنه يستدعي
IUnKnown->AddRef()، ويتم استدعاؤه في كل مرة يتم فيها تحرير الكائن
IUnKnown->Release()، يقوم بتحرير المثيل بمجرد وصول عدد المرجع إلى الصفر.
ظهرت المشكلة، دعونا نلقي نظرة على الكود التالي:
هذا هو رمز c# الذي يستخدم مكون excel com لتصدير ملفات excel إلى العميل والتي يتم تداولها على نطاق واسع في إصدار asp.net من CSDN، قبل إضافة هذا الرمز، تم تشغيل معالج إضافة مراجع com.
Excel.Application oExcel;
Excel.Workbook oBook؛
Object oMissing = System.Reflection.Missing.Value;
oExcel = new 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 = true;
oExcel.UserControl = false;
اسم ملف السلسلة = DateTime.Now.Ticks.ToString();
string mm=Server.MapPath( ".")+ "\" + اسم الملف + ".xls";// عنوان تخزين الخادم
oExcel.ActiveWorkbook.SaveCopyAs (mm)؛
oExcel.Quit();
//GC.Collect();
Response.Redirect(filename+".xls");
يمكن لهذا الكود أن يدرك وظيفة تصدير الملفات، لكن إذا نظرت إلى مدير مهام Windows ستجد المشهد الرائع كما هو موضح أدناه
لذلك، أضاف شخص ما "GC.Collect();" إلى التعليمات البرمجية جيد جدًا، ولا يوجد الكثير من ملفات EXCEL.EXE، كما هو موضح أدناه.
ولكن كيف يمكننا تحقيق التحرير الكامل؟
لحسن الحظ، في .net، يُسمح للمبرمجين باستدعاء طريقة الإصدار الخاصة بـ com بأنفسهم بشكل صريح. يتم حزم هذه الطريقة بواسطة .net وتسمى System.Runtime.InteropServices.Marshal.ReleaseComObject في الكود أعلاه.
قبل استدعاء "GC.Collect();"، اتصل أولاً بـ "System.Runtime.InteropServices.Marshal.ReleaseComObject((object)oExcel);"
قم بتقليل عدد المرجع بمقدار واحد، بحيث يصبح عدد المرجع صفرًا. عند حدوث مجموعة البيانات المهملة، سيتم مسح كائن COM المطابق لـ oExcel.