2016-12-05 6 views
-1

Как правильно очистить объекты excel 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

обновил мой ответ по поводу исправления в Cleanup суб – glant

+0

тем, кто давших этот ответ вниз ... пожалуйста, как любезно объяснить, почему или указать на лучший ответ ... Я задал вопрос и спросил его о переполнении стека, а потом выяснил, как заставить его работать и опубликовать это ... Только потому, что я не знаю, кто его отметил, не должен означать, что вы должны действовать незрелыми – glant

 Смежные вопросы

  • Нет связанных вопросов^_^