色吊丝最新资源-第一福利在线视频-欧美久久久-欧产日产国产精品v原神 |www.phbaer.net

來(lái)古計(jì)算機(jī) > .NET > 正文

.net下如何快速釋放com組件

在.net的世界里,程序員只負(fù)責(zé)使用new創(chuàng)建對(duì)象,而對(duì)象的銷(xiāo)毀則完全交給垃圾回收器負(fù)責(zé),只有當(dāng)發(fā)生垃圾回收的時(shí)候,.net中的類(lèi)型才會(huì)被銷(xiāo)毀。這通常不會(huì)引起什么不妥。但是,當(dāng)使用了非托管的com對(duì)象的時(shí)候,則會(huì)帶來(lái)特別的問(wèn)題。

com使用引用計(jì)數(shù)來(lái)確定對(duì)象的生存期,com客戶(hù)每次引用對(duì)象的時(shí)候,就調(diào)用

IUnKnown->AddRef(),而每次釋放對(duì)象的時(shí)候,就調(diào)用

IUnKnown->Release(),一旦引用計(jì)數(shù)達(dá)到零,就釋放實(shí)例。

問(wèn)題就這樣產(chǎn)生了,讓我們看下面的代碼:

這是在CSDN的asp.net版廣為流傳的一段使用excel com組件導(dǎo)出excel文件到客戶(hù)端的c#代碼,在添加這段代碼之前,運(yùn)行了添加com引用的向?qū)А?/p>

Excel.Application  oExcel;  

Excel.Workbook  oBook;  

Object  oMissing  =  System.Reflection.Missing.Value;  

oExcel  =  new  Excel.Application();  

oBook  =  oExcel.Workbooks.Add(oMissing);  

for  (int  i=1;i  <=4;i++)  

{  

 oExcel.Cells[i,1]=i.ToString();  

 oExcel.Cells[i,2]=  "'bbb2  ";  

 oExcel.Cells[i,3]=  "'ccc3  ";  

 oExcel.Cells[i,4]=  "'aaa4  ";  

}  

oBook.Saved  =  true;  

oExcel.UserControl  =  false;  

string filename = DateTime.Now.Ticks.ToString();

string  mm=Server.MapPath(  ".")+ "\\" + filename + ".xls";//服務(wù)器保存地址  

oExcel.ActiveWorkbook.SaveCopyAs  (mm);  

oExcel.Quit();

//GC.Collect();

Response.Redirect(filename+".xls");

這段代碼能夠?qū)崿F(xiàn)導(dǎo)出文件的功能,但是如果察看Windows任務(wù)管理器,就會(huì)發(fā)現(xiàn)如下圖的精彩場(chǎng)面

07.jpg

于是,有人就在代碼中加了一句“GC.Collect();”,很好,EXCEL.EXE沒(méi)有那么多了,如下圖

08.jpg

但是,如何能徹底釋放呢?


幸運(yùn)的是,在.net中,允許程序員顯式地自己調(diào)用com的Release方法,這個(gè)方法經(jīng)過(guò).net的包裝,叫做System.Runtime.InteropServices.Marshal.ReleaseComObject,在上面的代碼中,

調(diào)用“GC.Collect();”之前,先調(diào)用

“System.Runtime.InteropServices.Marshal.ReleaseComObject((object)oExcel);”,

把引用計(jì)數(shù)減一,這樣,引用計(jì)數(shù)就變成了零,垃圾回收發(fā)生時(shí),oExcel所對(duì)應(yīng)的com對(duì)象,就被掃地出門(mén)。


推薦文章

發(fā)表評(píng)論:

◎歡迎參與討論,請(qǐng)?jiān)谶@里發(fā)表您的看法、交流您的觀(guān)點(diǎn)。

標(biāo)簽列表
網(wǎng)站分類(lèi)
最新留言

Powered By Z-BlogPHP and Terry

Copyright @ laigucomputer.com 來(lái)古計(jì)算機(jī) 工信部備案號(hào):粵ICP備18009132號(hào)