【发布时间】:2013-08-09 19:33:50
【问题描述】:
我有一个永远不会关闭 Excel 进程的 C# 程序。基本上,它会找到字符串出现在 Excel 范围内的实例数。我已经尝试了各种各样的东西,但它不起作用。有一个表单正在调用此方法,但这不应改变进程未关闭的原因。我查看了 Hans Passant 的建议,但没有一个有效。
编辑:我尝试了提到的东西,但它仍然不会关闭。这是我更新的代码。 编辑:尝试了整个 Process.Kill() 并且它可以工作,但是对于应该可以工作的东西来说似乎有点破解。
public class CompareHelper
{
// Define Variables
Excel.Application excelApp = null;
Excel.Workbooks wkbks = null;
Excel.Workbook wkbk = null;
Excel.Worksheet wksht = null;
Dictionary<String, int> map = new Dictionary<String, int>();
// Compare columns
public void GetCounts(string startrow, string endrow, string columnsin, System.Windows.Forms.TextBox results, string excelFile)
{
results.Text = "";
try
{
// Create an instance of Microsoft Excel and make it invisible
excelApp = new Excel.Application();
excelApp.Visible = false;
// open a Workbook and get the active Worksheet
wkbks = excelApp.Workbooks;
wkbk = wkbks.Open(excelFile, Type.Missing, true);
wksht = wkbk.ActiveSheet;
...
}
catch
{
throw;
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (wksht != null)
{
//wksht.Delete();
Marshal.FinalReleaseComObject(wksht);
wksht = null;
}
if (wkbks != null)
{
//wkbks.Close();
Marshal.FinalReleaseComObject(wkbks);
wkbks = null;
}
if (wkbk != null)
{
excelApp.DisplayAlerts = false;
wkbk.Close(false, Type.Missing, Type.Missing);
Marshal.FinalReleaseComObject(wkbk);
wkbk = null;
}
if (excelApp != null)
{
excelApp.Quit();
Marshal.FinalReleaseComObject(excelApp);
excelApp = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
/*
Process[] processes = Process.GetProcessesByName("EXCEL");
foreach (Process p in processes)
{
p.Kill();
}
*/
}
}
}
【问题讨论】:
-
较小的复制品会有所帮助。无论如何,我在我的机器上运行了这个并且 Excel 关闭得很好。您是否安装了任何表现不佳的 Excel 加载项?尝试一一删除,看看是否会影响 Excel 干净关闭的能力。
-
我尝试了一个普通的 Excel 进程,但它仍然没有关闭。我正在使用表单作为调用此类的接口,这是否可以使 Excel 保持打开状态?
-
这实际上是我认为您希望从上述链接获得的第三个答案。
-
仅供参考,千万不要“catch {throw;}”。这与没有“捕获”相同。