【问题标题】: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应用程序没有关闭,如果我打开任务管理器进程仍在运行,为什么?

【问题讨论】:

  • 但是“正确答案”不是被接受的,因为它对提问者不起作用。它甚至没有一票(我现在要投赞成票)。

标签: c# asp.net excel interop


【解决方案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 服务器运行想给它打更多电话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多