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

Rah*_*han 13 .net c# garbage-collection ms-office office-interop

我正在开发一个严重依赖多个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)
Run Code Online (Sandbox Code Playgroud)

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

更新:一些可靠文章的链接将受到高度赞赏.顺便说一句,这不是服务器端应用程序.这将在计算机实验室中运行,我们让用户与我们实例化的办公产品进行交互.

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

Tet*_*Oni 2

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

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