Как мы все знаем, в мире .net программисты отвечают только за создание объектов с использованием new, а уничтожение объектов полностью остается на усмотрение сборщика мусора. Только когда происходит сбор мусора, типы в .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.Приложение();
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.Выход();
//GC.Collect();
Response.Redirect(имя файла+".xls");
Этот код может реализовать функцию экспорта файлов, но если вы посмотрите на диспетчер задач Windows, вы обнаружите замечательную сцену, как показано ниже.
Итак, кто-то добавил в код «GC.Collect();» Очень хорошо, файлов EXCEL.EXE не так много, как показано ниже.
Но как мы можем добиться полного освобождения?
К счастью, в .net программистам разрешено самостоятельно вызывать метод Release com. Этот метод упакован .net и называется System.Runtime.InteropServices.Marshal.ReleaseComObject.
Прежде чем вызывать «GC.Collect();», сначала вызовите «System.Runtime.InteropServices.Marshal.ReleaseComObject((object)oExcel);»
Уменьшите счетчик ссылок на единицу, чтобы счетчик ссылок стал равным нулю. При сборке мусора COM-объект, соответствующий oExcel, будет удален.