託管代碼編程
託管代碼(Managed Code)實際上就是中間語言(IL)代碼。緩存
代碼編寫完畢後進行編譯,此時編譯器把代碼編譯成中間語言(IL),而不是能直接在你的電腦上運行的機器碼。安全
程序集(Assembly)的文件負責封裝中間語言,程序集中包含了描述所建立的方法、類以及屬性的全部元數據。編程語言
託管代碼在公共語言運行庫(CLR)中運行。這個運行庫給運行代碼提供了多種服務,一般來講,公共語言運行庫能夠加載和驗證程序集,並以此來保證中間語言的正確性。spa
當某些方法被調用時,公共語言運行庫把具體的方法編譯成適合本地計算機運行的機器碼,而且將編譯好的機器碼緩存起來,以備下次調用時使用。這個過程就是即時編譯。 操作系統
注意:程序其實是被「託管」在公共語言運行庫中。隨着程序集的運行,公共語言運行庫會持續地提供各類服務,例如內存管理、安全管理、線程管理等等。線程
如圖:blog
非託管代碼接口
非託管代碼(Unmanaged Code)是指直接編譯成目標計算機的機器碼,這些代碼只能運行在編譯出這些代碼的計算機上,或者是其餘相同處理器或者幾乎同樣處理器的計算機上。內存
非託管代碼不能享受公共語言運行庫所提供的一些服務,例如內存管理、安全管理等。
若是非託管代碼須要進行內存管理等服務,就必須顯式地調用操做系統的接口,一般非託管代碼調用Windows SDK所提供的API來實現內存管理。
非託管程序也能夠經過調用COM接口來獲取操做系統服務。
注意:C#跟Visual Studio平臺的其餘編程語言不同的是,C#能夠建立託管程序與非託管程序。當建立的項目選擇名字以MFC,ATL或者Win32開頭的項目類型,那麼這個項目所產生的就是非託管程序。
總結:
非託管代碼(Unmanaged Code)不禁CLR公共語言運行庫執行,而是由操做系統直接執行的代碼。
非託管代碼必須本身提供垃圾回收,類型檢查,安全支持等等服務
。