1. 程式人生 > >C#之C#、.NET Framework、CLR的關係

C#之C#、.NET Framework、CLR的關係

很多人沒有將C#、.NET Framework(.NET框架)、CLR(Common Language Runtime,公共語言執行庫)這三者之間的關係區分清楚,認為其版本號是一一對應的。其實不然,.NET框架是一個獨立釋出的軟體包,其包含了CLR、類庫以及相關的語言編輯器等工具。C#程式碼經過編譯之後在CLR環境中執行。由於.NET框架3.0/3.5其實是.NET2.0的擴充套件(只是增加了一些新的程式集),所以.NET3.0/3.5的CLR版本還是2.0.而且.NET3.0其實只擴充套件了WF、WPF、WCF、WCS等元件,並沒有提供新的C#編譯器,直到.NET3.5中才打包了C#3.0的編譯器。.NET4.0在3.0上針對WF、WCF進行了一些新功能增加,所以.NET框架、CLR和C#的版本之間的對應關係如下表所示:

也就是說,對於那些不涉及新程式集的C#3.0新特性(比如自動屬性、匿名屬性等)在.NET2.0的環境中也可以執行,CLR對這些特性是一無所知的。

1、C#是一種面向物件程式語言,是為開發.NET框架上的程式而設計的。

(1)C#是由C和C++衍生出來的,所以其可呼叫由 C/C++ 編寫的本機原生函式,同時不損失C/C++原有的強大的功能。

(2)C#所開發的程式原始碼並不是編譯成能夠直接在作業系統上執行的二進位制原生代碼。它是被編譯成為中間程式碼,然後通過.NET框架的虛擬機器(即CLR)來執行。所以如果計算機上沒有安裝.Net框架,那麼程式將不能夠被執行。在執行的過程中,.Net框架會將中間程式碼翻譯成為二進位制機器碼,從而使它得到正確的執行。最終翻譯的二進位制程式碼將被儲存在一個緩衝區中。所以一旦程式使用了相同的程式碼,那麼將會呼叫緩衝區中的版本。這樣如果一個.Net程式第二次被執行,那麼這種翻譯不需要進行第二次,速度會明顯加快。

2、.NET框架有三部分組成(如下圖):

1)CLR的介紹參考3

2)程式設計工具:涵蓋了編碼和除錯需要的一切:包含:VisualStudio整合開發環境、.NET相容的編譯器(例如:C#、VB、JScript和託管的C++)、偵錯程式、伺服器端改進(比如ASP.NET)

3)BCL(Base Class Library,基類庫):是.NET框架使用的一個大的類庫,而且也可以在你的程式中使用。包括以下一些類。

    1>通用基礎類:這些類提供了一組極為強大的工具,可以應用帶廣泛的程式設計任務中,比如字串操作、安全和加密。

    2>集合類:這些類實現了列表、字典、散列表以及位陣列。

    3>執行緒和同步類:這些類用於建立多執行緒程式。

    4>XML類,這些類用於建立、讀取以及操作XML文件。

3、CLR(公共語言執行庫)在執行期管理程式的執行:主要包含:記憶體管理、程式碼安全驗證、程式碼執行、垃圾收集。如下圖

(1)自動垃圾收集:CLR有一項服務稱為GC(Garbage Collector,垃圾收集),它能為你自動管理記憶體。

       1)GC自動從記憶體中刪除程式不再訪問的物件

       2)GC是程式設計師不再操心許多以前必須執行的任務,比如釋放記憶體和檢查記憶體洩漏。這可不是小特性,因為檢查記憶體洩漏可能非常困難而且耗時。

