和同事在工作中遇到的:
在.net中,有时候需要对Excel文档进行操作,但通常我们并不能真正的正确释放Excel占用的资源。
我们在代码中通常会这样操作Excel
Dim excelWorkBook As Excel.Workbook
Dim excelWorkSheet As Excel.Worksheet
Dim appExcel As New Excel.Application
Dim excelRange As Excel.Rangge
…………

在操作完成后我们通常这样释放:
excelWorkBook.Close()
appExcel.Quit()
excelWorkSheet = Nothing
excelWorkBook = Nothing
appExcel = Nothing
……

看起来很正确嘛。OK,请打开资源管理器,发现Excel的进程了吗?再运行几次你的程序,是不是发现Excel的进程越来越多了?相信你现在有点想骂人了吧。
正确的释放资源的方法是:
excelWorkBook.Close()
appExcel.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel)
excelWorkSheet = Nothing
excelWorkBook = Nothing
appExcel = Nothing
……
System.GC.Collect(0)
这时候可以发现,Excel进程终于乖乖消失了。
PS:如果还不行的话,那就把你所有打开过的有关Excel的对象都用ReleaseComObject释放掉。

2006/12/05 更新:
经测试,在不同的机器上,内存的释放形式会有所差异。
因此,最保险的方法是把使用过的所有Excel相关的对象都用ReleaseComObject释放掉,最后调用System.GC.Collect(0)回收内存。例如:

excelWorkBook.Close()
appExcel.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel)
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWorkSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject (excelWorkBook)
excelWorkSheet = Nothing
excelWorkBook = Nothing
appExcel = Nothing
System.GC.Collect(0)
……

Back