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

时间:2009-09-03 09:03:46

标签: c# excel interop garbage-collection com-interop

这是一个关注的问题 How to properly clean up excel interop objects in c#

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

仅在Excel COM对象的链式调用之后不释放COM对象的行为是什么?每当使用COM对象时,应用这种模式是否过度?

2 个答案:

答案 0 :(得分:6)

在处理Office应用程序时,与其他许多COM库相比,处理版本更为重要,原因有两个。

  1. Office应用程序作为进程外服务器运行,而不是进程内库。如果您未能正确清理,则会使进程继续运行。
  2. 如果存在对其COM对象的未完成引用,即使您调用Application.Quit,Office应用程序(尤其是Excel IIRC)也无法正常终止。
  3. 对于常规的进程内COM库,未能正确清理的后果并不那么引人注目。当您的进程退出时,所有进程内库都会消失。如果你在不再需要它时忘记在一个对象上调用ReleaseComObject,那么当对象最终确定时,它仍然会被最终处理。

    那就是说,这不是编写草率代码的借口。

答案 1 :(得分:2)

COM对象本质上是非托管代码 - 一旦您开始从托管应用程序调用非托管代码,您就有责任在该非托管代码之后进行清理。

简而言之,上述帖子中链接的模式对于所有 COM对象都是必需的。