我知道很多类似的问题,在这里提出,我已经通过其中大部分都没有找到解决方案来满足我的好奇心(我认为我的案例有点多具体)。
我想从我的WPF应用程序中的Excel工作簿的命名范围的名称填充集合。结果是即使在我的应用程序关闭后仍在运行的Excel进程。我已将问题本地化为以下代码片段。没有它,一切正常:无法关闭C#代码中的Excel进程
foreach (Excel.Name name in names)
{
namedRanges.Add(name.Name);
}
所以,显然这里的东西不会被释放。我还没有找到像其他Excel对象一样关闭/处理/退出“Excel.Name”的方法。请建议如何做到这一点。我使用的解决方法是杀死特定的进程,但我宁愿了解背后的问题,并尝试提出更相关的解决方案。下面是完整的代码片段:
Excel.Application excel = new Excel.Application();
excel.Visible = false;
Excel.Workbooks wbooks = excel.Workbooks;
Excel.Workbook wbook = wbooks.Open(Proc.ExpenseFullPath);
ObservableCollection<string> namedRanges = new ObservableCollection<string>();
Excel.Names names = wbook.Names;
foreach (Excel.Name name in names)
{
namedRanges.Add(name.Name);
}
wbook.Close();
wbooks.Close();
excel.Quit();
编辑: 我发现了如何使其发挥作用。我更换了有问题 “的foreach” 有:
for (int i = 1; i <= names.Count; i++)
{
namedRanges.Add(names.Item(i).Name);
Marshal.FinalReleaseComObject(names.Item(i));
}
有一个COM迭代器在你的foreach循环中使用。你不能到达它,excel.Quit()不会停止运行Excel,直到迭代器被垃圾回收。当你的程序退出时,肯定会发生这种情况,这迫使最后一次通过所有终结器。你需要找出你的程序为什么没有正常退出。例如,不要使用Debug + Stop Debugging。 –
感谢您的想法。我必须照顾每个Excel.Name,因为它们也是COM。不知道为什么,但ReleaseComObject不起作用,而FinalReleaseComObject没有工作。 – Hoodahelll