【发布时间】:2020-02-10 16:20:28
【问题描述】:
这个问题已经被问过很多次了,例如:
How do I properly clean up Excel interop objects?
How to dispose Interop Excel Application and workbook correctly?
Why does Microsoft.Office.Interop.Excel.Application.Quit() leave the background process running?
How can I dispose my Excel Application
但 Hans Passent 对以下问题的回答让我相信它们已经过时和/或根本不正确:
Clean up Excel Interop Objects with IDisposable
Understanding garbage collection in .NET
所以,我的问题是: 如何清理我的 Excel 互操作对象,以便及时释放所有托管和非托管 Excel 资源(即当内存压力触发垃圾回收时)?
- 处于发布模式?
- 处于调试模式(如果我们关心的话)?
在释放模式下:
让所有托管的 Excel 互操作对象超出范围就足够了吗?
我也需要调用 excelApp.Quit() 吗?
非托管堆上的内存压力会触发垃圾回收吗?即我是否还需要致电:
GC.Collect();
GC.WaitForPendingFinalizers();
确保我的托管应用不会耗尽内存? 我是否需要调用:System.Runtime.InteropServices.Marshal.FinalReleaseComObject(managedExcelObject)?
除非您已阅读并理解 Hans Passent 的回答,否则请不要回答此问题。
【问题讨论】:
-
您会发现曾经使用过 COM 的每个人都理解这些答案,并且可以告诉您同样的答案。大多数情况下的解决方案是尽可能不使用 Office 互操作。使用像 Epplus 这样的库来创建真正的
xlsx文件。 -
我同意。如果不需要,请不要使用互操作。请改用Open XML SDK 之类的东西。
-
你真的写过你的程序并证明这里突出显示的项目有问题吗?
-
一直在同一条船上,互操作的东西总是比它的价值更令人头疼。如果您只是想将工作表加载到内存中,
ExcelDataReader是另一个值得一看的地方。 -
@Robert Harvey 我最初计划用 Java 编写我的应用程序。这篇文章:stackoverflow.com/questions/38913412/… 让我相信 Apache POI 或 OpenXML 对图表的支持不是很好。因此,我选择了 C# 和 Excel 互操作,因为我相信它是完整且易于使用的——而且确实如此。我的应用是一次性为我捕获的 csv 数据生成一堆(150 多个)图表。我真的不在乎它是否在完成后泄漏。这个问题真的是为了拓宽我对这个问题的理解。
标签: c# excel office-interop