为什么excel保持开放?

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

我有这个函数来计算一些数据的线性趋势:

private string Trend(object conocido_y, object conocido_x, object nueva_matriz_x) { string result = String.Empty; try { Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); result = ((Array)xlApp.WorksheetFunction.Trend(conocido_y, conocido_x, nueva_matriz_x, true)).GetValue(1).ToString(); xlApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); xlApp = null; } catch (System.Runtime.InteropServices.COMException ex) { DError.ReportarError(ex, false); } catch (Exception ex) { DError.ReportarError(ex); } return result; } 

结果很好,但excel应用程序不closures,如果我打开任务pipe理器的过程仍在运行,为什么?

我记得在ReleaseComObject()之后看到,强制GC传递是由于对象被释放,并最终死亡。

另外,我没有看到它在这个片段,但你必须在任何工作表或其他Excel对象的ReleaseComObject()你可能已经得到一个处理(是结果这样的事情?)。

 ReleaseComObject(result); app.Aplication.Quit(); ReleaseComObject(app); GC.Collect(); 

你的函数是否产生错误? 如果是这样,退出()从来没有达到。 你可能想把Quit和ReleaseComObject放在finally块中。

尝试使用

 xlApp.Application.Quit(); 

代替

 xlApp.Quit(); 

我最近遇到了同样的问题:)

Excel是一个COM自动化服务器。

即使您调用Application.Quit()并释放引用COM对象,该exe本身不会结束。 你仍然可以在任务pipe理器中看到它。 进一步调用Excel将使用正在运行的实例。

在您的应用程序(线程,会话等)closures之后,Excel实例将退出。

曾经得到“RPC服务器找不到/运行”键入COM错误? 现在你知道为什么了。

另见(这已经被问了很多次):

C#和Excel自动化 – 结束正在运行的实例