.net 託管代碼與非託管代碼

關鍵是要了解CLR(公共語言運行時)
.Net Framework 是由彼此獨立又相關的兩部分組成:CLR 和 類庫, CLR是它爲咱們提供的服務,類庫是它實現的功能. .NET的大部分特性----垃圾收集,版本控制,線程管理等,都使用了CLR提供的服務
當你爲.NET Framework編譯源代碼的時候,獲得的目標代碼不是CPU能識別的機器指令,而是一種叫作"微軟中間語言(MSIL,或簡稱爲IL的代碼)"的新語言.CLR提供了一個實時編譯器,用來把IL代碼編譯爲本機機器代碼.這樣一來,CLR可以使代碼變得可移植,由於.NET應用程序的源代碼必須被編譯爲IL代碼,這些IL代碼能夠運行在任何提供CLR服務的平臺上.從CLR的角度來看,全部的語言都是平等的,只要有一個能生成IL代碼的編譯器就行,這就確保了各類語言的互操做性.
爲CLR而編寫以及使用CLR服務的代碼叫"託管代碼",而那些未使用CLR服務的代碼(也就是你多年以來一直編寫的代碼)叫"非託管代碼".
討論到C++在.NET託管環境中的應用,因爲C++不是爲.NET平臺設計的語言,因此,微軟須要對C++做一些擴充,這就引入了"託管擴展"這一律念,它容許咱們在C++項目中使用.NET Framework,若是有下列開發須要,就必須使用託管擴展:
1. 將現有的C++代碼移植到託管環境中
2. 在C++代碼中訪問.NET Framework類
3. 經過.NET語言訪問現有的C++代碼 編程


託管代碼是一種相似於JAVA虛擬機相似的代碼,但與JAVA虛擬機不一樣,它的執行效率仍是很是好,它被叫作IL碼,或是MSIL碼,即中間碼的意思
非託管代碼就是本地代碼的意思,就是說在執行時是直接送往CPU的, 網絡


COM/COM++組件,ActiveX控件,API函數,指針運算,自制的資源文件...這些的非託管的,其它就是託管的.ide


對於託管的資源的回收工做,是不須要人工干預回收的,並且你也沒法干預他們的回收,所可以作的只是瞭解.net CLR如何作這些操做。也就是說對於您的應用程序建立的大多數對象,能夠依靠 .NET Framework 的垃圾回收器隱式地執行全部必要的內存管理任務。
函數

對於非託管資源,您在應用程序中使用完這些非託管資源以後,必須顯示的釋放他們,例如System.IO.StreamReader的一個文件對象,必須顯示的調用對象的Close()方法關閉它,不然會佔用系統的內存和資源,並且可能會出現意想不到的錯誤。
性能

我想說到這裏,必定要清楚什麼是託管資源,什麼是非託管資源了?
url

最多見的一類非託管資源就是包裝操做系統資源的對象,例如文件,窗口或網絡鏈接,對於這類資源雖然垃圾回收器能夠跟蹤封裝非託管資源的對象的生存期,但它不瞭解具體如何清理這些資源。還好.net Framework提供了Finalize()方法,它容許在垃圾回收器回收該類資源時,適當的清理非託管資源。若是在MSDN Library 中搜索Finalize將會發現不少相似的主題,這裏列舉幾種常見的非託管資源:ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReaderspa

,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 等等資源。可能在使用的時候不少都沒有注意到!
操作系統

關於託管資源,就不用說了撒,像簡單的int,string,float,DateTime等等,.net中超過80%的資源都是託管資源。
.net

非託管資源如何釋放,.NET Framework 提供 Object.Finalize 方法,它容許對象在垃圾回收器回收該對象使用的內存時適當清理其非託管資源。默認狀況下,Finalize 方法不執行任何操做。默認狀況下,Finalize 方法不執行任何操做。若是您要讓垃圾回收器在回收對象的內存以前對對象執行清理操做,您必須在類中重寫 Finalize 方法。然而你們均可以發如今實際的編程中根本沒法override方法Finalize(),在C#中,能夠經過析構函數自動生成 Finalize 方法和對基類的 Finalize 方法的調用。線程

例如:
~MyClass()
{
// Perform some cleanup operations here.
}
該代碼隱式翻譯爲下面的代碼。
protected override void Finalize()
{
try
{
// Perform some cleanup operations here.
}
finally
{
base.Finalize();
}
}

 

可是,在編程中,並不建議進行override方法Finalize(),由於,實現 Finalize 方法或析構函數對性能可能會有負面影響。一個簡單的理由以下:用 Finalize 方法回收對象使用的內存須要至少兩次垃圾回收,當垃圾回收器回收時,它只回收沒有終結器(Finalize方法)的不可訪問的內存,這時他不能回收具備終結器(Finalize方法)的不能夠訪問的內存。它改成將這些對象的項從終止隊列中移除並將他們放置在標記爲「準備終止」的對象列表中,該列表中的項指向託管堆中準備被調用其終止代碼的對象,下次垃圾回收器進行回收時,就回收並釋放了這些內存。

 

 

摘自:http://wenku.baidu.com/link?url=LGTBo9u4d0QOC38bJTO5WEjK_WIR_ahLXuNXYscDgkKysaTfueWAM5Qn7eV7AX2S67iEc8B1jQLTTuKEp-DEmBGEkirXRCIiS8fz09BWUXm

相關文章
相關標籤/搜索