为什么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自动化 – 结束正在运行的实例