正确的方法来检测如果Excel已经退出,并作出适当的回应?

我有一个Windows窗体应用程序,打开一个Excel的实例。 如果用户提前退出应用程序,我想确保这个Excel实例已经退出。 我试着调用Excel实例的Quit()方法,如果实例不为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(); } } } 

但是,如果我退出任务pipe理器中的Excel应用程序,然后closuresGUI,我得到这个错误:

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

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

所以我尝试删除Quit()行,并使用它来代替:

 Marshal.ReleaseComObject(form1.xlApp); 

当用户尽早退出Excel应用程序时,此工作正常无错地closures,但如果GUIclosures时该实例仍在任务pipe理器中运行,则ReleaseComObject()调用不会结束Excel实例。

您的应用程序实例只知道COM对象准备好应答函数调用的内存地址。 所以,当你杀死这个进程时,它并没有注意到。 任何对该对象的后接调用都会以hResultforms提升RPC_E_DISCONNECTED或RPC_SERVER_UNAVAILABLE。 我们尝试从应用程序调用简单的东西,如Ready()或Caption()。 如果它返回这些代码之一,我们知道它是断开的。 否则,发送消息是安全的 – 比如Quit()