为什么此代码导致Excel无法正常closures?

为什么这行代码导致Excel不能退出?

Excel.Range range = (Excel.Range)ws.Cells[1,1]; 

如果是因为铸造,那么这个代码是不是会导致同样的问题呢?

 Excel.Worksheet ws = (Excel.Worksheet)wb.ActiveSheet; 

我试过了。 但是这个工作。 Excel将closures。

如果我使用这个代码。 Excelclosures。

 Excel.Range range = ws.get_Range("A1","A1"); 

那有什么区别? 是的,我知道有一百万的“如何正确closuresExcel”线程。 但是既然这是一个问题,而不是一个答案,我决定问一个新的问题,而不是问别人的问题。

这是我的代码。 当然还有另外一个代码 我只是注释掉所有内容,然后慢慢尝试一下哪些行导致Excel无法closures。 我意识到,即使没有使用垃圾收集器,Excel仍然closures。 我不想用大锤closuresExcel。

谢谢。

 Excel.Application objExcel = new Excel.Application(); Excel.Workbooks wbs = objExcel.Workbooks; Excel.Workbook wb = wbs.Open(saveFileDialog1.FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); Excel.Worksheet ws = (Excel.Worksheet)wb.ActiveSheet; //Excel.Range range = (Excel.Range)ws.Cells[1,1]; Excel.Range range = ws.get_Range("A1","A1"); FinalReleaseAnyComObject(range); FinalReleaseAnyComObject(ws); wb.Close(Type.Missing, Type.Missing, Type.Missing); FinalReleaseAnyComObject(wb); FinalReleaseAnyComObject(wbs); objExcel.Quit(); FinalReleaseAnyComObject(objExcel); 

目前我已经尝试过,直到objExcel,wbs,wb和ws。 这4个对象不会造成问题。

 private static void FinalReleaseAnyComObject(object o) { Marshal.FinalReleaseComObject(o); o = null; } 

我意识到你也不能重复使用这个variables。

 Excel.Range range = ws.get_Range("A1","G1"); range = ws.get_Range("A1", "A1"); 

这也会导致Excel不能正常closures。 相反,使用这个。

 Excel.Range range = ws.get_Range("A1","G1"); FinalReleaseAnyComObject(range); range = ws.get_Range("A1", "A1"); 

有一个你看不见的隐藏的Range接口指针,Cells属性返回它。 然后,将索引器expression式应用于该expression式,并取消引用该Range的默认Item属性。 获得另一个范围。

这就是为什么尝试自己pipe理COM接口指针是一个糟糕的主意。 相信垃圾收集器总是把它弄好。 GC.Collect()和GC.WaitForPendingFinalizers(),如果你真的,真的想要按需退出。 请务必阅读此答案,以了解为什么在debugging程序时,这并不总是按预期工作。