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

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

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

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

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

我试过了。 但是,这工作。 Excel将关闭。

如果我使用这个代码。 Excel关闭。

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

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

这是我的代码。 但当然还有其他代码。 我只是评论一切,并慢慢尝试哪些行导致Excel不关闭。 我意识到即使没有使用垃圾收集器,Excel仍然会关闭。 我不想用大锤关闭Excel。

谢谢。

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;
}

我意识到你也不能重用这个变量。

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

这会导致Excel无法正常关闭。 相反,使用这个。

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

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

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

链接地址: http://www.djcxy.com/p/35643.html

上一篇: Why does this code cause Excel to not close properly?

下一篇: Killing Excel.EXE on server