我知道很多類似的問題,在這裏提出,我已經通過其中大部分都沒有找到解決方案來滿足我的好奇心(我認爲我的案例有點多具體)。
我想從我的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