我正在尝试将 C# 与 COM 互操作库一起使用来打开一组非常繁重的 excel 工作簿。我必须使用 C#,因为我还需要启动宏,移动一些单元格,并启动我公司使用的自定义 excel-add-in。
然后我的程序退出,使工作簿保持打开状态,每个工作簿都在一个单独的 excel 实例中。我不想在程序退出时关闭工作簿。
问题是当我的 C# 程序退出时,随着时间的推移,excel 工作簿会逐渐消耗更多的内存,直到它们从原来的 500 mb 消耗 3.5 gigs 的内存。
我以前手动打开工作簿,而工作表从来没有消耗那么多内存。一旦我开始使用 C# 打开它们,它们就会因为极端的内存使用而开始崩溃。我的理论是,不知何故,当我与 COM Excel 对象交互时,我会造成内存泄漏。
以下是我的原始代码:
using Excel = Microsoft.Office.Interop.Excel;
...
excelApp = new Excel.Application();
excelApp.Visible = true;
excelApp.Workbooks.Open(filename, misValue, misValue, misValue, misValue, misValue,
true, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue);
excelApp.Calculation = Excel.XlCalculation.xlCalculationAutomatic;
我读到了你需要如何使用 Marshal 来释放使用,所以我现在正在尝试以下代码,但没有简单的方法来测试它,除了打开所有工作表并查看它们是否消耗太多数据。
excelApp = new Excel.Application();
excelApp.Visible = true;
Excel.Workbooks currWorkbooks = excelApp.Workbooks;
Excel.Workbook currWorkbook = currWorkbooks.Open(filename, misValue, misValue, misValue, misValue, misValue,
true, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue);
//excelApp.Calculation = Excel.XlCalculation.xlCalculationAutomatic;
int x = Marshal.ReleaseComObject(currWorkbook);
currWorkbook = null;
int y = Marshal.ReleaseComObject(currWorkbooks);
currWorkbooks = null;