5

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

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

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

4

2 回答 2

6

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

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

对于常规的进程内 COM 库,未能正确清理的后果并没有那么严重。当您的进程退出时,所有进程内库都会随之消失。而且,如果您在不再需要某个对象时忘记调用 ReleaseComObject,则最终在对象完成时仍会处理它。

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

于 2009-09-03T12:58:24.010 回答
2

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

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

于 2009-09-03T09:15:21.560 回答