如果不同的可執行代碼在同樣的進程空間裡運行,那麼顯然他們可以方便的共享數據,因為理論上他們可以直接訪問彼此的數據。盡管理論上這樣是可行的,但是,在實際情況下CLR會檢查每個運行的代碼以保證這種情況不會發生,這樣就保證了代碼不會超出自己所擁有的區域執行操作了。乍一看這似乎是不可能的,畢竟如果你不去實際運行代碼你又怎樣知道代碼究竟是怎樣運行的?
實際上,因為IL擁有強大的類型安全機制,所以這樣做是可能的。在大多數情況下,除非代碼使用了不安全的特性,比如指針,否則數據類型就會保證內存不會被不正當的訪問。比如,.NET數組類型會執行邊界檢查以確保任何越界數組操作都是不允許的。如果一個運行的應用程序確實需要與不同的應用程序域的另一個運行的應用程序通信或者共享數據,那麼它就必須通過調用.Net的遠程服務的方式實現。
這種驗證代碼以確保代碼不可以超出應用程序域訪問數據的機制就叫做內存類型安全(不同於通過外部遠程調用機制)。這樣處於一個進程中的不同應用程序域的類型安全代碼就可以安全運行而互不干擾。
1.3.3.3 通過異常處理錯誤
與Java 和 C++所采用的異常處理機制一樣,.NET Framework也設計為采用這種方便的基於異常的錯誤處理機制。C++開發者應該注意到,由於同樣IL有強大的輸入系統,所以在IL中以和C++同樣的方式使用異常並不會帶來性能損失。.Net 和 C#還支持許多C++開發者期待的finally塊。
我們將要在第11章詳細討論異常。簡單的說,異常處理的方法就是專門指定一塊代碼來作為異常處理例行程序負責處理特殊的異常情況,每一塊代碼都可以處理特定的錯誤狀況(例如,一個文件沒有找到,或者某些操作被拒絕執行)。這種特定的錯誤狀況可以根據你的需要而定制,你可以定的條件很窄也可以很寬。異常處理體系結構可以確保一旦有錯誤情況發生,程序就會立即跳到異常處理例行程序中那個處理此特定情況的代碼塊處執行。
異常處理體系結構還提供了一個方便的辦法,你可以傳遞一個包含明確的異常信息的對象給一個異常處理例行程序。這個對象可能包含用戶的特定消息和具體是代碼的什麼地方檢測到了異常。
當異常發生時,大多數異常處理體系結構,包括程序流控制,都是由高級語言處理的(例如C#, Visual Basic .Net, C++),而不被任何特定的IL命令所支持。例如,C#利用代碼塊try { }, catch{ }, 和 finally{ }來處理異常(詳細情況請參看第11章)。
但是,.NET也確實提供了一個基礎結構,讓所有以.NET為目標運行平台的編譯器支持異常處理。特別是,.NET提供了一個.Net類的集合用來專門表示異常,並且語言互操作性允許異常處理代碼處理拋出的異常對象而不管處理異常的代碼使用什麼語言編寫的。這種語言無關性是C++ 和 Java的異常處理機制都不能實現的,但是在COM的錯誤處理機制種有一定的體現,這包括從方法中返回錯誤代碼以及傳遞錯誤對象。在不同的語言中保持異常處理的一致性對多語言開發來說是至關重要的一個環節。
1.3.3.4 屬性的使用
用C++編寫COM組件的開發者一定對屬性這個特性很熟悉(通過他們使用Microsoft’s COM Interface Definition Language [IDL])。屬性最初的用意是為了給編譯器提供關於某些程序相關的額外信息使用。
屬性是由.NET支持的,因此現在C++, C#, 和 Visual Basic .NET肯定也都支持。但是,.NET的屬性有所創新,那就是它提供了一種機制,使你可以在你的源代碼中定義你自己的屬性。這些用戶定義的屬性將會被放置在數據類型或者方法所對應的元數據中。這些元數據可以用於文檔的編制,他們可以和反射技術同時使用來實現基於屬性的執行設計任務。另外,與.Net的語言無關性的原理一樣,可以在源代碼中用一種語言定義屬性而用另一種語言將其讀出。
我們將要在第10章討論屬性。
1.4 程序集
一個程序集是邏輯單元,它包含為.Net Framework所編譯的代碼。在這裡我們不希望過多的關注程序集的細節,因為在第13章我們將要詳細討論,但是在這裡概括他的要點。
程序集是完全自我描述的,而且是一個邏輯上的單元而不是物理上的,這也就表示他可以本存儲在不只一個文件裡(實際上動態程序集是存儲在內存裡的,而不是文件裡)。如果一個程序集被存儲在多個文件裡,那麼就會有一個主文件包含主要的入口點並且描述程序集中的其他文件。
應該注意到,對於可執行代碼和庫代碼來說,他們的程序集的結構都是一樣的。他們其中的唯一差別就是,可執行代碼的程序集裡包含一個主要程序出口點,而庫代碼的程序集裡沒有。
程序集的一個重要特性使它包含對應代碼中定義的描述類型和方法元數據。但是,一個程序集也包含一些描述程序集自身元數據。這些包含在一個叫做程序集清單的程序集元數據,可以用來檢查程序集的版本信息以及完整性。
注意:ildasm,一個基於Windows的使用工具,可以用來檢查程序集的內容,包括程序集的清單和元數據。我們將在第13章討論ildasm。
事實上程序集包含程序的元數據意味著應用程序或者其他的程序集調用別的代碼時,有了程序集所描述的信息,就不需要為了如何使用程序集而查詢注冊表或者其他的數據源了。相對於老的COM的做法,現在的這種做法有重大的突破。在以前的老方法中,組件的GUIDs和借口必須從注冊表中獲得,而且在某些情況下,方法和屬性的細節還需要從類型庫中讀取。