全面認識.NET框架(一)

全面認識.NET框架(一)

 

重新學習下.NET框架,在這裏將會對.net框架逐步的學。加深一下對.net的認識。如果那個地方有錯誤,希望大家能夠指出來。謝謝。

知識有限,先逐步瞭解下.net包含的什麼。我就是寫寫我目前想了解的內容。做下筆記。有的是從別的地方看到了。感覺不錯就記下來了。

    我們大家都知道,.NET框架是一個多語言組件開發和執行環境,它提供了一個跨語言的統一編程環境。.NET框架的目的是便於開發人員更容易地建立Web應用程序和Web服務,使得Internet上的各應用程序之間,可以使用Web服務進行溝通。從層次結構來看,.NET框架又包括三個主要組成部分:公共語言運行時(CLR:Common Language Runtime)、服務框架(Services Framework)和上層的兩類應用模板——傳統的Windows應用程序模板(Win Forms)和基於ASP NET的面向Web的網絡應用程序模板(Web Forms和Web Services)。

 
一,什麼是 CTS、CLS、CLR

  (1)CTS(Common Type System)是通用類型系統。主要用於解決不同語言的數據類型不同問題,他是一種類型標準,在這個標準中不但實現了COM的變量兼容類型,還定義了通過 用戶自定義的方式來進行類型擴展,所以.NET平臺爲目標語言通過建立本身數據類型與CTS之間的映射來實現與其他語言的數據類型的交互。

 (2)CLS(Common Language Specification)是公共語言規範,主要用於實現多種語言之間的互操作性,是公共類型系統的子集。

   (3)CLR(Common Language Runtime)公共語言運行庫,是所有應用程序都要使用的編程基礎,他如同一個支持.net應用程序運行和開發的虛擬機。

參看下圖有助於瞭解。

 

二,CTS、CLS、CLR有什麼用

  (1)CTS

  CTS,他定義瞭如何在.NET Framework 運行庫中聲明,使用,和管理類型,同時也是.NET Framework運行庫支持跨語言基礎的一個重要組成部分。

  功能:建立一個支持跨語言集成,類型安全和高性能代碼執行的框架。提供一個支持完整實現多種編程語言的面向對象的模型。定義各語言必須遵守的規則,有助於確保用不同語言編寫的對象能夠發生交互 作用。

  定義公共語言運行庫在聲明、使用和管理類型時所遵循的規則的模型。通用類型系統建立一個框架,該框架使得跨語言集成、類型安全和高性能代碼執行成爲可能。它是您可以用來生成類庫的原始資料。

通用類型系統支持兩種類別的類型,分別爲值類型和引用類型。

  (2)CLS

  CLS即公共語言規範,它是許多應用程序所需的一套基本語言功能。CLS規則定義了通用類型系統的子集,即所有適用於公共類型系統的規則都適用 於 CLS,除非CLS中定義了更嚴格的規則。CLS通過定義一組開發人員可以確信在多種語言中都可用的功能來增強和確保語言的互用性。CLS還建立了CLS 遵從性要求,可幫助用戶確定託管代碼是否符合CLS以及一個給定的工具對託管代碼(該代碼是使用CLS功能的)開發的支持程度。

  (3)CLR

  CLR即公共語言運行庫,是.NET Framework的基礎,可以將其看作一個在執行時管理代碼的代理,它提供了內存管理、線程管理和遠程處理等核心服務,並且還強制實施嚴格的類型安全以及可提高安全性和可靠性的其他形式的代碼準確性。

三,.NET3C:CTS、CLS和CLR

.NET結合Java和COM解決方案兩者優點來解決互操作性問題。類似於COM定義的標準二進制格式,.NET定義了一個稱爲通用類型系統 Common Type System(CTS)的類型標準。這個類型系統不但實現了COM的變量兼容類型,而且還定義了通過用戶自定義類型的方式來進行類型擴展。任何以.NET 平臺作爲目標的語言必須建立它的數據類型與CTS的類型間的映射。所有.NET語言共享這一類型系統,實現它們之間無縫的互操作。該方案還提供了語言之間 的繼承性。例如,用戶能夠在VB.NET中派生一個由C#編寫的類。

