如果Quit()不起作用,请终止进程

时间:2014-04-04 08:01:19

标签: c# excel ms-word powerpoint office-interop

我正在编写一个小程序,它将打开Word,Excel或Powerpoint文件,检查文件而不进行任何修改,然后再次退出相应的应用程序。例如。对于Word,这看起来像下面,适用于普通文档:

s_word.Quit(false);
Marshal.ReleaseComObject(s_word);
s_word = null;
GC.Collect();
GC.WaitForPendingFinalizers();

我还有一个计时器,如果在x秒后没有退出,它应该退出应用程序。但是,如果弹出任何对话框等,我会遇到问题。打开文档时出现密码提示。我将遇到我的超时,但上面的所有命令都不会退出应用程序。 所以我添加了一个硬进程kill方法,它只是查找所有WINWORD进程并杀死它们。虽然这有效,但我还是有一些陷阱要避免。例如,下次打开失败的文档时,Word将询问您是否修复它。

那么,有没有更好的方法来强制Office应用程序退出?

1 个答案:

答案 0 :(得分:2)

我创建了一个非常天真的代码段,它应该允许您获取刚刚启动的Office程序实例的进程,但会保持其他人不受影响。然后,您可以调用processInstance.Kill()来结束它。

        Process[] oldRunningWordInstances = Process.GetProcessesByName("Microsoft Word");
        Word.Application application = new Word.Application();
        Process[] newRunningWordInstances = Process.GetProcessesByName("Microsoft Word");
        Process applicationProcess = null;
        foreach (Process p in newRunningWordInstances)
            if (!oldRunningWordInstances.Contains(p))
            {
                applicationProcess = p;
                break;
            }

        applicationProcess.Kill();

这种获取过程(id)的方法在理论上是不可靠的。可能有更好的解决方案来获得这个过程。