Interop.Excel:Excel实例在程序存在后显示在任务pipe理器中C#

我正在使用C#来创buildExcel文件。 当我的程序运行时,excel实例被创build并显示在任务pipe理器中。 这是正常的,但是当我的程序closures,然后Excel任务不应该显示在任务pipe理器,但它显示。 请检查我的代码,并告诉我什么是我的错误,导致甚至在closures我的应用程序后,在任务pipe理器中的Excel实例。 这是我的代码。

private void GenerateExcel() Excel.Application xlApp = new Excel.Application(); if (xlApp == null) { return; } Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; object misValue = System.Reflection.Missing.Value; xlWorkBook = xlApp.Workbooks.Add(misValue); xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); xlWorkBook.Windows.Application.ActiveWindow.DisplayGridlines = false; xlWorkSheet.Cells[2, 2] = "Sheet 1 content"; if (!Directory.Exists(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\Reports")) { Directory.CreateDirectory(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\Reports"); } string strpath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\Reports\\test.xls"; if (File.Exists(strpath)) { File.Delete(strpath); } xlWorkBook.SaveAs(strpath, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); releaseObject(xlWorkSheet); releaseObject(xlWorkBook); releaseObject(xlApp); } 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(); } } 

每当你调用一个COM对象的成员时,该对象必须被赋值给一个variables并被显式释放。 例如,这个:

 xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

创build一个未发布的.Worksheets引用。 它需要

 var worksheets = (Excel.Worksheet)xlWorkBook.Worksheets; xlWorkSheet = worksheets.get_Item(1); 

并最终

 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheets); 

除非每个COM对象被释放,否则应用程序将继续运行。

为了使用它,我发现自己要么创build大量的try/finally块或helper函数来处理类似上面的情况,这会将调用包装到.Worksheets并确保创build的任何对象都被释放。 它可以工作,但它似乎否定了在另外处理垃圾收集的框架中工作的好处。 我们都知道要Dispose一个IDisposable ,但显然不直观的是,我们需要释放一个没有明确创build的对象,并且没有实现IDisposable ,以及不知道这个对象的后果错误)已经遗留在后台运行的Excel实例。 (咆哮结束)

我认真的build议是尽可能避免使用互操作和自动化。 如果您必须生成Excel,请尝试像EPPlus这样的库。 互操作是在Excel对象成为XML文档的基本压缩集合之前devise的。 现在,您甚至不需要安装或运行Excel来创build或操作文档。 他们存储的格式是令人困惑的,但图书馆大多为你隐藏。 您编写的代码甚至可以在Web服务器上运行,并根据Web请求实时生成Excel。