【问题标题】:Why don't COM object use IDisposable?为什么 COM 对象不使用 IDisposable?
【发布时间】:2011-09-30 03:41:16
【问题描述】:

为什么 COM 对象不在其 CLR 可调用包装器中使用 IDisposable?

【问题讨论】:

  • 不确定你到底是什么意思...COM 对象非常复杂,IDisposable 的实现将取决于几个方面,包括您计划如何使用 COM 对象...那么框架将如何实现/自动执行此操作?
  • 那将完成什么?请查看乔的答案以及该答案中的链接...
  • 理想情况下它会调用 Marshal.FinalReleaseComObject 这样你就不必在 finally 块中这样做了。
  • 这个电话有它自己的怪癖,请参阅乔回答中的链接

标签: .net com


【解决方案1】:

大概这样的IDisposable 实现会调用Marshal.ReleaseComObject

在某些情况下调用 Marshal.ReleaseComObject 是个好主意,例如 to get an Office application to quit after automation from a .NET client

但正如Marshal.ReleaseComObject 的文档所述,它不应​​该在一般情况下使用 - 并且可能根本不用于进程内 COM 对象。 Here's a blog post with some more detailed info.

因此,通过在 RCW 中的 IDisposable 实现中调用它来鼓励人们使用它并不是一个好主意。

然而,有趣的是 Silverlight 4 AutomationFactory.CreateObject 方法确实返回一个动态对象 IDisposable。并且测试似乎表明this does in fact release the COM reference,尽管文档有点稀疏。

【讨论】:

  • err... 不是 CCW 的问题吗?你的答案是关于 RCW。
  • @Joe:如果他们想要 COM 对象留下来,为什么只调用Marshal.AddRef 不是一个好主意?我们是否默认泄漏资源,这与垃圾收集引用计数的想法完全相反。我觉得我一定是在这里遗漏了什么
猜你喜欢
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多