4、程式碼的編譯過程:

  (1)編譯成CIL:.NET語言的編譯器接受原始碼檔案,並生成名為程式集的輸出檔案。程式集可以是可執行檔案或DLL(如下圖所示)

       1>程式集裡的程式碼並不是本機程式碼,而是一種名稱為CIL(Common Intermediate Language,公共中間語言)的中間程式碼。

       2>程式集包含的資訊中,包含下列專案:程式的CIL、程式中使用的型別的元資料、對其他程式集引用的元資料

   (2)編譯成本機程式碼並執行:程式的CIL直到它被呼叫執行時才會被編譯成本機程式碼。在執行時,CLR執行下面的步驟(如下圖)

        1>檢查程式集的安全特性

        2>在記憶體中分配空間

        3>把程式集中的可執行程式碼傳送給實時(Just-in-Time)編譯器,把其中的一部分編譯成本機程式碼。  

        程式集中的可執行程式碼在需要的時候由實時編譯器編譯,然後它就被快取以備在後來的程式中執行,使用這個方法意味著不被呼叫的程式碼不會被編譯成本機程式碼,而且被呼叫到的程式碼只被編譯一次。

        一旦CIL被編譯成本機程式碼,CLR就在它執行時管理它,執行像釋放無主記憶體、檢查陣列邊界、檢查引數型別和管理異常之類的任務。這裡產生了兩個重要的術語:

       託管程式碼:為.NET框架編寫的程式碼稱為託管程式碼,需要CLR。

       非託管程式碼:不在CLR控制之下執行的程式碼,比如Win32C/C++ DLL,成為非託管程式碼。

  (3)編譯和執行綜述:無論原始原始檔的語言是什麼,懂遵循同樣的編譯和執行過程。

 

相關推薦

C#C#.NET FrameworkCLR關係

很多人沒有將C#、.NET Framework(.NET框架)、CLR(Common Language Runtime,公共語言執

扒一扒.net.net frameworkmono和Unity

加載 blank unit 包括 基礎 開發者 data- features lan zhaichao 標簽: .net.net frameworkc#monounity 2017-04-23 14:39 425人閱讀 評論(0) 收藏 舉報 版權聲明:本文為博主

.NET FrameworkC#CLR和Visual Studo之間的版本關系

ons mage info pro TP .org arp 參考 AMM .NET Framework、C#、CLR和Visual Studo之間的版本關系 參考 .NET Framework、C#、CLR和Visual Studo之間的版本關系.NET Framewor

.NET.NET框架ASP.NETC#的關係

    大四沒事出去面試,才發現自己基礎有點脆弱,所以計劃邊複習邊記錄,但無奈發現幾個概念老混淆,網上看過多次也是老忘,所以索性自己寫一下,以後看起來也很方便。如果有什麼錯誤,各位前輩請多指教。下面這個圖是我自己總結的,只總結了自己需要的,以後再有其他的再修改來吧。   &

C#基礎篇③(邏輯關係運算符if....else語句ReadKey()不顯示輸入內容的退出)

       今天我們來分享一下VS視訊中第三講內容,這篇文章繼續擴充C#中的運算子:邏輯運算子以及關係運算符,並對三大結構中的分支結構進行初步梳理。 一、導圖類 C#符號在原有導圖基礎上的擴充與整合。 二、程式碼類  ①、邏輯

C#基礎篇②(變數轉義符運算子型別轉換++先加後加)

      今天我們來分享一下VS視訊中第二講的內容,這篇文章主要分享的是C#語言的語法部分:變數的語法規則,C#中的轉義符、運算子、預算表達式,C#中的型別轉換方式。 一、問題類(此部分純屬個人理解,如有不足還望指正) ①、什麼是轉義字元? 一些字母前加“

C/C++開發】C++enum列舉量宣告定義使用與列舉類詳解與列舉類前置型別宣告

前面講到可以通過強制轉換將其他型別值賦給列舉變數:Weekday = enumType(2);這是合法的;但是Weekday = enumType(20);是非法的。這裡涉及列舉取值範圍的概念:列舉的上限是 大於最大列舉量的 最小的2的冪,減去1; 列舉的下限有兩種情況:一、列舉量的最小值不小於0,則列

C++訪問控制(publicprivateprotected以及friend)

public  所有均可訪問private 類自己的成員函式訪問,不能被類物件訪問protected 類自己以及子類訪問,不能被類物件訪問friend 友元,別人是你的朋友,他可以訪問我的東西。(但不是我可以訪問他的東西)友元關係不能被繼承。友元關係是單向的,不具有交換性。若

C++enum列舉量宣告定義使用與列舉類詳解

前面講到可以通過強制轉換將其他型別值賦給列舉變數:Weekday = enumType(2);這是合法的;但是Weekday = enumType(20);是非法的。這裡涉及列舉取值範圍的概念:列舉的上限是 大於最大列舉量的 最小的2的冪,減去1; 列舉的下限有兩種情況:一、列舉量的最小值不小於0,則列

