net core的介紹

1. .NET Core到底是什麼

.NET Core是一種小型的、高效的,可以通過文件複製直接部署的跨平臺框架。


.NET Core 備受關注的主要原因

1) .NET Core自身開源,而且鼓勵更多的.NET項目開源

2).NET Core支持跨平臺特性,可以再Windows、Linux、macOS等系統上運行

3).NET Core的性能不近比.NET Framework更加優秀,也比其他同級開源框架更高效


軟件許可協議

遵循MIT開源許可協議,有極大的開放性和移植性,使用者可以無限制的修改、移植、打包、發佈等。

對於傳統的.NET開發人員,開源可能不是什麼新鮮事物,但也有大部分人並不熟悉。

在2000年代初期,微軟高管們是如何評價開源的,想知道麼?

1)開源是對知識產權的嚴重破壞,我想象不到還有什麼對軟件和知識產權行業會有更大的傷害 --> 微軟windows主管

2)歷史證明,開源可能會佔有一席之地,對於大眾化的市場開源是肯定不會成功的 --> 微軟某高級副總裁

但是,現在的微軟呢?

不僅擁抱開源,而且很支持開源,甚至收購了github,這種變化與.NET基金會有很大的關係。

.NET基金會是一個獨立的組織,包含很多知名企業(亞馬遜、谷歌、三星等)、MVP等,由微軟牽頭組建,基金會的重要資產主要是.NET Core的源碼以及.NET Core周邊的一些開源項目。

.NET基金會的開源項目基本上都遵循MIT許可協議。


目前主流的開源協議

開源許可協議的目的是為了保護和尊重作者的只是產權,開源也並不代表源碼可以隨意使用。

GPL

對開源軟件的使用限制最嚴格的,而且還具有極高的傳染性。

核心思想:讓全世界的軟件都開源!只要你的軟件中用到了任何第三方GPL協議的資源(甚至是它的衍生),就必須同樣使用GPL開源協議。

對商業軟件構成了很大的威脅,所以發展的並不好。

後期出現了變體LGPL協議,規定了如果僅僅是引用LGPL許可協議下的軟件,那麼無需開源,但如果對LGPL協議下的軟件進行了修改並使用的,就必須要遵循LGPL協議。

Apache

Apache基金會所創建,廣泛應用於Apache旗下軟件產品。

鼓勵開源軟件的使用者應充分尊重軟件的原作者,不再強制要求。如果使用了Apache協議下的軟件,只需要在你的軟件內註明使用方以及原作者信息即可。

如果你對Apache協議下的軟件進行了修改並使用,在發佈時需要添加修改說明,也不強制要求你的軟件開源。

BSD&MIT

這兩個協議是相對最寬鬆的協議,鼓勵開發者自由的使用、自由的修改和發佈,只需要在你的軟件中保留原作者信息即可。

其中有一個區別,BSD規定,如果你對BSD協議下的軟件修改並使用,那麼你不能借用該項目原作者的名義進行宣傳。

2. .NET Core的重要組件

.NET Core並不是一個單獨的開源項目,而是由多個開源項目所構成的一個項目集合。

CoreCLR

.NET Core的公共語言運行時,是由C++編寫實現,可以理解為JAVA中的JRE,。

從.NET Framework的CLR發展而來,結構上與CLR也是一致的。

CLR的第一職責,就是執行.NET程序,.NET程序和C/C++這些語言編譯出來的程序有很大的區別。

C/C++編譯出來的程序稱之為“原生程序”,包含了特定硬件架構的機器碼,還會調用特定的系統API,只能在特定的平臺運行。

.NET程序編譯後只是中間代碼,不依賴平臺,可以在不同的平臺運行。

CLR實現了.NET程序在不同平臺的運行,CLR解析中間代碼,找到中間代碼模塊、類型成員等翻譯成目標平臺的機器碼並生成元數據(類型信息、GC信息、異常信息等)。

編譯過的IL通過Class Loader來加載到內存中。

再由JIT翻譯為機器碼。它會根據代碼的執行路徑、當前操作系統、硬件情況翻譯為適合當前計算機執行的高效的彙編代碼。

JIT是IL(中間語言MSIL)的編譯器,不是C#的編譯器!

CLR為了保證類型安全,是指.NET程序保證對象類型一定正確。為了實現類型安全,CLR為每個引用類型的對象中保存了類型信息,用來判斷轉換是否合法。比如string轉換為object類型,被傳遞到其他地方後,通過GetType方法判斷這個對象的真實類型,如果轉換了錯誤的類型,將會拋出異常。

非類型安全的,比如C語言中,int* void*指針類型,被傳遞到其他地方後,他是無法判斷這個指針的真實類型是int還是long,有可能會錯誤的把void轉換成long,而且也不會發生異常,在程序執行過程中就會產生不可預估的錯誤。

CLR還提供了異常處理機制,傳統的是使用函數返回值通知和處理錯誤的,這種方式實現簡單,不需要運行時的支持,但一定程度上增加了開發者的複雜度。

線程機制,CLR對原生的線程以及同步對象進行了封裝,對於託管代碼開發者可以使用相同的方式,在不同的平臺實現多線程處理。

提供了自動內存管理,也就是垃圾回收機制(GC),GC會監控內存變化,在適當的時候啟動並對內存中無效的對象進行銷燬,進行內存的回收和管理。GC只能自動銷燬CLR託管的對象,對於非託管對象、文件句柄還是需要手動釋放,但是CLR對於非託管資源也都使用了託管代碼的封裝,由託管釋放而不是由GC操作。

