Wie wir alle wissen, sind Programmierer in der .net-Welt nur für die Erstellung neuer Objekte verantwortlich, und die Zerstörung von Objekten wird vollständig dem Garbage Collector überlassen. Nur wenn die Garbage Collection stattfindet, werden Typen in .net zerstört. Dies verursacht normalerweise nichts Schlimmes. Besondere Probleme treten jedoch bei der Verwendung nicht verwalteter COM-Objekte auf.
COM verwendet die Referenzzählung, um die Lebensdauer des Objekts zu bestimmen. Jedes Mal, wenn der COM-Client auf das Objekt verweist, ruft es auf
IUnKnown->AddRef() und jedes Mal, wenn das Objekt freigegeben wird, wird es aufgerufen
IUnKnown->Release() gibt die Instanz frei, sobald der Referenzzähler Null erreicht.
Wenn das Problem auftritt, schauen wir uns den folgenden Code an:
Dies ist ein C#-Code, der die Excel-COM-Komponente verwendet, um Excel-Dateien an den Client zu exportieren, der in der asp.net-Version von CSDN weit verbreitet ist. Vor dem Hinzufügen dieses Codes wurde der Assistent zum Hinzufügen von COM-Referenzen ausgeführt.
Excel.Anwendung oExcel;
Excel.Workbook oBook;
Object oMissing = System.Reflection.Missing.Value;
oExcel = new Excel.Application();
oBook = oExcel.Workbooks.Add(oMissing);
for (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;
string filename = DateTime.Now.Ticks.ToString();
string mm=Server.MapPath( ".")+ "\" + Dateiname + ".xls";//Serverspeicheradresse
oExcel.ActiveWorkbook.SaveCopyAs (mm);
oExcel.Quit();
//GC.Collect();
Response.Redirect(filename+".xls");
Dieser Code kann die Funktion zum Exportieren von Dateien realisieren. Wenn Sie sich jedoch den Windows-Task-Manager ansehen, finden Sie die unten gezeigte wunderbare Szene
Also hat jemand „GC.Collect();“ zum Code hinzugefügt. Sehr gut, es gibt nicht so viele EXCEL.EXEs, wie unten gezeigt.
Doch wie erreichen wir eine vollständige Freigabe?
Glücklicherweise dürfen Programmierer in .net die Release-Methode von com explizit aufrufen. Diese Methode wird von .net gepackt und heißt im obigen Code System.Runtime.InteropServices.Marshal.ReleaseComObject.
Bevor Sie „GC.Collect();“ aufrufen, rufen Sie zunächst „System.Runtime.InteropServices.Marshal.ReleaseComObject((object)oExcel);“ auf.
Verringern Sie den Referenzzähler um eins, sodass der Referenzzähler Null wird. Bei der Garbage Collection wird das COM-Objekt, das oExcel entspricht, gelöscht.