clr是什么?
上次講到運行在.net framework中的代碼叫做managed code,反之叫做unmanaged code。相比unmanaged code,managed code 有很多好處,比如可以用多種編程語言編寫、提高安全性、易于版本控制和程序發布等等。這些都是由clr提供的。但也有一些不利點,最容易想到的就是代碼運行速度問題了。
要為managed code提供以上功能,clr必須知道代碼中的數據類型、類和與她有關連的assembly的定義。這些信息叫做metadata,而metadata就包含在代碼中的某個部分(編譯后)。clr利用這個metadata加載代碼段、管理內存、執行方法調用等操作。
.net出來以前,在不同編程語言之間共享原代碼,簡直是不可能的事情。因為每個編程語言定義的數據類型不同,而且語法也不同。微軟大師們想到了把數據類型統一的好辦法。這個技術叫cts(common type system)。現在做項目開發就比較簡單了(用不同語言),比如一個項目組里有會用vb的,會用c++的??赡芤郧暗姆椒ㄊ前褍蓚€人之間互相調用的功能寫成dll或com。但現在不用這么麻煩了,你直接就可以使用其他語言編寫的代碼了。具體一點,用vb.net可以繼承c++.net寫的類,反過來也是可以的。
我們安裝軟件的時候常碰到這樣的提示 - 系統中的組件比要安裝的組件的新,你要替換還是保留?是不是很討厭?!現在開始你就用.net吧,她不會因為這個“小”問題而打擾你了。因為每個代碼都包含與她相關的metadata,clr會根據這個信息來管理代碼的不同版本。而且因為不用把代碼的信息注冊到注冊表,所以可以用x-copy的方式安裝代碼(就是簡單的拷貝粘貼了)。
是用vb做好呢?還是用c++做好呢?這些問題是我們做項目的時候常要考慮的問題。但在.net用什么編程語言已經變得不重要了(但還是有一定的差別,在特定項目中),因為clr提供cts(還有base class library),而且都運行在clr上面。在.net中vb,c++等語言都有了相當多的提高,而且有了新的語言c#。c#已經申請了標準而且通過,可想而知她的powe了。大家知道borland也發布了相關的開發工具c# builder。
做個小結
1、.net代碼都包含與自己相關的信息叫做metadata。
2、 clr提供cts(cls也有功勞),所以可以在不同編程語言之間共享原代碼。
3、 用metadata管理代碼信息(不是利用注冊表),所以代碼易于安裝。
4、 使用統一的數據類型和類庫,所以編程語言的選擇變得不重要了,而且易于團隊開發。
代碼在clr中的運行過程
1、選擇編譯器
首先clr選擇編譯器,因為clr中可以運行不同語言開發出來的代碼。
2、把代碼編譯成msil
clr利用選擇的編譯器生成msil(microsoft intermediate language)和metadata把她們加載到pe(portable executable file)。
msil:解釋語言,包含代碼信息,讓jit易于編譯成機器語言。與操作系統和編程語言無關。
pe:可執行文件格式,windows就是dll或exe了。
3、用jit編譯器把msil編譯成機器語言
有兩種方式一種是只編譯當前執行的代碼段,另一種是把整個代碼一次性編譯。jit會檢測代碼的安全性。
4、 執行代碼
代碼首次調用就會編譯成機器代碼,再次調用的時候就不再重新編譯了。
相關工具
-msil生成器 - msil assembler(ilasm.exe)
-msil反編譯器 - msil assembler(ildasm.exe)
使用法
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cptools/html/cpconmsilassemblerilasmexe.asp
相關資料
-pe結構
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconmetadatapefilestructure.asp
參考資料
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconsourcecodelanguage.asp
新聞熱點
疑難解答