.net - 如何检查 COM 对象是否仍然存在

标签 .net com ms-office vsto

我基本上了解托管 RCW 对象如何在 .NET 中包装 COM 对象。我的问题是当 COM 对象不再存在时会发生什么。我知道 RCW 对象会增加引用计数,因此只要 RCW 对象还活着,就不应该释放 COM 对象。但是如果从用户的角度删除 COM 对象呢?

  • 假设我有 PowerPoint 中的形状、Excel 中的工作表或 Word 段落。我的应用程序创建了一个引用并保留了一段时间。
  • 用户现在可以删除 PowerPoint 幻灯片、关闭 Excel 文件或删除 Word 段落。检测这个的正确方法是什么?

  • 尝试它表明 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/

    相关文章:

    c# - 为什么 XmlSerializer 在 Visual Studio 2019 中不会导致 FileNotFoundException?

    c# - 业务逻辑应该放在 Controller /模型/ View 项目中的什么位置

    c# - 如何构建一个非常低分辨率的计时器?

    c# - 在 c# 中使用 Microsoft.Office.Interop.Excel 在 excel 列中设置数据类型,如数字、文本和日期

    windows - 确定 Windows 和 Office 版本的快速命令或批处理脚本

    c# - StringComparison 枚举的选项

    c# - 我可以将 .NET 5 COM 互操作对象与 VB6 连接吗?

    windows - 当用户没有足够的权限时隐藏 COM-Server OLE 错误消息

    c++ - XMLHttpRequest 和证书错误

    macos - 在 Mac 上将 .xls 和 .xlsx 批量转换为 .txt(制表符分隔)