卸载COM对象C#

可能重复:
如何正确清理C#中的Excel互操作对象

我正在使用EXCEL INTEROP来读取我的.NET应用程序中的excel文件。 但是,我看到,完成后,我仍然可以在Windows任务pipe理器中看到EXCEL.EXE。

代码如下:

ApplicationClass excel = new ApplicationClass(); Workbooks workBooks = excel.Workbooks; Workbook workBook = workBooks.Open(fileName,0,true,5,"","",true,XLPlatform.xlWindows,"\t",false,false,0,true,1,0); foreach (Name name in workBook.Names) { try { // =#REF!#REF! indicates that the named range refers to nothing. Ignore these.. if (name.Value != "=#REF!#REF!") { if (!retNamedRanges.ContainsKey(name.Name)) { string keyName = name.Name; object value = name.RefersToRange.get_Value(missing); retNamedRanges.Add(keyName, value); } } } catch (Exception ex) { } } if(workBook!=null) { workBook.Close(false,missing,missing); } if(workBook!=null) { workBooks.Close(); } System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook); System.Runtime.InteropServices.Marshal.ReleaseComObject(workBooks); workBook = null; workBooks = null; excel.Application.Quit(); excel.Quit(); excel = null; 

我试图做所有可能的事情来清理,但还是不行。 有多个EXCEL文件,我需要阅读。 通常在我的应用程序执行后,我看到EXCEL.EXE的多个实例。

清理中是否还有其他遗漏?

提前谢谢了

“一些特定于我的应用程序,我正在做…”

事实上,这很可能是问题所在。 正如在引用的副本中一样,如果引用ApplicationClass的属性,则需要确保在垃圾收集器将整理并删除Excel之前取消引用该属性。

因此,例如,将需要的任何数据复制到stringint等(或基于这些基types的自己的内部types)。

尝试使用Marshal。* Final * ReleaseComObject而不是ReleaseComObject。 也可以在你的“ApplicationClass excel”实例中调用它。