这是对如何在 c# 中正确清理 excel 互操作对象的后续问题 。
最重要的是,在 Excel 命名空间中使用链接调用(例如 ExcelObject.Foo.Bar() )可以防止对 COM 对象进行垃圾收集。相反,应显式创建对所使用的每个 COM 对象的引用,并使用 Marhsal.ReleaseComObject() 显式释放它们。
仅在特定于 Excel COM 对象的链式调用之后不释放 COM 对象的行为?每当使用 COM 对象时应用这种模式是否有点矫枉过正?
这是对如何在 c# 中正确清理 excel 互操作对象的后续问题 。
最重要的是,在 Excel 命名空间中使用链接调用(例如 ExcelObject.Foo.Bar() )可以防止对 COM 对象进行垃圾收集。相反,应显式创建对所使用的每个 COM 对象的引用,并使用 Marhsal.ReleaseComObject() 显式释放它们。
仅在特定于 Excel COM 对象的链式调用之后不释放 COM 对象的行为?每当使用 COM 对象时应用这种模式是否有点矫枉过正?
在处理 Office 应用程序时,正确处理版本肯定比许多其他 COM 库更重要,原因有两个。
对于常规的进程内 COM 库,未能正确清理的后果并没有那么严重。当您的进程退出时,所有进程内库都会随之消失。而且,如果您在不再需要某个对象时忘记调用 ReleaseComObject,则最终在对象完成时仍会处理它。
也就是说,这不是编写草率代码的借口。
COM 对象本质上是非托管代码 - 一旦您开始从托管应用程序调用非托管代码,您就有责任在该非托管代码之后进行清理。
简而言之,以上帖子中链接的模式对于所有COM 对象都是必需的。