为啥excel一直打开? [复制]
Posted
技术标签:
【中文标题】为啥excel一直打开? [复制]【英文标题】:Why does excel remain open? [duplicate]为什么excel一直打开? [复制] 【发布时间】:2009-12-10 21:37:03 【问题描述】:可能重复:How to properly clean up Excel interop objects in C#
我有这个函数用来计算一些数据的线性趋势:
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应用程序没有关闭,如果我打开任务管理器进程仍在运行,为什么?
【问题讨论】:
但是“正确答案”不是被接受的,因为它对提问者不起作用。它甚至没有一票(我现在要投赞成票)。 【参考方案1】:我记得看到过,在 ReleaseComObject() 之后,强制 GC 传递是由于对象被释放并最终死掉。
另外,我在那个 sn-p 中看不到它,但是您必须在任何工作表或其他您可能已经掌握的 Excel 对象中使用 ReleaseComObject()(结果是这样的吗?)。
ReleaseComObject(result);
app.Aplication.Quit();
ReleaseComObject(app);
GC.Collect();
【讨论】:
@Vinko 谢谢 Vinko 就是这样!【参考方案2】:您的函数是否会产生错误?如果是这样,永远不会到达 Quit()。您可能希望将 Quit 和 ReleaseComObject 放在 finally 块中。
【讨论】:
这确实是个好主意,即使它可能无法解决问题。 是的,我刚刚重新阅读了您的问题,您说结果还可以,所以可能不是问题。我有同样的问题,Excel 仍然出现在任务管理器中。一段时间后它们消失了,所以这可能是 GC 的问题。 @Chris。这怎么可能让我失去理智?!马上做出改变!谢谢你的收获。【参考方案3】:尝试使用
xlApp.Application.Quit();
而不是
xlApp.Quit();
我最近遇到了完全相同的问题:)
【讨论】:
@Jon 感谢 Jon 的快速回复。我尝试了您的建议,但问题仍然存在,还有其他想法吗? 你不是必须强制GC之类的吗?我记得即使 Application.Quit() 也是不够的(我这里没有那个代码,所以我可能弄错了。) @Vinko:我没有,但我使用的是 .NET 4.0 - 也许这会有所不同? (我现在无法通过 Quit 而不是 Application.Quit 重现它出错了。我很想删除这个答案......)【参考方案4】:Excel 是一个 COM 自动化服务器。
即使您调用 Application.Quit() 并释放对 COM 对象的引用,exe 本身也不会结束。您仍然可以在任务管理器中看到它。进一步调用 Excel 将使用正在运行的实例。
Excel 实例将在您的应用程序(线程、会话等)关闭后退出。
曾经收到“RPC 服务器未找到/正在运行”类型的 COM 错误吗?现在你知道为什么了。
另见(这已在 SO 上多次询问):
c# and excel automation - ending the running instance
【讨论】:
a) 为什么 GC.Collect 结束它(可靠且可重复)? b) “RPC server not found/running”与此有什么关系? 一个。为什么不呢?湾。这是适用于 Excel 等 COM 服务器的有趣信息。如果在关闭 Excel 并且未释放对它的引用后进一步调用 Excel,则可能会出现此错误。 a) 我是说 GC-ing 它,而不退出应用程序,结束 Excel 实例,你说只有在你的线程或应用程序结束后才有可能 b) 好的,现在这使得感觉。 a) “你所说的只有在你的线程或应用程序结束后才有可能” - noop,这不是我要说的。如果您使用 ReleaseComObject、FinalReleaseComObject 和 不 GC,则 Excel 实例将在您的应用程序关闭后退出,这可能是由隐式 GC 引起的,如果您有额外的好处,可以保持 RPC 服务器运行想给它打更多电话。以上是关于为啥excel一直打开? [复制]的主要内容,如果未能解决你的问题,请参考以下文章