妥善处置在C#中的COM互操作对象尤其是MS Office应用程序(Proper disposal

2019-06-24 07:39发布

我发展,在很大程度上依赖于多个Microsoft Office产品包括Access,Excel和Word,PowerPoint和Outlook中以及其他的应用程序。 虽然这样做对互操作研究,我发现,开始VS2010和.NET 4,我们幸运的是不再需要经过PIA的的噩梦。

此外,我一直在阅读了很多关于物品的妥善处置的文章,最明智的一个似乎是这一个。

不过,文章是5岁和有没有关于这个问题据我所知很多权威刊物。 这里是从上面的链路代码的示例:

' Cleanup:
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()

Marshal.FinalReleaseComObject(worksheet)

oWB.Close(SaveChanges:=False)
Marshal.FinalReleaseComObject(workbook)

oApp.Quit()
Marshal.FinalReleaseComObject(application)

我想知道的是用今天的标准,如何准确的这个问题,我应该看出来的,如果我希望支持我在未来几年的应用?

更新:一个链接到一些可信的文章将高度赞赏。 顺便说一句,这不是一个服务器端应用程序。 这将在我们为用户与我们实例为他们的办公产品的互动计算机实验室运行。

发现: 这三部分文章可能是最接近权威帐户我希望找到。

Answer 1:

根据Office的版本,你是通过互操作控制,并在服务器上发生的情况下,是的,你可能需要做一些认真的回旋摆脱的Office应用程序的运行实例。 还有不可预知的(和不必要的)对话,其中,例如,Word将当它是不是交互式(Office应用程序都不是特别设计用于无人参与的执行,因此建议打开,即使他们没有安装最新版本在服务器端使用)。

对于服务器的情况下,可以考虑使用的Aspose的筹码,而不是办公室或其他替代品的。 交互式,本地使用的情况下,可能需要一个“额外的蓬勃杀”有时由于办公自动化服务器特别顽劣的非托管对象。



Answer 2:

对象应该自动地由GC的对象超出范围后丢弃。 如果你需要释放他们越早,你可以使用Marshal.ReleaseComObject的http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx



Answer 3:

如果你想释放COM对象完全尤其是微软办公COM对象,它非常强烈建议你释放你一定使用过的子对象这是父对象中。

在你的榜样,我会说,释放所有单元格,区域,你可以释放的细胞,范围或任何其他对象属于该表之前已经使用的任何其他对象。



文章来源: Proper disposal of COM interop objects in C# particularly MS Office applications