我正在尝试使用COM互操作库的C#来打开一组非常大的Excel工作簿。我必须使用C#,因为我还需要启动宏,移动一些单元格并启动公司使用的自定义Excel插件。
然后我的程序退出,留下了打开的工作簿,每个都在单独的Excel实例中。我不希望程序退出时关闭工作簿。
问题是当我的C#程序退出时,经过一段时间,Excel工作簿逐渐消耗更多的内存,直到从原始的500 MB增长到3.5 GB。
我曾经手动打开过这些工作簿,表格从未消耗那么多内存。一旦我开始使用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;