2011-09-19 61 views
7

为什么COM对象在CLR Callable Wrappers中不使用IDisposable?为什么COM对象不使用IDisposable?

+1

不知道你到底是什么意思...... COM对象非常复杂,IDisposable的实现将取决于几个方面,包括你打算如何使用COM对象......那么框架将如何实现/自动执行此操作? – Yahia

+0

这将完成exaclty?请参阅Joe的答案以及该答案中的链接... – Yahia

+0

理想情况下,它会调用Marshal.FinalReleaseComObject,因此您不必在finally块中这样做。 –

回答

4

推测这样的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,虽然文档有点稀疏。

+0

err答案中的链接...是不是关于CCW?你的答案是关于RCW的。 – Aamir

+0

@Joe:为什么只是调用[Marshal.AddRef](http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.marshal.addref.aspx)if他们希望COM对象坚持下去?我们是否默认泄漏资源,这与垃圾收集和引用计数的想法完全相反。我觉得我必须在这里错过一些东西 – sehe

相关问题