2011-09-19 72 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

相關問題