我的应用程序启动并自动执行 Excel:
Guid CLSID_ExcelApplication = ClsidFromProgID("Excel.Application");
Application xl = CoCreateInstance(CLSID_ExcelApplication);
现在我们要开始比赛了:
Workbook wb = xl.Workbooks.Add();
Worksheet ws = wb.Worksheets[1];
ws.Name = "Monthly Expense Report";
然后通常你可以.Quit
Excel:
xl.Quit();
Excel 消失了。
输入用户控件
应该发生的是,如果我有代码:
Application xl = CoCreateInstance(CLSID_ExcelApplication);
xl.UserControl = false;
Workbook wb = xl.Workbooks.Add();
Worksheet ws = wb.Worksheets[1];
ws.Name = "Monthly Expense Report";
ws = null;
wb = null;
xl = null;
然后,当最后一个未完成的引用消失时,Excel 应该会自动关闭。来自 MSDN:
Application.UserControl 属性 (Excel)
当对象的 UserControl 属性为False时,该对象会在对该对象的最后一次编程引用被释放时被释放。如果此属性为False,Microsoft Excel 会在会话中的最后一个对象被释放时退出。
我将提请注意上面文档中的重要行:
释放会话中的最后一个对象时 Microsoft Excel 退出
当.UserControl
为 false 时,Excel 应该会自动终止。
该.UserControl
属性默认为false。但即使我强制它为false ,当会话中的最后一个对象被释放时,进程外 Excel 自动化对象也不会退出:
更好地崩溃
如果在自动化时出现意外异常,这将成为一个问题。通常,为了很好地摆脱 Excel,您会:
使其可见,并让用户关闭它:
xl.Visible = true; xl.UserControl = true; //prevent Excel from terminating when we null our reference below xl = null
或致电
.Quit
退出:xl.Quit(); xl = null;
除非出现灾难性问题,否则我没有机会打电话.Quit
或打电话.Visible = true
。在这些情况下,Excel 一直存在。在几天、几周和几个月的时间里,它有时可能意味着几十个。
当最后一个未完成的引用消失时,我能做些什么来确保 Excel 将关闭:
Application xl = CoCreateInstance(CLSID_ExcelApplication);
xl.UserControl = false;
Workbook wb = xl.Workbooks.Add();
Worksheet ws = wb.Worksheets[1];
ws.Name = "Monthly Expense Report";
ws.Cells[1,2] = "January";
ws.Ce......CRASH