【C# Personal Handbook】運行環境

一、CLR、CLI、CTS、CLS、BCL、FCL簡介

  • CLI(公共語言基礎)

CLI是微軟公司向ECMA提交的一份語言和數據格式規范,CLR是目前為止唯一一個公共語言基礎的實現版本。CLI包括了公共類型系統(CTS)、公共中間語言(CIL)、底部文件格式以及元數據格式等。

  • CLR(公共語言運行庫)

CLR是一個CLI的實現,包含了.NET運行引擎和符合CLI的類庫。我們開發的幾乎所有的.NET程序都基于CLR的類庫來實現,并且運行在CLR提供的運行引擎之上。

  • CTS(公共類型系統)

CTS定義了一個能夠在CLR上運行的語言規范。盡管有很多語言本身不符合CTS規范,但是通過加強編譯器,改變語言附加規范等手段,使得許多語言能夠編寫出能在CLR上運行的程序。一種語言編寫的程序編譯能夠在CLR上運行,并不代表這種語言本身完全符合CTS的規范。例如C++語言,仍然保持了其不符合CTS規范的部分,并且在編譯時把這部分不符合CTS的代碼編譯成原始代碼而非中間代碼。

  • CLS(公共語言規范)

CLS是CTS的一個子集,它定義了希望編寫在.NET平臺上運行的程序的語言所需符合的最小規范。正因為.NET允許由不同語言編寫的程序一起執行,所以才制定出CLS規范,用以避免不同語言特性產生的錯誤。在.NET Framework中,幾乎所有(但不是所有)的類都是與CLS兼容的。在MSDN文檔說明中,不兼容的類和方法都被特別標記為不兼容,例如System命名空間中的UInt32結構。UInt32表示32位無符號整數。并不是所有的語言(例如Visual Basic.NET或J#)都支持無符號的數據類型,這種數據類型是與CLS不兼容的。

  • BCL,基礎類庫(Base Class Library)

BCL是一個公共編程框架,稱為基類庫,所有語言的開發者都能利用它。是CLI(Common Language Infrastructure,公共語言基礎結構)的規范之一,主要包括:執行網絡操作,執行I/O操作,安全管理,文本操作,數據庫操作,XML操作,與事件日志交互,跟蹤和一些診斷操作,使用非托管代碼,創建與調用動態代碼等,粒度相對較小,為所有框架提供基礎支持。

  • FCL,框架類庫(Framework Class Library)

FCL提供了大粒度的編程框架,它是針對不同應用設計的框架 ,FCL大部分實現都引用了BCL,例如我們常說的開發框架:ASP.NET(Core)、Windows Forms、WPF等等,提供了針對不同層面的編程框架 。

二、CLR

通用語言執行平臺(Common Language Runtime,簡稱CLR)是微軟為他們的.NET的虛擬機所選用的名稱。它是微軟對通用語言架構(CLI)的實現版本,它定義了一個代碼執行的環境。CLR執行一種稱為通用中間語言的字節碼,這個是微軟的通用中間語言實現版本。CLR目前已穩定運行于各個平臺之中。

CLR 和類庫與應用和整個系統的關系

68652c71f1292f0cff1ebae22536c885.png

來源 :https://docs.microsoft.com/tr-tr/dotnet/framework/get-started/overview CLR 組件

ea3b647eb075615eedf24ed1266cb362.png

來源 :https://www.slideshare.net/Thenmurugeshwari/architecture-of-net-framework

在 CLR 中,垃圾回收器充當自動內存管理器。C# 以及 CLR 之上的其他語言的內存都是通過垃圾回收器回收的。

CLR 主要功能

  • 基類庫支持 Base Class Library Support

  • 內存管理 Memory Management

  • 線程管理 Thread Management

  • 垃圾回收 Garbage Collection

  • 安全性 Security

  • 類型檢查 Type Checker

  • 異常管理 Exception Manager

  • 調試管理 Debug Engine

  • 中間碼(MSIL)到機器代碼(Native)編譯

  • 類別裝載 Class Loader

開發人員使用高級編程語言編寫程序。接下來編譯器將代碼編譯成微軟的中繼語言(MSIL)。執行的時候CLR會將MSIL碼轉換為操作系統的原生碼(Native code)。CLR內置有即時編譯器。實際上,CLR代理了一部分傳統操作系統的管理功能,通常將在CLR的控制下運行的代碼稱為托管代碼,否則稱為非托管代碼。

執行流程

將源代碼(vb、cs)編譯成托管代模塊。托管代碼塊由中間語言和元數據組成。將托管代碼合并成程序集。加載公共語言運行庫。執行程序集的代碼。生成本地代碼。

優點

它通過在運行時提供程序之間提供豐富的交互來提高性能。通過消除在支持程序的任何操作系統上重新編譯程序的需要來增強可移植性。安全性也會提高,因為它會分析MSIL指令是安全的還是不安全的。此外,使用委托代替函數指針增強了類型的安全性。在垃圾回收器的幫助下支持自動內存管理。提供跨語言集成,因為 CLR 中的 CTS 提供了一個通用標準,該標準激活了不同的語言以擴展和共享彼此的庫。支持使用在其他 .NET 編程語言中開發的組件。提供語言、平臺和體系結構獨立性。它允許輕松創建可擴展的多線程應用程序,因為開發人員無需考慮內存管理和安全問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281781.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281781.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281781.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何完善自己的知識結構

★領域 (本來想用“學科”這個詞,后來覺得“學科”的范疇還是偏小,就改用“領域”)  按照傳統的習慣,通常會把知識歸類到不同的領域(比如:文學、數學、計算機、烹調、等等)。 ◇領…

MATLAB編程與應用系列-關于MATLAB編程入門教程的總體編寫安排

本系列教程來源于出版設計《基于MATLAB編程基礎與典型應用書籍》,如涉及版權問題,請聯系:156204968qq.com。 出版社:人民郵電出版社, 頁數:525。 本系列教程目前基于MATLABR2006a,可能對于更高級…

python語言特性-------python2.7教程學習【廖雪峰版】(一)

開始學習廖雪峰的py2.7教程: 2017年6月5日12:54:28 筆記: 廖雪峰python2.7教程1.用任何編程語言來開發程序,都是為了讓計算機干活。 2.Python是一種相當高級的語言。代碼少還不好?代碼少的代價是運行速度慢。3.用Python可以做什么…

java調c++代碼_Java中調用C++代碼的實現 | 學步園

JNI為 Java Native Interface 即Java本地接口,使用此種方式可以對C/C代碼進行調用,其在本質上是對C/C生成的動態庫進行調用而不是直接對C/C代碼進行調用Java代碼如下:public class TestJNI{//JNI在本質上是調用C/C的動態庫來實現的&#xff…

jeesite1.X 集成多數據源

2019獨角獸企業重金招聘Python工程師標準>>> 網上看了幾個例子,都是相同數據源的動態切換,如果不是同一種數據庫類型,分頁查詢就出問題。經過研究解決問題。 jeesite.properties配置多數數據源地址,這里以mysql5.7和sqlserver2008…

k8s HPA(HorizontalPodAutoscaler)-自動水平伸縮

Horizontal Pod Autoscaling in Kubernetes寫在前面我們平時部署web服務,當服務壓力大撐不住的時候,我們會加機器(加錢);一般沒有上容器編排是手動加的,臨時加的機器,臨時部署的服務還要改Nginx的配置,最后…

jQuery 基金會和 Dojo 基金會合并:Open Web

統一基金會,服務開發人員,推動開放 Web 技術發展jQuery 基金會和 Dojo 基金會今天宣布計劃聯合,旨在建立最大,最多樣化和最全面的基金會,通過服務開發者,他們的項目,他們的社區來構建開放的 Web…

spark java 邏輯回歸_邏輯回歸分類技術分享,使用Java和Spark區分垃圾郵件

原標題:邏輯回歸分類技術分享,使用Java和Spark區分垃圾郵件由于最近的工作原因,小鳥很久沒給大家分享技術了。今天小鳥就給大家介紹一種比較火的機器學習算法,邏輯回歸分類算法。回歸是一種監督式學習的方式,與分類類似…

jQuery.extend()方法

定義和用法jQuery.extend()函數用于將一個或多個對象的內容合并到目標對象。 注意: 1. 如果只為$.extend()指定了一個參數,則意味著參數target被省略。此時,target就是jQuery對象本身。通過這種方式,我們可以為全局對象jQuery添加…

1066. 圖像過濾(15)

原題: https://www.patest.cn/contests/pat-b-practise/1066 思路: 開胃小菜 實現: #include <stdio.h>int main (void) {int m;int n;int a;int b;int c;char ch;int tmp;int i;int j;scanf("%d %d %d %d %d", &m, &n, &a, &b, &c);// 題…

Wget用法、參數解釋的比較好的一個文章

一個語句就可以下載cvpr2016的全部論文&#xff1a; wget -c -N --no-clobber --convert-links --random-wait -r -p -E -e robotsoff -U mozilla http://www.cv-foundation.org/openaccess/CVPR2016.py 其中&#xff0c;-c表示斷點續傳&#xff1b;-N表示已經下載的內容不再重…

.NET VS智能提示漢化 (.Net6)

先上現成的.net6漢化文件&#xff0c;可以手動下載后參照 [如何為 .NET 安裝本地化的 IntelliSense 文件 ](https://learn.microsoft.com/zh-cn/dotnet/core/install/localized-intellisense)進行安裝。或者使用后文的工具進行自動安裝。無對照英文在前中文在前漢化內容來自 官…

go 返回mysql數組_Go基礎之--操作Mysql(一)

關于標準庫database/sqldatabase/sql是golang的標準庫之一&#xff0c;它提供了一系列接口方法&#xff0c;用于訪問關系數據庫。它并不會提供數據庫特有的方法&#xff0c;那些特有的方法交給數據庫驅動去實現。database/sql庫提供了一些type。這些類型對掌握它的用法非常重要…

Vue CLI 3開發中屏蔽煩人的EsLint錯誤

問題 Vue開發中&#xff0c;特別是當你閱讀分析別人的其中早期版本的Vue代碼時往往會遭遇到滿屏幕的煩人的EsLint錯誤。有關EsLint這個工具的作用不再贅述。查閱網上參考文檔&#xff0c;大多是針對早起版本Vue CLI工具項目的&#xff0c;在我最新使用的Vue CLI 3生成的工程中根…

pyinstaller---將py文件打包成exe

pyinstaller可將Python腳本打包成可執行程序&#xff0c;使在沒有Python環境的機器上運行。 1.pyinstaller在windows下的安裝 直接在命令行用pip安裝 pyinstaller&#xff0c; 在windows下&#xff0c;pyinstaller需要PyWin32的支持。當用pip安裝pyinstaller時未找到PyWin32&am…

老人尋求到一名程序員,用2W行代碼給自己打造了一幅肖像畫

今天翻墻看了下國外的論壇&#xff0c;看到了一位版主給一位老人描繪肖像畫的文章&#xff0c;不得不說這位大佬是真的厲害&#xff0c;近20000行代碼&#xff0c;而且還畫的很像&#xff0c;像小編我這種手殘黨&#xff0c;用筆也不能畫出來&#xff0c;不得不服&#xff0c;今…

一題多解,ASP.NET Core應用啟動初始化的N種方案[下篇]

[接上篇]“天下大勢&#xff0c;分久必合&#xff0c;合久必分”&#xff0c;ASP.NET應用通過GenericWebHostService這個承載服務被整合到基于IHostBuilder/IHost的服務承載系統中之后&#xff0c;也許微軟還是意識到Web應用和后臺服務的承載方式還是應該加以區分&#xff0c;于…

java jpa 模糊查詢_JPA 以SQL實現分頁不模糊查詢(參數可能為空)

repository代碼:package com.fancy.miniflow.repository;import java.util.List;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;import org.springframework.data.jpa.repository.Q…

GitHub服務中斷24小時11分鐘事故分析報告\n

上周&#xff0c;GitHub經歷了一次事故&#xff0c;導致服務降級24小時11分鐘。雖然平臺的某些部分不受事故影響&#xff0c;但仍然有多個內部系統受到了影響&#xff0c;向用戶顯示了過時且不一致的內容。所幸沒有用戶數據丟失&#xff0c;但針對幾秒鐘數據庫寫入的手動調整工…

8 旋轉數組的最小數字

輸入一個遞增排序數組的一個旋轉&#xff0c;輸出旋轉數組的最小元素例如1,2,3,4,5的一個旋轉可以為3,4,5,1,2把一個數組的最開始若干個元素搬到數組的末尾&#xff0c;稱之為數組的旋轉 輸出旋轉數組的最小元素 C: 1 class Solution {2 public:3 int minInOrder(vector<…