立即釋放.net下的com組件

來源:互聯網
上載者:User

眾所周知,在.net的世界裡,程式員只負責使用new建立對象,而對象的銷毀則完全交給記憶體回收行程負責,只有當發生記憶體回收的時候,.net中的類型才會被銷毀。這通常不會引起什麼不妥。但是,當使用了非託管的com對象的時候,則會帶來特別的問題。
com使用引用計數來確定對象的生存期,com客戶每次引用對象的時候,就調用IUnKnown->AddRef(),而每次釋放對象的時候,就調用IUnKnown->Release(),一旦引用計數達到零,就釋放執行個體。問題就這樣產生了,讓我們看下面的代碼:
這是在CSDN的asp.net版廣為流傳的一段使用excel com組件匯出excel檔案到用戶端的c#代碼,在添加這段代碼之前,運行了添加com引用的嚮導。
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";//伺服器儲存地址 
oExcel.ActiveWorkbook.SaveCopyAs  (mm); 
oExcel.Quit();
//GC.Collect();
Response.Redirect(filename+".xls");


這段代碼能夠實現匯出檔案的功能,但是如果察看Windows工作管理員,就會發現如下圖的精彩場面

於是,有人就在代碼中加了一句“GC.Collect();”,很好,EXCEL.EXE沒有那麼多了,如下圖。


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

幸運的是,在.net中,允許程式員顯式地自己調用com的Release方法,這個方法經過.net的封裝,叫做System.Runtime.InteropServices.Marshal.ReleaseComObject,在上面的代碼中,調用“GC.Collect();”之前,先調用“System.Runtime.InteropServices.Marshal.ReleaseComObject((object)oExcel);”,把引用計數減一,這樣,引用計數就變成了零,記憶體回收發生時,oExcel所對應的com對象,就被掃地出門。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。