.NET Framework.NET CoreMonoXamarin之間關係

本是同根生 截止2017年7月,這些專案均為微軟.NET Foundataion旗下開源專案,微軟朝著商業和開源兩種途徑,將.NET平臺開源、跨平臺化,以適應雲端計算、移動網際網路時代的要求。2000年左右,隨著Java在PC網際網路時代的流行,微軟釋出了全新的.NET平臺,但是一直遲遲沒有開放

.NET Core與.NET FrameworkMono之間的關係

隨著微軟的.NET開源的推進,現在在.NET的實現上有了三個.NET Framework,Mono和.NET Core。經常被問起Mono的穩定性怎麼樣,後續Mono的前景如何,要回答這個問題就需要搞清楚這三個.NET 實現之間的關係和將來如何演進。 到目前為止(2015.2.17),微軟在Windows平

.NET Core.NET Standard ASP.NET Core 和 .NET Framework 有什麽不同?

字符串 包含 6.2 和集 present cor 資料 xamarin stand 經查閱.Net Core相關資料: https://www.infoq.cn/article/2017%2F10%2Fdotnet-core-standard-difference h

.NET Framework.NET Core 和 .NET 5+ 的產品生命週期

# .NET Framework、.NET Core 和 .NET 5+ 的產品生命週期 本文整理記錄了 .NET Framework、.NET Core 和 .NET 各個版本的產品支援週期和作業系統相容性。 早於 .NET Framework 2.0 和 .NET Core 2.1 的 .NET 版本

C++C++ primer plus 第五單超程式設計題第七題

題如下: 設計一個名為car的結構,儲存生產商(string字串或char陣列),生產年份(int)。要求:向用戶詢問有多少輛汽車i,new一下i個car結構組成的動態陣列。接著程式提示使用者輸入每輛車的生產商和年份資訊。執行結果如下: How many cars do

測試 ClownFishCYQEntity FrameworkMoonMySoftNHibernatePDFXCode資料訪問元件效能

下期預告:由於很多園友反饋,有的元件不應該缺席、測試複雜度不夠、測試還缺乏一定的公平。因此考慮在下一個版本中,確保在更加公平的前提下進行更高複雜度的測試 。同時將分為2組測試,純SQL元件及純ORM元件, 如果純SQL元件不足,就只進行純ORM元件的測試。待加入測試元件有Dapper、PetaPoco/NPo

你所不知道的C++ C++虛類模型

我們知道,一個C++類如果帶有virtual關鍵字的函式,那麼,它就是一個虛類。虛類都有虛擬函式表。這個虛擬函式表真的存在嗎?能摸得著、看得見嗎? 的確是可以的。下面我們就展示一下如何看到C++類的虛擬函式表。請注意,我使用的系統是Ubutu 10.04, g++ 4.6.

.Net 初步學習筆記之一——.Net 平臺與.Net FrameWork框架的關係

.Net 包含兩部分 .Net平臺 和.Net FrameWork 框架 1、.Net FrameWork框架包含於.Net平臺. .Net FrameWork提供環境和支撐保證.Net平臺執行。 2、.Net FrameWork框架是.Net平臺不可缺少的一部分,它

C#out修飾符ref修飾符params修飾符的簡單介紹

c# 一個 邏輯 本地 style 逗號 註意 可變 修飾 一、out修飾符   1、調用一個帶有輸出參數的方法也需要使用out 修飾符,但是作為輸出變量傳遞的本地變量在將他們作為輸出變量傳遞前不需要賦值(因為調用後會改變或丟失),編譯器允 許你傳遞未分

HTTP模擬工具【C#/Winform源碼】Json綁定TreeView控件使用了MetroModernUIRestSharpDapper.NetNewtonsoft.JsonSmartThreadPool這幾個主要開源框架

type form num -m 請求 resource dap bool dev HTTP模擬工具 開發語言:C#/Winform開發工具:Visual Studio 2017數據庫: SQLite使用框架:界面-MetroModernUI

網易雲信IM C#.Net請求操作網易雲通信ID

創建用戶 自動 技術含量 時間戳 action cas api sps 設定 沒啥技術含量就不寫其他的了 直接上代碼 using System; using System.Collections.Generic; using System.Configuration;