关于c#:为什么excel仍然开放?

Why does excel remain open?

本问题已经有最佳答案,请猛点这里访问。

0

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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应用程序没有关闭,如果我打开任务管理器,进程仍在运行,为什么?


我记得在releaseComObject()之后,一个强制的gc过程将被释放,Excel将最终死亡。

另外,我在这段代码中没有看到它,但是您必须在任何工作表或其他Excel对象中释放ComObject()(结果是这样的吗?).

2


您的函数是否创建了错误?如果是这样,则永远不会到达quit()。您可能希望将Quit和ReleaseComObject置于finally块中。


试用使用

1
xlApp.Application.Quit();

而不是

1
xlApp.Quit();

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


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

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

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

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

另请参见(已多次询问此问题):

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