如何正确清理C#中的互操作对象

这是如何正确清理c#中的excel interop对象的问题。

gyst是在Excel命名空间内使用链接调用(例如,ExcelObject.Foo.Bar())可以防止COM对象的垃圾收集。 相反,应该明确地创建对每个使用的COM对象的引用,并使用Marhsal.ReleaseComObject()明确地释放它们。

仅在特定于Excel COM对象的链接调用后不释放COM对象的行为? 无论何时使用COM对象,应用这种模式是否矫枉过正?


出于两个原因,处理Office应用程序时处理发行版肯定比许多其他COM库更重要。

  • Office应用程序作为进程外服务器运行,而不是进程内库。 如果你没有正确清理,你会让一个进程运行。
  • 即使您调用Application.Quit,如果有未完成的COM对象引用,Office应用程序(尤其是Excel IIRC)也不会正确终止。
  • 对于普通的进程内COM库来说,未能正确清理的后果并不那么显着。 当你的进程退出时,所有进程内库都会消失。 如果您不再需要它时忘记在某个对象上调用ReleaseComObject,那么在对象最终完成时它仍然会被照顾。

    这就是说,这不是写潦草的代码的借口。


    COM对象基本上是非托管代码 - 只要您从托管应用程序开始调用非托管代码,它就成为您在非托管代码之后清理的责任。

    总之,在上面的帖子中链接的模式对于所有 COM对象都是必需的。

    链接地址: http://www.djcxy.com/p/35711.html

    上一篇: How to properly clean up interop objects in C#

    下一篇: Excel process doesn't get closed