相信在C# 中使用过EXCEL的人都遇到过调用 ExcelApplication.Quit() ,但是 Excel进程依然存在的情况:
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
//Do your work...
excelApp.Quit()
GOOGLE了许多中文帖子,最终都是强行调用 Process.kill() 草草了事。其实解决方案就在微软的网站上:
http://support.microsoft.com/kb/Q317109
看了这个以后,根源其实就在引用计数:
当 Visual Studio .NET 从托管代码调用 COM 对象时,它自动创建运行库可调用包装 (RCW)。RCW 封送 .NET 应用程序和 COM 对象之间的调用。RCW 保留着对 COM 对象的引用计数。因此,如果 RCW 上没有将所有引用全部释放,COM 对象就不会退出。 |
简单的说,就是栈内存中,依然有对象引用存在,RCW我推测是堆内存中的一段区域,栈内存中的对象指向了堆内存,所以GC就认为这一段堆内存依然有用,就不会去释放它。
所以,最终的解决方案其实就如这个链接指出的: