1. 程式人生 > >CLR via C#--------CLR的執行模式

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

ros 穩定性 穩定 人員 代碼生成 jit ext 異步操作 web form

CLR:是一個可由多種編程語言使用的“運行時”。

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

CLR是完全圍繞類型展開的。

面向CLR的語言編譯器:

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的抽象。

將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.非托管代碼可以使用托管類型(服務器)

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