CLR via C#--------CLR的執行模式

CLR:是一個可由多種編程語言使用的「運行時」。算法

CLR的核心功能(好比 內存管理、程序集加載、安全性、異常處理、線程同步)可由面向CLR的全部語言使用。數據庫

CLR是徹底圍繞類型展開的。編程

 

面向CLR的語言編譯器:windows

    Microsoft:C++/CLI、C#、Visual Basic、F#、Iron Python 以及IL彙編器。安全

    其餘公司、學院:Ada、PAL、Caml、COBOL、LOGO、PHP...服務器

託管模塊的組成部分:PE32/PE32+頭、CLR頭、元數據、IL代碼。網絡

IL基於棧的。數據結構

IL指令時「無類型」(typeless)的架構

IL提供的優點:應用程序的健壯性和安全性,對底層CPU的抽象。less

將IL編譯成本地CPU指令時,CLR會執行一個名爲驗證的過程。(檢查高級IL代碼,肯定代碼所作的一切都是安全的。)

在託管模塊的元素中,包含了要由驗證過程使用的全部方法和類型信息。

在Windows中,每一個進程都有它本身的虛擬地址空間。(保證程序的健壯性,穩定性;一個進程沒法干擾另外一個進程)

託管代碼相較於非託管代碼的優點:在一個操做系統進程中運行多個應用程序,可減小進程數,從而加強性能(windows進程須要使用大量操做系統資源)。

 

不安全代碼 使用場景:直接操做內存地址的代碼稱爲不安全代碼,並可操做這些地址處的字節。一般只有在與非託管代碼進行互操做,或者在提高對效率要求極高的一個算法的性能的時候,才須要這樣作。

不安全代碼 風險:可能破壞數據結構,危害安全行性,甚至可能形成新的安全漏洞。

C#編譯器要求包含不安全代碼的全部發明合法都用unsafe關鍵字標記,要求使用/unsafe編譯器開關來編譯源碼。

 

本地代碼生成器:NGen.exe

1.做用:

     加快應用程序的啓動速度。

     減少應用程序的工做集。

2.NGen生成的文件存在的問題:

     沒有知識產權保護。

     NGen生產的文件可能失去同步。

     較差的執行時性能。

 

正是由於存在上述這些問題,因此在考慮shiyNGen.exe時,務必很是謹慎。對於服務器端的應用程序,NGen.exe的做用並不明顯,甚至毫無用處,這是由於只有第一個客戶端請求才會感覺到性能的降低,後續的全部客戶端請求都能以全速運行。此外,對於大多數服務器應用程序,因爲只須要代碼的一個實例,因此沒法從工做集的縮小中得到任何好處。還須要注意,NGen.exe2.0以前生成的映像不能在不提部分的AppDomain之間共享。所以,若是一個程序集要在跨AppDomain的環境中使用(好比ASP.NET),用NGen來生成它是沒有任何好處的。(不過,這一限制在NGen2.0以後已經不存在了。)

 

對於客戶端的應用程序,也許能用NGen.exe加快啓動速度,或者縮小工具集(若是程序集同時由多個應用程序使用)。即便一個程序集不是由多個應用程序使用,用NGen來生成它,也有助於加強工做集。此外,假如用NGen.exe來生成一個客戶端應用程序的全部程序集,CLR根本不須要加在JIT編譯器,從而進一步縮小工做集,固然,只要有一個程序集不是用NGen生成的,或者程序集的一個由NGen聲生成的文件沒法使用,那麼仍是會加載JIT編譯器,應用程序的工做集將隨之增大。

 

 

Framework類庫

.NET Framework 中包含了Framework類庫(Framework Class Library)。FCL是一組DLL程序集的統稱,其中含有數千個類型定義,每一個類型都公開了一些功能。

 

下面列舉了應用程序開發人員能夠利用這些程序集建立的一部分應用程序:

     Web Service

     Web Form

     Windows應用程序

     RIA

     Windows控制檯應用程序

     Windows服務

     數據庫存儲過程

     組件庫

 

全部的應用程序都要使用來自System命名空間的類型。

部分常規的FCL命名空間
命名空間 內容說明
System 包含每一個應用程序都要用到的全部基本類型
System.Data 包含用於和數據庫通訊以及處理數據的類型
System.IO 包含用語執行流I/O以及瀏覽目錄/文件的類型
System.Net 包含進行低級網絡通訊,並與一些經常使用Internet協議協做的類型
System.Runtime.InteropService 包含容許託管代碼訪問非託管操做系統平臺功能(好比COM組件以及Win32或定製DLL中的函數)的類型
System.Security 包含用語保護數據和資源的類型
System.Text 包含處理各類編碼方式(好比ASCII和Unicode)的文本的類型
System.Threading 包含用於異步操做和同步資源訪問的類型
System.Xml 包含用於處理XML架構(XML Schema)和數據的類型

 

通用類型系統CTS

CLR是徹底圍繞類型展開的。CTS描述了類型的定義和行爲。

CTS規則:

1.CTS規範規定一個類型能夠包含零個或者多個成員。(成員包括:字段、方法、屬性、事件)

2.CTS指定了類型可視性規則以及類型成員的訪問規則。(private、protected、internal、public...)

3.CTS爲類型繼承、虛方法、對象生存期等定義了相應規則。

4.全部的類型最終必須從預訂一的System.Object類型繼承。

    System.Object類型容許作的事情:

    1)比較兩個實例的相等性。

    2)獲取實例的哈希碼。

    3)查詢一個實例的真正類型。

    4)執行實例的淺(按位)拷貝。

    5)獲取實例對象的當前狀態的一個字符串表示。

 

公共語言規範CLS

COM容許使用不一樣的語言建立對象的相互通訊。CLR能夠集成全部語言,容許在一中語言中使用另外一種語言建立的對象。之因此能實現這樣的集成,是由於CLR使用了標準類型集、元數據(自描述的類型信息)以及公共執行環境。

CLS:CLS詳細定義了一個最小功能集。任何編譯器生成的類型要想兼容雨由其餘「符合CLS、面向CLR的語言」所生成的組件,就必須支持CLS定義的這個最小功能集。

每種語言都提供了CLR/CTS的一個子集以及CLS的一個超集(但不必定是同一個超集)。

一種語言定義一個類型時,若是但願在另外一種語言中使用該類型,就不要在該類型的public和protected成員中使用位於CLS外部的任何功能。不然,其餘開發人員使用其餘語言寫代碼時,就可能沒法訪問這個類型的成員。

 

 

託管代碼與非託管代碼的互操做性

CLR支持三種互操做的情形:

1.託管代碼可以調用DLL中的非託管代碼

2.託管代碼可使用現有的COM組件(服務器)

3.非託管代碼可使用託管類型(服務器)

相關文章
相關標籤/搜索