【发布时间】:2016-06-05 00:31:51
【问题描述】:
我有一个Microsoft.Office.Interop.Excel.Application 的实例。为了确保EXCEL.EXE 进程及时终止,我需要找到在创建Application 对象时实例化的ProcessID。
当 Excel Application 有一个窗口时,我为此找到了 samples。
对于“隐藏”实例,即没有窗口绑定到 EXCEL.EXE 进程时,即未设置 excelApp.Hwnd 时,有没有办法做到这一点?
【问题讨论】:
-
你从哪里得到
Microsoft.Office.Interop.Excel.Application? -
我在我的代码中创建了
Microsoft.Office.Interop.Excel.Application的实例,它被我的代码使用。在我处理它之后,我需要避免孤立的EXCEL.EXE。大多数时候这不是问题,因为我使用所有已知策略来正确释放所有 COM 引用。但这还不够。我需要一种警报技术,如果我失败了,它会让我知道。 -
我从未见过没有设置Excel.Application的Hwnd的情况。您能否展示一些示例代码,如何在不设置 Hwnd 的情况下生成 Excel.Application?
-
无法找出实现接口的进程是 COM 的基础。一个可怕的场景是你接下来要做什么,假设你可以得到 PID。 Process.Kill() 在 Office 程序上是一个非常非常非常的坏主意。当您再次启动它时,您将触发自动恢复代码,绝不会在互操作场景中发生您希望发生的事情。解决真正的问题,不要攻击症状。一个微不足道的,GC.Collect + GC.WaitForPendingFinalizers 总是足够好。你只需要把它放在正确的地方。
-
@HansPassant 谁说我要杀死孤儿进程?我说过吗?不要以自己为标准来评判别人。我需要
DETECTorphaned process 的答案并建立一个警报说:“有问题需要注意”。