title: C# Excel automation causes Excel memory leak
body: <p>I'm trying to use C# with the COM Interop library to open a set of very heavy excel workbooks.  I have to use C#, because I also need to start macros, move some cells around, and start a custom excel-add-in my company uses.</p>
  
  <p>My program then exits, leaving the workbooks open, each in a separate excel instance.  I DO NOT want the workbooks to be closed when the program exits.  </p>
  
  <p>The problem is that when my C# program exits, over time, the excel workbooks gradually consume more memory, until they're consuming 3.5 gigs of memory from an original 500 mb.  </p>
  
  <p>I used to open the workbooks by hand, and the sheets never consumed that much memory.  Once I started opening them using C#, they started to break because of extreme memory usage.  My theory is that somehow, when I interact with the COM Excel object, I create a memory leak.  </p>
  
  <p>Below is my original code:</p>
  
  <pre><code>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;
  </code></pre>
  
  <p>I read about how you need to use Marshal to release uses, so I'm now trying the following code, but have no easy way to test it, other than opening all the sheets and seeing if they consume too much data.</p>
  
  <pre><code>            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;
  </code></pre>