下面的代码使Microsoft Excel后台进程保持运行,直到我的程序退出:
var excelApplication = new Application();
var workbooks = excelApplication.Workbooks;
var workbook = excelApplication.Workbooks.Open(file.FullName);
workbook.Close();
excelApplication.Workbooks.Close();
excelApplication.Quit();
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(excelApplication);
为什么?我错过了什么?
3条答案
按热度按时间x9ybnkn61#
好了!
应用程序.工作簿!=应用程序.工作簿
这个属性不公开变量,它生成一个值。所以每次我访问Workbooks属性时,我都创建一个新的COM对象。
我修改了代码,一切都很好。谢谢大家。
3pvhb19x2#
这是Office应用程序中普遍存在的问题。所有Excel加载项/自动化应用程序都应在不再需要Excel对象时系统地释放它们对Excel对象的引用。未能系统地释放对Excel对象的引用可能会阻止Microsoft Office Excel正常关闭。有关详细信息,请参阅Systematically Releasing Objects。它与Outlook有关,但相同的原则可应用于所有Office应用程序。
使用完Excel对象后,请使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放该对象。然后在Visual Basic中将变量设置为Nothing(在C#中为null)以释放对该对象的引用。
byqmnocz3#
这样做是错误的,但这是解决问题的最简单方法:
您所需要的只是在需要使用它时初始化所有未初始化的变量,并在需要关闭应用程序时调用CloseExcelApp()。