首先 我們先瞭解下幾個名詞
CLR : Common Language Runtime 公用語言運行庫
它在.Net應用程式和底層作業系統之間提供了一個操作層。這個操作層可供.Net應用程式使用的運行時環境。
打個比方 我們要寫c語言的時候,c語言會編譯成組合語言,組合語言在去編譯成機器語言Cpu指令執行,那麼組合語言就類似於這個CLR,但這個比喻僅僅是比喻,供大家簡單理解CLR,區別實際上CLR並不是解譯器。
CLS : Common Language Specification 公用語言運行規範
它保證了.Net應用程式的互通性,被稱為公用語言運行規範,CLS限制了命名規範、資料類型、函數類型以及某些其他元素,為不同語言提供了一個公用標準。
打個比方 我們在VB.Net裡命名MyField和Myfield、myfield其實是一個變數,不區分大小寫並可以寫在類的外全域變數。但C#卻不可以。這個就是規範乾的事,不同語言有不同的規範,C#,VB.Net ,F# ,J# ,等.Net大家族每個成員都有其規範,最後規範解釋過後,會編譯相同的語種,至於這個語種是什麼,呵呵,你知道的。
CLI : Common Language Infrastrucure 通用語言基礎結構
它是ECMA國際化和ISO標準的一部分描述,描述了其語言基礎結構。
metadata : 中繼資料
managed code : Managed 程式碼
上面兩個皆為CLR的組成部分。
中繼資料 是應用程式所有結構項 類、類成員、類特性、全域項等的描述符及它們的關係所組成的一套系統。
Managed 程式碼 表示了應用程式的方法功能,他們以微軟中繼語言或通用中間語言的抽象二進位形式進行編碼。好了,終於,我們拋出了此文的中心:
MSIL : Microsoft intermediate language 微軟中繼語言
CIL : common intermediate language 通用中間語言
它們統稱 IL 中繼語言。
IL代碼由CLR 幫忙“託管” 。CLR託管至少包括三個主要的活動:類型控制、結構化異常處理和垃圾收集。
類型控制 涉及在執行期間項類型的驗證和轉換。
託管異常處理 在功能上與 非託管的結構化異常處理類似,但它是由CLR執行的而不是由作業系統執行的。
垃圾收集 涉及對不再使用的對象進行自動標識和釋放。(當然 智慧型裝置 除外,暫時沒有垃圾收集功能)
在CLR環境下,.Net應用程式由一個或多個託管可執行體組成,其中每一個都攜帶著中繼資料和Managed 程式碼,Managed 程式碼是可選的,但至少要帶有中繼資料,如果都沒有。那你寫這個就可以去吃屎了。託管的.Net應用程式稱為程式集。託管的可執行體稱為Module。每個程式集包含一個主模組,這個模組是什嗎?呵呵,你知道的。
託管可執行體的兩個主要組件:中繼資料和IL代碼。CLR處理這兩個組件的主要子系統是載入程式(loader)和JIT(just-in-time 即時)編輯器。
好了,打的手都酸了,在打下去浪費饅頭,現在給大家講講IL吧,上面的不是廢話,提供你IL的背景思想。
代碼
.assembly extern mscorlib { auto }
.assembly AndCount { }
.module andCount.exe
.namespace AndCount {
.class public AndCount extends [mscorlib]System.Object{
.method public static void AddCount() cil managed {
.entrypoint
.locals init (int32 retValue)
.try{
AskAfterNum:
ldstr "-------------------------------------------------------\n加法載入"
call void [mscorlib]System.Console::Write(string)
ldstr "\n請輸入第一個數字:"
call void [mscorlib]System.Console::Write(string)
call string [mscorlib]System.Console::ReadLine()
call int32 [mscorlib]System.Convert::ToInt32(string)
ldstr "\n請輸入第二個數字:"
call void [mscorlib]System.Console::Write(string)
call string [mscorlib]System.Console::ReadLine()
call int32 [mscorlib]System.Convert::ToInt32(string)
add
stloc retValue
ldloc retValue
brfalse Error
ldstr "計算完畢,結果為"
call void [mscorlib]System.Console::WriteLine(string)
ldloc retValue
br PrintCount
Error:
ldstr "error"
PrintCount:
call void [mscorlib]System.Console::WriteLine(int32)
ldloc retValue
brtrue AskAfterNum
}
catch [mscorlib]System.Exception
{
pop
ldstr "\n臨時錯誤!\n"
call void [mscorlib]System.Console::Write(string)
br AskAfterNum
}
ret
}
}
}
.field public static valuetype CharArray8 Format at FormatData
.data FormatData = bytearray(25 64 00 00 00 00 00 00)
.class public explicit CharArray8
extends [mscorlib]System.ValueType { .size 8 }
.method public static pinvokeimpl("msvcrt.dll" cdecl)
vararg int32 sscanf(string,int8*) cil managed{ }
將其儲存為test.il,並儲存編譯後執行
例如 儲存在D:\test.il 開啟cmd 執行ilasm d:\test.il 即可產生test.exe,執行看看結果吧
代碼是個大草莓,下一篇我會詳細講講IL組合語言,歡迎關注
本文章只供學習,切勿轉載!切記切記(轉載也厚道點寫個出處,謝謝哈)
by Eddy 2010.05.30