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

Mau*_*ceL 5 c# excel interop garbage-collection com-interop

这是关于如何在c#中正确清理excel互操作对象的后续问题 .

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

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

小智 6

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

  1. Office应用程序作为进程外服务器运行,而不是进程内库.如果未能正确清理,则会使进程保持运行状态.
  2. 即使您调用Application.Quit,如果存在对其COM对象的未完成引用,Office应用程序(尤其是Excel IIRC)也不会正确终止.

对于常规的进程内COM库,未能正确清理的后果并不那么引人注目.当您的进程退出时,所有进程内库都会消失.如果你不再需要它时忘记在一个对象上调用ReleaseComObject,那么当对象最终确定时,它仍然会被最终处理掉.

也就是说,这不是编写草率代码的借口.