检测Excel是否已退出并正确响应的正确方法?

时间:2015-09-21 22:56:44

标签: c# excel com

我有一个Windows窗体应用程序可以打开Excel实例。如果用户提前退出应用程序,我想确保此Excel实例已退出。如果实例不是Quit(),我尝试调用Excel实例的null方法,如下所示:

static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form1 = new Form1();
            Application.Run(form1);
            form1.logFile.close();
            if (form1.xlApp != null)
            {
                form1.xlApp.Quit();
            }
        }
    }

但如果我在任务管理器中退出Excel应用程序然后关闭GUI,我会收到此错误:

System.Runtime.InteropServices.COMException (0x800706BA): 
The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)

立即窗口中的(xlApp==null)检查显示xlApp不为空,即使没有Excel运行实例。

所以我尝试删除Quit()行并改为使用它:

Marshal.ReleaseComObject(form1.xlApp);

当用户提前退出Excel应用程序时,这适用于关闭而没有错误,但如果GUI关闭时实例仍在任务管理器中运行,则ReleaseComObject()调用不会结束Excel实例。 / p>

1 个答案:

答案 0 :(得分:1)

您的Application实例只知道COM对象准备应答函数调用的内存地址。因此,当您终止该进程时,它不会注意到。 对该对象的任何后续调用都会将RPC_E_DISCONNECTED或RPC_SERVER_UNAVAILABLE作为hResult引发。 我们尝试从应用程序中调用一些简单的东西,比如Ready()或Caption()。如果它返回其中一个代码,我们就知道它已断开连接。否则,发送消息是安全的 - 比如Quit()