我知道这里提出了许多类似的问题,并且我已经解决了大多数问题,但没有找到满足我好奇心的解决方案(我认为我的案例更具体一些)。
我正在尝试从我的 WPF 应用程序中的 Excel 工作簿的命名范围的名称中填充一个集合。结果是一个 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));
}