When you write
Workbook Workbook = xls.Workbooks.Add();
CLR creates RCW (Runtime Callable Wrapper) objects not only for Workbook
, but for Workbooks collection too(coz you need object that then will be used for Add()
method). And if CLR creates RCW object and you do not keep reference - you can't finalize it.
So, the main rule: You should avoid double-dot-calling expressions:
var workbooks = xls.Workbooks;
var workbook = workbooks.Add();
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);