???? 托管代碼和非托管代碼有什么區別呢?從字面上理解,只是一個是被托管的,另一個是沒有被托管的。但是,被托管的托管代碼是被誰管著呢?讓我們先來看看它們的定義。
???? 托管代碼:由公共語言運行庫環境(而不是直接由操作系統)執行的代碼。托管代碼應用程序可以獲得公共語言運行庫服務,例如自動垃圾回收、運行庫類型檢查和安全支持等。這些服務幫助提供獨立于平臺和語言的、統一的托管代碼應用程序行為。
???? 非托管代碼:在公共語言運行庫環境的外部,由操作系統直接執行的代碼。非托管代碼必須提供自己的垃圾回收、類型檢查、安全支持等服務,它與托管代碼不同,后者從公共語言運行庫中獲得這些服務,而非托管代碼是在運行庫之外運行的代碼。例如COM 組件、ActiveX 接口和 Win32 API 函數都是非托管代碼的示例。
???? 從上面的定義中,有很人可能可以很好的理解。但是也有一些初學者可能看的會一頭霧水。所以我就來談談我的理解吧。
???? 在我的理解中,托管代碼就是要首先經過一個中間程序進行編譯(如微軟的CLR),在編譯后才能被發送到計算機中進行執行。通過這樣的一個中間過程,程序在內存中運行的時候,它所占據的內存空間是固定的,它只能子它所占據的內存空間中運行。其它的程序也不能夠對它的內存中的內容進行修改。而非托管代碼它所戰據的空間不是國定的,而且其它程序也能對它內存中的數據進行修改。
???? 下面舉一個別人講的例子:比如一個游戲修改器,有經常玩單機游戲的朋友都知道。一個游戲可以用游戲修改器來修改游戲的一些屬性。比如:金錢、武器、攻擊、生命等等。那么有的修改器(我不知到是不是全部,希望有知道的朋友跟我說一下)就是通過對游戲運行是的內存中的數據進行修改的。而這些可以用這種方法進行修改的游戲很可能就是用非托管代碼語言進行編寫的(如:C、C++)。而如果編寫游戲的代碼語言是受托管的(如:C#,那么就不可能用這種方法進行修改。
???? 下面畫一個簡單托管代碼和非托管代碼的執行過程:
?????
從上圖能夠很明白的看出它們的不同。
托管代碼:
? 1、運行的效率相對較低(因為多了一步CLR編譯),但安全性相對較高。
? 2、可以用在對安全性要求較高的地方。例如:企業內部管理系統、大型電商網站。
非托管代碼:
? 1、運行的效率相對較高,但安全性相對較低。
? 2、用在運行效率要求較高的地方。例如:系統軟件、底層軟件、驅動程序等。
?
因為本人也是新手,難免有很多錯誤的地方。請別見怪。