Como todos sabemos, no mundo .net, os programadores são responsáveis apenas por criar objetos usando novos, e a destruição dos objetos é totalmente deixada para o coletor de lixo. Somente quando ocorrer a coleta de lixo, os tipos em .net serão destruídos. Isso geralmente não causa nada de errado. No entanto, surgem problemas especiais ao usar objetos COM não gerenciados.
COM usa contagem de referência para determinar o tempo de vida do objeto. Cada vez que o cliente COM faz referência ao objeto, ele chama.
IUnKnown->AddRef(), e toda vez que o objeto é liberado, ele é chamado
IUnKnown->Release(), libera a instância quando a contagem de referência chega a zero.
O problema surge, vejamos o seguinte código:
Este é um código c# que usa o componente excel com para exportar arquivos excel para o cliente que é amplamente divulgado na versão asp.net do CSDN. Antes de adicionar este código, o assistente para adicionar referências com foi executado.
Excel.Aplicativo oExcel;
Excel.Workbook oBook;
Objeto oMissing = System.Reflection.Missing.Value;
oExcel = new Excel.Application();
oLivro = 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 = true;
oExcel.UserControl = falso;
string nome do arquivo = DateTime.Now.Ticks.ToString();
string mm=Server.MapPath( ".")+ "\" + nome do arquivo + ".xls";//Endereço de armazenamento do servidor
oExcel.ActiveWorkbook.SaveCopyAs (mm);
oExcel.Quit();
//GC.Collect();
Response.Redirect(nomedoarquivo+".xls");
Este código pode realizar a função de exportar arquivos, mas se você olhar no Gerenciador de Tarefas do Windows, encontrará a cena maravilhosa mostrada abaixo
Então, alguém adicionou "GC.Collect();" ao código. Muito bem, não existem tantos EXCEL.EXEs, como mostrado abaixo.
Mas como podemos alcançar a liberação completa?
Felizmente, em .net, os próprios programadores podem chamar explicitamente o método Release de com. Este método é empacotado por .net e é chamado System.Runtime.InteropServices.Marshal.ReleaseComObject.
Antes de chamar "GC.Collect();", primeiro chame "System.Runtime.InteropServices.Marshal.ReleaseComObject((object)oExcel);"
Diminua a contagem de referência em um, para que a contagem de referência se torne zero. Quando ocorrer a coleta de lixo, o objeto COM correspondente ao oExcel será eliminado.