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