很顯然,編程語言的區別不僅僅在於類型。例如,一些語言支持多繼承性,一些語言支持無符號數據類型,一些語言支持運算符重載。用戶應認識到這一點, 因此.NET通過定義公共語言規範(CLS:Common Language Specification),限制了由這些不同引發的互操作性問題。CLS制定了一種以.NET平臺爲目標的語言所必須支持的最小特徵,以及該語言與其 他.NET語言之間實現互操作性所需要的完備特徵。認識到這點很重要,這裏討論的特徵問題已不僅僅是語言間的簡單語法區別。例如,CLS並不去關心一種語 言用什麼關鍵字實現繼承,只是關心該語言如何支持繼承。

CLS是CTS的一個子集。這就意味着一種語言特徵可能符合CTS標準,但又超出CLS的範疇。例如:C#支持無符號數字類型,該特徵能通過CTS 的測試,但CLS卻僅僅識別符號數字類型。因此,如果用戶在一個組件中使用C#的無符號類型,就可能不能與不使用無符號類型的語言(如VB.NET)設計 的.NET組件實現互操作。這裏用的是“可能不”,而不是“不可能”,因爲這一問題實際依賴於對non-CLS-compliant項的可見性。事實 上,CLS規則只適用於或部分適用於那些與其他組件存在聯繫的組件中的類型。實際上,用戶能夠安全實現含私有組件的項目,而該組件使用了用戶所選擇使用 的.NET語言的全部功能,且無需遵守CLS的規範。另一方面,如果用戶需要.NET語言的互操作性,那麼用戶的組件中的公共項必須完全符合CLS規範。

最後一個C是公共語言運行庫Common Language Runtime(CLR)。簡單地說,CLR是CTS的實現,也就是說,CLR是應用程序的執行引擎和功能齊全的類庫,該類庫嚴格按照CTS規範實現。作 爲程序執行引擎,CLR負責安全地載入和運行用戶程序代碼,包括對不用對象的垃圾回收和安全檢查。在CLR監控之下運行的代碼,稱爲託管代碼 (managed code)。作爲類庫,CLR提供上百個可用的有用類型,而這些類型可通過繼承進行擴展。對於文件I/O、創建對話框、啓動線程等類型—— 基本上能使用Windows API來完成的操作,都可由其完成。

讓我們正確看待“3C”。開發人員在構建自己的分佈式應用程序時,因爲 用戶在編程時將直接面對CLR,應將主要精力放在學習瞭解CLR上,而不是CTS和CLS。而對於希望以.NET平臺爲目標的語言和工具開發商來說,就需 要深入理解CTS和CLS。互操作性組件是分佈式應用的關鍵,因此理解.NET如何通過定義公共類型實現這一目標,也就顯得十分重要。

 

介紹完CTS,CLS,CTS.我們來看看開發和運行.NET需要的最基本環境。

四,開發和運行.NET需要的最基本環境

我們來分析下:

(1).NET程序的開發

這個問題很簡單,大部分.NET程序員都在使用微軟公司提供的產品Visual Studio平臺上開發.NET程序。但需要注意的是,Visual Studio IDE環境並不是惟一的、必須的工具,理論上可以使用任何一個文本編輯器編寫.NET的代碼,但是由於文本編輯器並不提供代碼的編譯調試以及語法提示等功 能,所以基本上沒有程序員僅僅使用文本編輯器來編寫.NET代碼。 

(2).NET的運行

運行.NET程序的基礎毋庸置疑是.NET Framework,可以在Microsfot的官方網站上免費下載.NET Framework。運行.NET程序必須具備的組件也是.NET Framework,這對於任何想運行.NET程序的操作系統來說都一樣。 

注意:目前.NET對於跨平臺的支持做的並不好,僅僅支持Windows平臺,在Linux、Unix系統上並不能直接安裝.NET Framework,只能安裝第三方的Mono作爲.NET Framework的替代,但Mono同.NET Framework的兼容性以及更新的速度等一系列問題,導致目前使用Mono開發的項目相對較少。 

總結:

開發和運行.NET程序必需安裝.NET Framework組件,當然也必須安裝Visual Studio IDE(雖然理論上文本編輯器也可以編寫.NET代碼,但實際上程序員都會安裝微軟公司的Visual Studio產品)。

我們對其環境也知道了,現在我們來看看.NET的運行機制是什麼

