悬挂互操作COM对象的问题

我有一个应用程序使用COM互操作来创建电子表格,该电子表格在客户机的Excel中打开。 但是,看起来,如果我查看任务管理器,用户关闭Excel时EXCEL.exe进程并不总是结束。

如果我保存工作簿并以编程方式关闭Excel,我只需使用Marshal.ReleaseComObject()进行清理,但由于我依赖于程序的手动关闭,所以我不知道该怎么做。 有什么建议么?


直到所有它的进程外对象被释放后,Excel才能终止。 所以它只是隐藏其用户界面并继续运行。 直到你的程序退出,或者你将所有Excel对象引用和终结器线程运行为空。 退出你的程序将是一个明显的解决方案。 或者你可以强制终结器线程运行:

GC.Collect();
GC.WaitForPendingFinalizers();

ReleaseComObject()很少用,因为它很容易忘记中介COM对象引用。 像WorkBooks [index]一样,这是一个你看不到的枚举器。 让GC自己做出这个决定将是更明智的选择,如果你继续跑步并做好工作,那么就会发生。


可能Excel.exe仍然是打开的,因为用户在Excell应用程序的同一个实例中打开了另一个文档。 在这种情况下,你可能不应该杀死Excel.exe进程。

如果确保关闭所有打开的文档并释放所创建的所有对象,那么为什么确保Excel.exe终止对您至关重要? 也许这个过程是服务于另一个应用程序,或者用户?


可能有很多原因(包括Ran的),但我看到很多MapPoint(带有COM接口的另一个Microsoft应用程序)的一个原因是,您必须确保清除所有对象引用,以便垃圾收集器可以清除它们。 挂起的一个低级对象足以阻止应用程序关闭并退出进程列表。

链接地址: http://www.djcxy.com/p/6063.html

上一篇: Problem with hanging interop COM objects

下一篇: Microsoft Interop Excel closing running instances of excel?