C # Excel автоматизация вызывает утечку памяти Excel
Я пытаюсь использовать C # с библиотекой COM Interop, чтобы открыть набор очень тяжелых книг Excel. Я должен использовать C #, потому что мне также нужно запускать макросы, перемещать некоторые ячейки и запускать пользовательские надстройки Excel, используемые моей компанией.
Моя программа завершает работу, оставляя рабочие книги открытыми, каждая в отдельном экземпляре Excel. Я не хочу, чтобы книги закрывались при выходе из программы.
Проблема в том, что когда моя программа на C # выходит из системы, со временем книги Excel постепенно занимают больше памяти, пока непотребляет 3,5 гигабайта памяти с оригинальных 500 мб.
Раньше я открывал книги вручную, а листы никогда не занимали столько памяти. Как только я начал открывать их с помощью 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;