우리 모두 알고 있듯이 .net 세계에서 프로그래머는 new를 사용하여 객체를 생성하는 작업만 담당하며 객체 파괴는 가비지 수집기에 전적으로 맡겨집니다. .net의 유형은 폐기됩니다. 이로 인해 일반적으로 아무런 문제가 발생하지 않습니다. 그러나 관리되지 않는 COM 개체를 사용할 때 특별한 문제가 발생합니다.
COM은 참조 계산을 사용하여 개체의 수명을 결정합니다. COM 클라이언트는 개체를 참조할 때마다 호출합니다.
IUnKnown->AddRef(), 개체가 해제될 때마다 호출됩니다.
IUnKnown->Release()는 참조 횟수가 0에 도달하면 인스턴스를 해제합니다.
문제가 발생합니다. 다음 코드를 살펴보겠습니다.
이는 Excel com 구성 요소를 사용하여 CSDN의 asp.net 버전에서 널리 유포되는 Excel 파일을 클라이언트로 내보내는 C# 코드입니다. 이 코드를 추가하기 전에 com 참조를 추가하는 마법사가 실행되었습니다.
Excel.Application oExcel;
Excel.Workbook oBook;
개체 oMissing = System.Reflection.Missing.Value;
oExcel = 새로운 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 = 거짓;
문자열 파일 이름 = DateTime.Now.Ticks.ToString();
string mm=Server.MapPath( ".")+ "\" + 파일 이름 + ".xls";//서버 저장 주소
oExcel.ActiveWorkbook.SaveCopyAs(mm);
oExcel.Quit();
//GC.수집();
Response.Redirect(파일명+".xls");
이 코드로 파일을 내보내는 기능을 구현할 수 있는데, Windows 작업 관리자를 보면 아래와 같은 멋진 장면을 발견할 수 있습니다.
그래서 누군가가 코드에 "GC.Collect();"를 추가했습니다. 아래와 같이 EXCEL.EXE가 많지 않습니다.
하지만 어떻게 완전한 해방을 이룰 수 있을까요?
다행히 .net에서는 프로그래머가 com의 Release 메서드를 직접 호출할 수 있습니다. 이 메서드는 .net으로 패키지되어 있으며 위 코드에서 System.Runtime.InteropServices.Marshal.ReleaseComObject라고 합니다.
"GC.Collect();"를 호출하기 전에 먼저 "System.Runtime.InteropServices.Marshal.ReleaseComObject((object)oExcel);"을 호출하십시오.
참조 카운트가 0이 되도록 참조 카운트를 1씩 줄입니다. 가비지 수집이 발생하면 oExcel에 해당하는 COM 개체가 제거됩니다.