14

我正在开发一个严重依赖多个 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)

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

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

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

4

3 回答 3

3

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

于 2012-05-10T16:08:52.137 回答
2

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

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

于 2012-05-10T16:29:00.240 回答
2

如果您想完全释放 COM 对象,尤其是在 MS Office COM 对象中,强烈建议您释放父对象内必须使用的子对象。

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

于 2012-05-10T16:34:22.733 回答