2016-12-05 10 views
-1

정리 COM 개체를 올바르게 정리하는 방법. 이 응용 프로그램을 종료 한 후 오류가 다음이없는 경우 객체예외가 발생했을 때 정리 및 닫는 interop Excel COM 개체를 닫습니다. Winforms vb.net

와 함께 작업하는 동안 예외가 발생하면 작업 관리자에서 실행 엑셀 과정을 매달려 더에 Excel.exe 프로세스는 윈도우 작업 관리자

내 예제 코드에서 뒤에 남아 있지 . 오류 라인을 주석 처리하고 응용 프로그램을 닫으면 모두 좋습니다. 이것과 같은 오류 경우에 클린업을 처리하는 방법 ??

Imports Microsoft.Office.Interop 

Public Class Form1 
    Private xlApp As Excel.Application 
    Private xlWorkBook As Excel.Workbook 
    Private misValue As Object 
    Property xlWorkSheet As Excel.Worksheet 

    Public Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Try 
      ''EXCEL CREATION/INITAILIAZATION 
      misValue = System.Reflection.Missing.Value 
      xlApp = New Microsoft.Office.Interop.Excel.Application() 
      If xlApp Is Nothing Then 
       MessageBox.Show("Excel is not properly installed!!") 
       xlApp = Nothing 
      End If 
      xlWorkBook = xlApp.Workbooks.Add(misValue) 


      ''WRITE TO WORKSHEET 
      xlWorkSheet = xlWorkBook.Sheets("sheet1") 
      xlWorkSheet.Cells(1, 1) = "THIS" 
      xlWorkSheet.Cells(1, 2) = "IS" 
      xlWorkSheet.Cells(1, 3) = "A" 
      xlWorkSheet.Cells(1, 4) = "TEST" 

      ''FORCEFULLY CAUSING ERROR, NOW THE EXCEL PROCESS HANGING IN TASK MANAGER 
      xlWorkSheet.Cells(1, -1) = "ERROR LINE" 

      ''SAVE WORKSHEET 
      Dim Name = DateTime.Now.ToString("s").Replace(":", "_") 
      Dim Dir = AppDomain.CurrentDomain.BaseDirectory & Name & "Output.xls" 
      xlApp.DisplayAlerts = False 
      xlWorkBook.CheckCompatibility = False 
      xlWorkBook.DoNotPromptForConvert = True 
      xlWorkBook.SaveAs(Dir, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, _ 
           Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue) 

     Catch ex As Exception 
      Dim exMsg = ex.Message 
     Finally 
      ''TIME TO CLEAN EXCEL STUFF 
      Cleanup() 
     End Try 
    End Sub 

    Private Sub Cleanup() 
     ReleaseObject(xlWorkSheet) 
     ReleaseObject(xlWorkBook) 
     xlApp.Quit() 
     ReleaseObject(xlApp) 
    End Sub 

    Private Sub ReleaseObject(ByRef obj As Object) 
     Try 
      If Not IsNothing(obj) And System.Runtime.InteropServices.Marshal.IsComObject(obj) Then 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) 
       obj = Nothing 
      End If 
     Catch ex As Exception 
      obj = Nothing 
     Finally 
      GC.Collect() 
     End Try 
    End Sub 

End Class 

답변

-2

알아 냈어. xlWorkBook.close 및 xlApplication.Quit는 객체를 릴리스하기 전에 호출해야했습니다. 여기에 업데이트 된 정리 기능이

Private Sub Cleanup() 
    xlWorkBook.Close(False) 
    xlApp.Quit() 
    ReleaseObject(xlWorkSheet) 
    ReleaseObject(xlWorkBook) 
    ReleaseObject(xlApp) 
End Sub 
+0

업데이트 의례 이유를 설명하거나 더 나은 해답을 지적하십시오 방법 ... 다운이되었습니다 사람들에게 정리 서브 – glant

+0

의 수정에 대한 내 대답은 ... I 질문이 있었고 스택 오버플로에 대해 물어 봤고 나중에 작동하도록 게시하고 게시하는 방법을 알아 냈습니다 ... 누가 그것을 표시했는지 모르기 때문에 미성숙 한 행동을해서는 안됩니다. – glant