關於C#託管程式碼與非託管程式碼的理解
C#託管程式碼是什麼?
託管程式碼(Managed Code)實際上就是中間語言(IL)程式碼。程式碼編寫完畢後進行編譯,此時編譯器把程式碼編譯成中間語言(IL),而不是能直接在你的電腦上執行的機器碼。程式集(Assembly)的檔案負責封裝中間語言,程式集中包含了描述所建立的方法、類以及屬性的所有元資料。
託管程式碼在公共語言執行庫(CLR)中執行。這個執行庫給執行程式碼提供了多種服務,通常來說,公共語言執行庫可以載入和驗證程式集,並以此來保證中間語言的正確性。當某些方法被呼叫時,公共語言執行庫把具體的方法編譯成適合本地計算機執行的機器碼,並且將編譯好的機器碼快取起來,以備下次呼叫時使用。這個過程就是即時編譯。
注意:程式實際上是被“託管”在公共語言執行庫中。隨著程式集的執行,公共語言執行庫會持續地提供各種服務,例如記憶體管理、安全管理、執行緒管理等等。
總結:託管程式碼(Managed Code)是由公共語言執行庫(CLR)執行的程式碼,而不是由作業系統直接執行。託管程式碼也可以呼叫CLR的執行庫服務和功能,比如GC、型別檢查、安全支援等等。這些服務和功能提供獨立與開發語言的、統一的Managed Code應用程式行為。
C#非託管程式碼是什麼?
非託管程式碼(Unmanaged Code)是指直接編譯成目標計算機的機器碼,這些程式碼只能執行在編譯出這些程式碼的計算機上,或者是其他相同處理器或者幾乎一樣處理器的計算機上。
非託管程式碼不能享受公共語言執行庫所提供的一些服務,例如記憶體管理、安全管理等。 如果非託管程式碼需要進行記憶體管理等服務,就必須顯式地呼叫作業系統的介面,通常非託管程式碼呼叫Windows SDK所提供的API來實現記憶體管理。 非託管程式也可以通過呼叫COM介面來獲取作業系統服務。 注意:C#跟Visual Studio平臺的其他程式語言不一樣的是,C#可以建立託管程式與非託管程式。當建立的專案選擇名字以MFC,ATL或者Win32開頭的專案型別,那麼這個專案所產生的就是非託管程式。
總結:非託管程式碼(Unmanaged Code)不由CLR公共語言執行庫執行,而是由作業系統直接執行的程式碼。
原文轉至:http://zhidao.baidu.com/link?url=bV1T7hfmsSFUUA1K5VyXN-dpgSW5-1j4tzV5uE9xMg4GLSNRQKs73Ky5UUqg5UX4uyfpkBs0PUeQw9bOFx_ng3aTXzaJYa1fFlATX2Yr9XK
其他相關文章參考:http://bbs.csdn.net/topics/270000476