2011-09-19 14 views
7

¿Por qué no se puede usar el objeto COM IDisposable en sus envolturas de LLR Callable Wrappers?¿Por qué no se puede usar el objeto COM IDisposable?

+1

no está seguro de qué quiere decir exactamente ... Los objetos COM son muy complicados y la implementación IDisposable dependerá de varios aspectos, incluido el uso del objeto COM ... ¿cómo podría el marco implementar/hacer esto automágicamente? – Yahia

+0

¿Qué lograría eso exactamente? vea la respuesta de Joe y los enlaces en esa respuesta, por favor ... – Yahia

+0

Lo ideal sería llamar a Marshal.FinalReleaseComObject para que no tenga que hacerlo en un bloque finally. –

Respuesta

4

Es de suponer que una implementación de este tipo IDisposable llamaría Marshal.ReleaseComObject.

Existen casos en los que llamar a Marshal.ReleaseComObject es una buena idea, por ejemplo to get an Office application to quit after automation from a .NET client.

Pero como indica la documentación para Marshal.ReleaseComObject, no debe usarse en el caso general, y probablemente no en absoluto para los objetos COM en proc. Here's a blog post with some more detailed info.

Por lo tanto, no habría sido una buena idea alentar a las personas a usarlo llamándolo desde una implementación IDisposable en el RCW.

Sin embargo, lo interesante es que el método de Silverlight 4 AutomationFactory.CreateObjecthace devolver un objeto dinámico que es IDisposable. Y las pruebas parecen mostrar que this does in fact release the COM reference, aunque la documentación es un poco escasa.

+0

err ... ¿no se trata de CCW? Tu respuesta es sobre RCW. – Aamir

+0

@Joe: ¿por qué no es una excelente idea simplemente llamar a [Marshal.AddRef] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.addref.aspx) si ¿Deseaban el objeto COM quedarse? ¿Perdemos recursos de manera predeterminada? Esto es totalmente contrario a la idea de la recolección de basura y el conteo de referencias. Siento que me falta algo aquí – sehe

Cuestiones relacionadas