COM 객체와 닷넷의 가바지 컬렉션이 궁합이 맞지않아 프로세스가 종료되지 않는 현상이 자주 발생한다.

 

엑셀COM 프로세스가 종료되려면 Application, WorkBook, WorkSheet 등이 해제(release)되어야된다.

 

       
        Microsoft.Office.Interop.Excel.Workbook pWorkbook = null;
        Microsoft.Office.Interop.Excel.Sheets pWorkSheets = null;
        Microsoft.Office.Interop.Excel.Worksheet pWorkSheet = null;
       
        m_ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();

        // 엑셀 내용 Start
                      º
                      º
                      º  
                      º
                      º
        // 엑셀 내용 End
        
        pWorkbook.Save();

        releaseObject(m_ExcelApp);
        releaseObject(pWorkSheet);
        releaseObject(pWorkSheets);
        releaseObject(pWorkbook);

        System.GC.Collect();
        System.GC.WaitForPendingFinalizers();


        private static void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception e)
            {
                obj = null;
            }
            finally
            {
                GC.Collect();
            }
        }


 

만약 Release 했는데도 EXCEL.EXE가 프로세스에 남아있다면 PID를 찾아 프로세스를 kill해주면 된다.

다음글에 작성...

+ Recent posts