Excel对象有时不被处置

我有一个从Excel单元格读取的代码段:

public T GetValue<T>(string testsheet, string range) { Application excelApplication = null; Workbooks workBooks = null; Workbook activeWorkBook = null; Worksheet activeWorkSheet = null; try { excelApplication = new Application(); workBooks = excelApplication.Workbooks; activeWorkBook = workBooks.Open(workBook); activeWorkSheet = activeWorkBook.ActiveSheet; var cells = activeWorkSheet.get_Range(range); return cells.Value2; } catch (Exception theError) { Console.WriteLine(theError.Message); throw theError; } finally { ReleaseComObject(activeWorkSheet); ReleaseComObject(activeWorkBook); ReleaseComObject(workBooks); ReleaseComObject(excelApplication); } } 

另外我有一个设置值的方法,将值设置为单元格如下:

 public void SetValue<T>(string testsheet, string range, T value) { Application excelApplication = null; Workbooks workBooks = null; Workbook activeWorkBook = null; Worksheet activeWorkSheet = null; try { excelApplication = new Application(); workBooks = excelApplication.Workbooks; activeWorkBook = workBooks.Open(workBook); activeWorkSheet = activeWorkBook.ActiveSheet; var cells = activeWorkSheet.get_Range(range); cells.Value2 = value; activeWorkBook.Save(); } catch (Exception theError) { Console.WriteLine(theError.Message); throw theError; } finally { if (activeWorkBook != null) activeWorkBook.Close(); ReleaseComObject(excelApplication); ReleaseComObject(workBooks); ReleaseComObject(activeWorkBook); ReleaseComObject(activeWorkSheet); } } 

这是我的ReleaseComObject:

  private static void ReleaseComObject<T>(T comObject) where T : class { if (comObject != null) Marshal.ReleaseComObject(comObject); } 

我已经写了一个testing,以确保excel对象正确处理如下:

  [Test] public void Should_dispose_excel_objects_created_after_io_operation() { var expected = Process.GetProcesses().Count(process => process.ProcessName.ToLower() == "excel"); var automationClient = new ExcelAutomation.ExcelAutomationClient(ExcelSheet); automationClient.SetValue("Sheet1", "A1", 1200); automationClient.GetValue<double>("Sheet1", "A1"); var actual = Process.GetProcesses().Count(process => process.ProcessName.ToLower() == "excel"); actual.Should().Be(expected, "Excel workbook is not disposed properly. There are still excel processess in memory"); } 

这个testingpassess如果我只调用SetValue方法,但是当调用GetValue失败。 但是我可以在taskmanager中看不到Excel.exe。 任何想法,为什么这是发生了吗? 我的GetValue函数有问题吗?

完成对象的处理后,请使用

 GC.Collect(); 

这是我如何处理我的Excel对象

  private void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (Exception ex) { obj = null; MessageBox.Show("Exception Occured while releasing object " + ex.ToString()); } finally { GC.Collect(); } }