在 C# 中正确处理 COM 互操作对象,尤其是 MS Office 应用程序



我正在开发一个严重依赖多种Microsoft Office产品的应用程序,包括Access,Excel,Word,PowerPoint和Outlook等。在研究互操作时,我发现从VS2010和.NET 4开始,值得庆幸的是,我们不再需要经历PIA的噩梦。

此外,我一直在阅读很多关于正确处理物品的文章,最明智的似乎是这篇文章。

但是,这篇文章已有5年的历史,关于AFAIK主题的权威出版物并不多。下面是上面链接中的代码示例:

' Cleanup:
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
Marshal.FinalReleaseComObject(worksheet)
oWB.Close(SaveChanges:=False)
Marshal.FinalReleaseComObject(workbook)
oApp.Quit()
Marshal.FinalReleaseComObject(application)

我想知道的是,按照今天的标准,这有多准确,如果我希望在未来几年支持我的申请,我应该注意什么?

更新:一些可信文章的链接将不胜感激。顺便说一下,这不是服务器端应用程序。这将在计算机实验室中运行,在那里我们让用户与我们为他们实例化的办公产品进行交互。

找到

它:这篇由三部分组成的文章可能是我期望找到的最接近权威帐户的文章。

对象超出

范围后,GC 应自动释放对象。 如果需要尽快发布它们,可以使用 Marshal.ReleaseComObject http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx

根据您通过互操作控制的 Office 版本以及服务器上发生的情况,是的,您可能需要执行一些严重的卷积来摆脱其中一个 Office 应用程序的运行实例。存在不可预测(和不必要的(对话框,例如,Word 将在非交互式时打开(没有一个 Office 应用程序是为无人值守执行而设计的,因此建议即使使用最新版本,也不安装它们供服务器端使用(。

对于服务器案例,请考虑使用 Aspose 的堆栈而不是 Office 或其他替代方法。在交互式本地用例中,您有时可能需要"额外的大力杀戮",因为Office自动化服务器是行为特别糟糕的非托管对象。

如果要完全释放COM对象,尤其是在MS Office COM对象中,强烈建议您释放必须使用过的子对象,这些子对象位于父对象内部。

在您的示例中,我会说在释放单元格,范围或任何其他对象所属的工作表之前释放所有Cell,Range您可能使用的任何其他对象。

相关内容

最新更新