正确的方法来检测如果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()