我基本上了解托管 RCW 对象如何在 .NET 中包装 COM 对象。我的问题是当 COM 对象不再存在时会发生什么。我知道 RCW 对象会增加引用计数,因此只要 RCW 对象还活着,就不应该释放 COM 对象。但是如果从用户的角度删除 COM 对象呢?
尝试它表明 COM 对象抛出
COMException
错误代码 0x80004005 表示访问任何属性时对象不存在。但我想知道:这是一种可靠且防故障的方法吗? COM 对象真的会留在 RCW 对象中还是 Office 可能会将其从内存中删除?在这种情况下,使用悬空引用是不是很危险,有没有更好的方法?
最佳答案
你正在做的事情本质上是有风险的。在用户与 Office 程序交互时使用自动化很棘手,您必须仔细编码。特定的 COM 对象不会被删除,它们是引用计数的,并且您持有对它的引用。但是当用户从文档中删除它时,内存中只剩下一个对象,它当然不再是文档的一部分。
尝试取消引用该对象的成员确实很可能会失败。 Office 程序本身可能已删除对象保留的任何内部引用。你得到了一个非常糟糕的异常,这也不罕见,0x80004005 是 E_FAIL,“未指定的错误”。这几乎不能称为错误,它只是教师对错误报告质量的评分。
理想情况下,您会收到一个事件,告诉您删除对象引用。很难获得,Office 应用程序并不那么健谈。最好的办法是根本不持有引用资料,而是在需要时随时找回。如果这不切实际,那么您可以将 try/catch-em-all 作为最终的后备 hack。
关于.net - 如何检查 COM 对象是否仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28453878/