五,.NET的運行機制

  (1).NET程序被編譯成什麼形式的代碼

  .net程序在第一次編譯後,形成CLR頭,元數據和中間代碼。

  在實時運行或者部署時,進行第二次變異,編譯的結果是在CLR中可以執行的機器代碼;

  -CLR頭包含了.net在運行該程序時得到的信息,包括程序集版本號,文件名和模塊版本號。

  -MetaData包含了所有類型的定義,所有的引用以及程序集清單。

 

  (2) JIT是如何工作的

  JIT引擎在編譯中間代碼之前,會尋找本機機器代碼緩存並且確認是否可用:

  - 如果可以用,則直接加載;

  -  如果不可用,JIT引擎會查找類型中的方法存根,找到中間代碼並且進行編譯。

 

  (3)簡述程序集的加載機制

  CLR通過System.Reflection.Assembly.LoadFrom和System.Reflection.Assembly.Load來主動加載程序集:

  - 前者通過位置加載程序集;

  - 後者通過 唯一標識 強命名程序集 的四個元素來標識程序集;

  它們的加載方式一致,其內在策略是依次通過版本策略,CODEBASE位置,應用程序域位置和程序位置來查找程序集。

   

  (4)如何配置程序集的版本策略

  CLR支持3個級別上設定版本策略,依次是:應用程序策略,發行者策略和計算機策略。

  所有的策略的設置都是通過修改配置文件來實現的。3個級別策略依次會被CLR執行,而上一個策略的執行結果將被作爲下一個策略的輸入。

  發行者策略僅僅對那些被放入GAC(緩存)的程序集,並且可以再應用程序策略中被忽略。

 

既然上面提到程序集了,下面我們來看看什麼是程序集。

六,什麼是程序集和應用程序域

 

程序集和應用程序域是.NET框架中比較基本的概念,每個.NET程序員都在日常工作中不斷地與其打交道。程序集和應用程序域是.NET程序打包和部署的基礎,讀者需要清楚地理解其基本概念。

 

 所涉及的知識點

 

  • 程序集的基本概念
  • 應用程序域的基本概念

 

 分析問題

 

首先來解釋程序集的概念。程序集(Assembly) 是一個或多個模塊和資源文件的集合。當一個程序集被打包形成時,它不僅會包含所有的原始文件內容,也會添加一個程序集清單,該清單包含了程序集的版本號、 語言、發佈者、導入類型等信息。有趣的是,程序集清單可以被添加到程序集中的某個文件之上,編譯器也可以爲程序集清單單獨創建一個文件。

 

  程序集是一個邏輯上的概念,而不是指一個或幾個物理文件或者代碼段。

 

程序集概念的引入,給系統的設計和部署帶來了很大的靈活性。

 

1)程序集支持多編程語言開發,就是一個程序集可以包含由不同編程語言定義和實現的模塊。在程序集被編譯形成時,所有這些類型已經被編譯成中間代碼,而不再帶有原來編程語言的特性。

 

2)程序集允許邏輯分佈和物理分佈分離。這樣雖然同屬於一個邏輯程序集,各種類型和資源仍然可以分佈在不同的物理文件裏。這大大地提高了系統部署的靈活性。例如程序員可以把某個程序集分成四個文件,分別包含基本類型定義、基本HELP文檔、可選類型定義和可選HELP文檔。這樣在部署該系統時,可以讓用戶選擇需要的功能,並且按照用戶的選擇從服務器下載必要的文件來組成程序集。

 

  包含了程序集清單的那個文件對使用該程序集來說是必需的。

 

接下來看一下應用程序域的概念,同樣,這是一個.NET提出的新概念。在操作系統中,一個普通的應用程序通常佔據一個操作系統的進程。操作系統的進程爲應用程序提供了獨立的內存空間,規定了代碼的執行範圍,並且提供了錯誤隔離機制。在.NET框架中,應用程序域(AppDomain)提供了和操作系統進程非常類似的功能。一個在CLR中運行的應用程序,將至少擁有一個應用程序域。和操作系統的進程相同,應用程序提供了代碼的執行範圍,並且爲程序提供隔離。在多個應用程序域間通信是非常困難的,每個類型實例都會存放在一個應用程序域內,並且,所有域內的引用必須引用自己所在應用程序域的對象。

 

和操作系統的進程不同的是,應用程序域的創建和銷燬所需要的開銷會相對較小。當然,CLR仍然在操作系統上運行,所以某個應用程序域必定運行在某個操作系統的進程內,在CLR的安排下,每個操作系統的進程也可以包含多個應用程序域。圖2.2表示了這種組織結構。

 

 答案

 

