Como todos sabemos, en el mundo .net, los programadores solo son responsables de crear objetos usando nuevos, y la destrucción de los objetos queda completamente en manos del recolector de basura. Solo cuando se produce la recolección de basura, los tipos en .net se destruirán. Por lo general, esto no causa nada malo. Sin embargo, surgen problemas especiales cuando se utilizan objetos COM no administrados.
COM utiliza el recuento de referencias para determinar la vida útil del objeto. Cada vez que el cliente COM hace referencia al objeto, lo llama.
IUnKnown->AddRef(), y cada vez que se libera el objeto, se llama
IUnKnown->Release(), libera la instancia una vez que el recuento de referencias llega a cero.
Surge el problema, veamos el siguiente código:
Este es un código C# que utiliza el componente Excel com para exportar archivos Excel al cliente que circula ampliamente en la versión asp.net de CSDN. Antes de agregar este código, se ejecutó el asistente para agregar referencias com.
Excel.Aplicación oExcel;
Excel.Libro de trabajo oBook;
Objeto oMissing = System.Reflection.Missing.Value;
oExcel = nuevo Excel.Aplicación();
oBook = oExcel.Workbooks.Add(oMissing);
para (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 = verdadero;
oExcel.UserControl = falso;
nombre de archivo de cadena = DateTime.Now.Ticks.ToString();
string mm=Server.MapPath( ".")+ "\" + nombre de archivo + ".xls";//Dirección de almacenamiento del servidor
oExcel.ActiveWorkbook.SaveCopyAs (mm);
oExcel.Salir();
//GC.Collect();
Respuesta.Redirect(nombre de archivo+".xls");
Este código puede realizar la función de exportar archivos, pero si observa el Administrador de tareas de Windows, encontrará la maravillosa escena que se muestra a continuación.
Entonces, alguien agregó "GC.Collect();" al código. Muy bien, no hay tantos EXCEL.EXE como se muestra a continuación.
Pero ¿cómo podemos lograr una liberación completa?
Afortunadamente, en .net, los programadores pueden llamar ellos mismos explícitamente al método Release de com. Este método está empaquetado en .net y se llama System.Runtime.InteropServices.Marshal.ReleaseComObject.
Antes de llamar a "GC.Collect();", primero llame a "System.Runtime.InteropServices.Marshal.ReleaseComObject((object)oExcel);"
Disminuya el recuento de referencias en uno, de modo que el recuento de referencias se convierta en cero. Cuando se produce la recolección de basura, el objeto COM correspondiente a oExcel será eliminado.