gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:06:03 27 4
gpt4 key购买 nike

为什么这行代码导致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接口(interface)指针,Cells属性返回它。然后将索引器表达式应用于它,取消引用该范围的默认 Item 属性。获得另一个范围。

这就是为什么尝试自己管理 COM 接口(interface)指针是一个非常糟糕的主意的原因。相信垃圾收集器总能正确处理。 GC.Collect() 和 GC.WaitForPendingFinalizers() 如果您真的非常想让它按需退出。请务必阅读 this answer了解为什么这在您调试程序时并不总是按预期工作。

关于c# - 为什么此代码会导致 Excel 无法正常关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4964663/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com