程序集(Assembly)是一個由類型定義、數據文件和資源文件組成的邏輯集合。每個程序集都包含一個程序集清單,該清單通常被附加在某個文件頭上,也可以設置單獨建立一個文件來包含該清單。

應用程序域是CLR中提供代碼運行範圍、錯誤隔離和安全設置隔離的邏輯單元,功能類似於操作系統的進程。一個或多個應用程序域在一個操作系統的進程中運行。應用程序域的創建和銷燬所需的開銷,相對於操作系統進程較小。但和操作系統進程一樣,應用程序域之間的數據共享相當困難。

 

現在我們在來看下,程序集的版本分爲哪些組成?

七,程序集的版本分爲哪些組成?

 

每一程序集都有一個版本號作爲其標識的一部分。 因此,如果兩個程序集具有不同的版本號,運行時就會將它們視作完全不同的程序集。 此版本號實際表示爲具有以下格式的四部分號碼:

<主版本>.<次版本>.<生成號>.<修訂號>

例如,版本 1.5.1254.0 中的 1 表示主版本,5 表示次版本,1254 表示生成號,而 0 則表示修訂號。

版本號與其他標識信息(包括程序集名稱和公鑰,以及與該應用程序所連接的其他程序集的關係和標識有關的信息)一起存儲在程序集清單中。

在生成程序集時,開發工具將把每一個被引用程序集的依賴項信息記錄在程序集清單中。 運行時將這些版本號與管理員、應用程序或發行者設置的配置信息結合使用,以加載被引用程序集的正確版本。

爲進行版本控制,運行時會區分常規程序集和具有強名稱的程序集。 只對具有強名稱的程序集執行版本檢查。

有關指定版本綁定策略的信息,請參見 配置文件。 有關運行時如何使用版本信息查找特定程序集的信息,請參見 運行時如何定位程序集

 

八,什麼是託管代碼?什麼是非託管代碼?

  託管代碼 (managed code) 
由公共語言運行庫環境(而不是直接由操作系統)執行的代碼。託管代碼應用程序可以獲得公共語言運行庫服務,例如自動垃圾回收、運行庫類型檢查和安全支持等。這些服務幫助提供獨立於平臺和語言的、統一的託管代碼應用程序行爲。
託 管代碼是可以使用20多種支持Microsoft .NET Framework的高級語言編寫的代碼,它們包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的語言共享統一的類庫集合,並能被編碼成爲中間語言(IL)。運行庫編譯器(runtime-aware ompiler)在託管執行環境下編譯中間語言(IL)使之成爲本地可執行的代碼,並使用數組邊界和索引檢查,異常處理,垃圾回收等手段確保類型的安全。

  在託管執行環境中使用託管代碼及其編譯,可以避免許多典型的導致安全黑洞和不穩定程序的編程錯誤。同樣,許多不可靠的設計也自動的被增強了安全 性,例如 類型安全檢查,內存管理和釋放無效對象。程序員可以花更多的精力關注程序的應用邏輯設計並可以減少代碼的編寫量。這就意味着更短的開發時間和更健壯的程 序。

 

非託管代碼 (unmanaged code)

  在公共語言運行庫環境的外部,由操作系統直接執行的代碼。非託管代碼必須提供自己的垃圾回收、類型檢查、安全支持等服務;它與託管代碼不同,後者從公共語言運行庫中獲得這些服務。

問題:什麼是託管?託管是什麼意思?

託管代碼就是基於.net元數據格式的代碼,運行於.net平臺之上,所有的與操作系統的交換有.net來完成,就像是把這些功能委託給.net,所以稱之爲託管代碼。非託管代碼則反之。

舉個例子l

Vc.net還可以使用mfc,atl來編寫程序,他們基於MFC或者ATL,而不是.NET,所有是非託管代碼,如果基於.net比如C#,VB.net則是託管代碼

非託管代碼是指.NET解釋不了的

簡單的說,託管代碼的話,.net可以自動釋放資料,非託管代碼需要手動釋放資料.

 

先整這麼多吧,下次接着整理這些。我有什麼錯誤的地方請告訴一下,讓我改正過來。謝了。

發佈了60 篇原創文章 · 獲贊 31 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章