Dec 6

.Net操作Excel后彻底释放资源 不指定

lee , 13:04 , 开发相关 » C#┋Vb.Net , 评论(3) , 引用(0) , 阅读(9560) , Via 本站原创 | |
和同事在工作中遇到的:
在.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)
……
Tags: , ,
试试
2007/07/05 10:56
我全部都是 null了
全部 ReleaseComObject  了 都不行
lee 回复于 2007/07/05 11:07
定义workbooks,不是workbook,那个是以前写的有点问题
wintel
2006/12/08 11:36
kill 不用心
lee 回复于 2006/12/08 12:15
shy当时写在word文档里,没注意
wintel
2006/12/07 11:46
fear 哪里有红字?
lee 回复于 2006/12/07 12:32
sweat拷的word文档上的,改过了
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]