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

这是如何正确清理C#中的Excel互操作对象的问题 。

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

仅在特定于Excel COM对象的链接调用之后不释放COM对象的行为? 每当一个COM对象被使用时,应用这种模式是否有点矫枉过正?

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

  1. Office应用程序作为进程外服务器运行,而不是进程内库。 如果你没有正确地清理,你会让一个进程运行。
  2. 即使您调用Application.Quit,如果有对其COM对象的未完成引用,Office应用程序(特别是Excel IIRC)也不会正确终止。

对于普通的进程内COM库来说,没有正确清理的后果并不是那么剧烈。 当你的进程退出时,所有进程库都会消失。 如果你不再需要的时候忘了在对象上调用ReleaseComObject,那么当对象最终完成时,它仍然会被照顾。

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

COM对象基本上是非托pipe代码 – 只要您从托pipe应用程序中开始调用非托pipe代码,就有责任在非托pipe代码之后进行清理。

简而言之,在上面的post中链接的模式对于所有的 COM对象是必要的。