CoreCLR和CoreFx 為了方便開發者,合併到了同一個倉庫中。


CoreFX

是.NET Core的基礎類庫,這個類庫完全由C#語言編寫,是.NET Core提供給開發者的庫函數項目。

在.NET 5中,項目的名字變了,Libraries。

其中,大多數人代碼都是從.NET Framework的BLC移植過來的,經過了大量的優化修改和擴平臺支持。。

例如,System.DateTime類型等等。

代碼中,大量的使用了partial關鍵字,因為多平臺共用的代碼都被組織在對應的源代碼文件中,具體某個操作系統相關的代碼放在另一個與平臺相關的源代碼文件中。

不同的

帶來的意義是什麼

1)減少.NET開發人員的工作量

2)可以讓不同模塊之間的數據交互更加容易

CLI

單純的提及CLI,有兩種說法:

1)Common Language Infrastructure 通用中間語言

公開的技術標準,定義了一個不依賴於具體操作系統與硬件架構的中間語言(IL),以及執行這個語言所需的運行環境。

跨平臺,比如C語言的標準int類型的長度最少為2個字節,實際多少並不固定(32位4字節,64位8字節),但是再CLI中規定,int類型永遠是4字節!

跨語言,標準裡面的部分定義:類型(int/long/string)、指令的種類、方法的結構、模塊的結構、二進制文件格式等。我們通常不會直接編寫IL,而是先編寫高級語言,再使用工具(比如Roslyn)轉換成中間語言。各種高級語言(C#/F#/VB...)都可以轉成成統一中IL語言。

這個定義,與.NET Core 並沒有多大關係,對於整個微軟生態來說,通常CLI才指的是它!!!

2)Command Line Interface 命令行接口

以前的.NET Framework只支持windows,win32 GUI工具、Linux文件系統、包括可執行文件格式也不一樣。

但.NET Core目標就是跨平臺,實現一款多平臺統一、高效,便於使用的.NET Core工具,這是相當複雜的工程,所以CLI是一個獨立的項目。

比如,.NET Core編譯生成的二進制,到底是針對不同的操作系統生成不同的文件格式,還是統一的文件格式?--> .NET Core選擇的是生成統一的文件格式。例如,無論目標平臺是win還是linux,.NET Core編譯出來的二進制文件都是dll,且都是PE格式。

所以,.NET Core必須提供一個容器,來保證所有操作平臺都可以加載PE格式的dll文件。

CLI工具,在.NET Core 2.0是在穩定下來,此前整個CLI項目由多種不同的語言開發的多個工具組成,之後只有一個工具dotnet,用於項目管理、構建、代碼運行、包管理等等。

對於.NET Core,CLI通常代指的就是這個!!!


Roslyn

.NET上的高級語言編譯器,可以編譯C#、VB.NET、F#等。

但確切的來說,Rolsyn被微軟定義為下一代編譯平臺,而不僅僅是編譯器。除了代碼編譯外,還提供了代碼分析服務,豐富的API等。

相對於之前的C#編譯器csc,Rolsyn省的IL更加高效,編譯時間也大幅度縮短。

從VS2017開始的代碼編寫過程中語法檢查、成員引用統計等等功能便是由Rolsyn提供的動態編譯所實現。


3. .NET Standard

.NET標準,由.NET基金會提出的.NET開發框架的規範文本。 --> 詳見:.NET Standard

並不是程序,而是一組純文本的類型和函數的聲明信息,用來規範相同功能的類型和函數在不同的.NET開發框架中具有相同的形態。

基於.NET Standard規範的應用程序,就可以無縫地在各種開發框架之間進行遷移。

有支持.NET Standard的開發框架都有義務按照.NET Standard規範實現響應的函數聲明。

框架類庫中劃分了一部分最基礎的功能,被不同的CLR分別實現,.NET標準版本越高,要求支持的功能就越多。

例如.NET Framework 4.6.1和.NET Core 2.0都支持.NET標準2.0,那麼實現了.NET標準2.0的類庫可以在其中任何一個框架中使用,.NET Framework 4.6不支持.NET標準2.0,只支持.NET標準1.3,那麼就不能兼容.NET2.0的類庫。


簡單點可以理解為,C#是由Rolsyn編譯為IL中間語言的。


4. .NET Core的源碼概覽

.NET Platform:https://github.com/dotnet

coreCLR:https://github.com/dotnet/coreclr --> .NET Core 3.1及以前版本

coreFx:https://github.com/dotnet/corefx --> .NET Core 3.1及以前版本

runtime以及coreCLR、coreFX的後續版本合併倉庫:https://github.com/dotnet/runtime

extensions:https://github.com/dotnet/extensions

--> 擴展庫:依賴注入、日誌、配置等等的擴展

aspnetcore:https://github.com/dotnet/aspnetcore


ASP.NET Core 和 .NET Core是兩個相對獨立的技術棧。

ASP.NET Core在3.0版本之前可以運行在.NET Framework、.NET Core、Mono上,也就是它並不絕對的依賴哪個.NET框架,在開源方面也是走在了.NET Core前面,因為在.NET基金會還沒有決定把.NET Core開源的時候,ASP.NET MVC就已經開源了,並且也可以運行在Mono上。


net core的介紹


分享到:


相關文章: