为什么excel仍然开放?

时间:2009-12-10 21:37:04

标签: c# asp.net excel interop

  

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

4 个答案:

答案 0 :(得分:8)

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

另外,我没有在那个片段中看到它,但你必须在任何工作表或其他Excel对象中使用ReleaseComObject()你可能已经得到了句柄(结果是这样吗?)。

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

答案 1 :(得分:2)

您的功能是否会产生错误?如果是这样,则永远不会达到Quit()。您可能希望将Quit和ReleaseComObject放在finally块中。

答案 2 :(得分:1)

尝试使用

xlApp.Application.Quit();

而不是

xlApp.Quit();

我最近遇到了完全相同的问题:)

答案 3 :(得分:0)

Excel是COM自动化服务器。

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

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

是否有“未找到/运行RPC服务器”类型的COM错误?现在你知道了为什么。

另见(这已被多次询问过):

c# and excel automation - ending the running instance