.Net Framework .Net .NET Standard的概念及區(qū)別
.Net Framework .Net .NET Standard的區(qū)別
一、.NET Framework
在未來(lái).NET Framework或許成為過(guò)去時(shí),目前還是有很多地方在使用的。這一套體系對(duì)于做C#的老coder應(yīng)該是再熟悉不過(guò)了,新入坑的也就用不著費(fèi)力去學(xué)習(xí)。
.NET Framework 是一種技術(shù),支持生成和運(yùn)行 Windows 應(yīng)用及 Web 服務(wù)。
.NET Framework 包括公共語(yǔ)言運(yùn)行時(shí) (CLR) 和 .NET Framework 類庫(kù)。 公共語(yǔ)言運(yùn)行時(shí)是 .NET Framework 的基礎(chǔ)。
可將運(yùn)行時(shí)看作一個(gè)在執(zhí)行時(shí)管理代碼的代理,它提供內(nèi)存管理、線程管理和遠(yuǎn)程處理等核心服務(wù),并且還強(qiáng)制實(shí)施嚴(yán)格的類型安全以及可提高安全性和可靠性的其他形式的代碼準(zhǔn)確性。
二、.Net
.net 就是由.net core 演進(jìn)而來(lái),在底層有很多性能和架構(gòu)優(yōu)化改造,上層應(yīng)用api和用法和.NET Framework大多數(shù)相同。
.NET 是一種用于構(gòu)建多種應(yīng)用的免費(fèi)開(kāi)源開(kāi)發(fā)平臺(tái),使用 .NET 時(shí),無(wú)論你正在構(gòu)建哪種類型的應(yīng)用(web,api、桌面應(yīng)用...),代碼和項(xiàng)目文件看起來(lái)都一樣。 可以訪問(wèn)每個(gè)應(yīng)用的相同運(yùn)行時(shí)、API 和語(yǔ)言功能。
NET 是開(kāi)放源代碼,使用 MIT 和 Apache 2 許可證。 .NET 是 .NET Foundation 的項(xiàng)目。
Microsoft 支持在 Windows、macOS 和 Linux 上使用 .NET。 它會(huì)定期更新以保證安全和質(zhì)量。
.NET 支持三種編程語(yǔ)言:C#、F#、Visual Basic。
三、.NET Standard
.NET Standard 是針對(duì)多個(gè) .NET 實(shí)現(xiàn)推出的一套正式的 .NET API 規(guī)范。 推出 .NET Standard 的背后動(dòng)機(jī)是要提高 .NET 生態(tài)系統(tǒng)中的一致性。 但是,.NET 5 采用不同的方法來(lái)建立一致性,這種新方法在很多情況下都不需要 .NET Standard。
所以.net standard 是 .Net Api 規(guī)范,不是實(shí)現(xiàn)。其作用是為了提高.net 一致性,只要框架支持就能使用.net standard規(guī)范去實(shí)現(xiàn)。
但是!.NET 5 采用不同的方法來(lái)建立一致性,也就是說(shuō).net 5 開(kāi)始過(guò)度到.net 框架如果你只是用于.net 框架的話,但是支持.net standard?。钟悬c(diǎn)繞暈?。?br />
NET Standard并未棄用 對(duì)于可由多個(gè) .NET 實(shí)現(xiàn)使用的庫(kù),仍需要 .NET Standard。比如在 .NET Framework 和 .NET 上都要使用的內(nèi)庫(kù)就需要按照.net standard規(guī)范,這樣兩個(gè)框架都能用,但是要看.net standard版本支持,下圖對(duì)照。
在創(chuàng)建類庫(kù)的時(shí)候就可以選擇不同的支持框架。
各種 .NET 實(shí)現(xiàn)以特定版本的 .NET Standard 為目標(biāo)。 每個(gè) .NET 實(shí)現(xiàn)版本都會(huì)公布它所支持的最高 .NET Standard 版本,這種聲明意味著它也支持以前的版本。
三、實(shí)際操作說(shuō)明
1、創(chuàng)建一個(gè).NET Standard 類庫(kù),添加一個(gè)簡(jiǎn)單的測(cè)試方法。
public class NetStandardTest { public static void PrintLocation() { //打印FileStream 路徑 Console.WriteLine(typeof(FileStream).Assembly.Location); //打印NetStandardTest 路徑 Console.WriteLine(typeof(NetStandardTest).Assembly.Location); } }
在這個(gè)測(cè)試方法里面我們加了兩行打印代碼。主要是打印FileStream路徑,同時(shí)我們創(chuàng)建的.NET Standard類庫(kù)為2.0,因?yàn)槲覀兘酉聛?lái)要?jiǎng)?chuàng)建.net framework 的控制臺(tái),它不支持2.1。
2、創(chuàng)建.net 5,.net framework 4.6.1 控制臺(tái)程序
創(chuàng)建好兩個(gè)控制臺(tái)項(xiàng)目,在主方法里面調(diào)用內(nèi)庫(kù)方法。
static void Main(string[] args) { NetStandardTest.PrintLocation(); Console.ReadKey(); }
解決方案結(jié)構(gòu)如下
3、運(yùn)行分析
從結(jié)果看我們看到同一個(gè).NET Standard類庫(kù),引用在不同的框架上,調(diào)用同一個(gè)FileStream的地址是不一樣的。
然后我們?cè)?NET Standard類庫(kù)里面F12定位到FileStream看到程序集如下
三個(gè)地址我們并列對(duì)比下:
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.8\System.Private.CoreLib.dll C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll C:\Users\Administrator\.nuget\packages\netstandard.library\2.0.3\build\netstandard2.0\ref\netstandard.dll
我們將三個(gè)dll 用dnspy反編譯下,找到FileStream,隨便找一個(gè)BeginRead方法看下代碼。
- .net standard
- .net framework
- .net 5
從上面三個(gè)結(jié)果對(duì)比可以看到.net standard里面是沒(méi)有實(shí)現(xiàn)的,只是定義了方法,也就是說(shuō)定義了一種標(biāo)準(zhǔn),說(shuō)明我的類里面有哪些東西。
調(diào)用的時(shí)候再根據(jù)我們當(dāng)前使用的框架去找到對(duì)應(yīng)框架的實(shí)現(xiàn)。這就是為什么.net standard能對(duì)多框架引用,也是為什么2.1不能被.net framework使用,因?yàn)樗鼪](méi)有去實(shí)現(xiàn)2.1新增的api。
至于為什么我們調(diào)用.net standard的dll會(huì)被轉(zhuǎn)到對(duì)應(yīng)框架的dll呢,這是利用Type Forwarding方式實(shí)現(xiàn)跨程序集類型轉(zhuǎn)移的技術(shù)成為“墊片(Shim)”,這是實(shí)現(xiàn)程序集跨平臺(tái)復(fù)用的重要手段。
關(guān)于這個(gè)墊片技術(shù)可以看下這篇文章https://www.cnblogs.com/artech/p/how-to-cross-platform-03.html。
以上就是.Net Framework .Net .NET Standard的概念及區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于.Net Framework .Net .NET Standard的區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 基于Jenkins搭建.NET FrameWork持續(xù)集成環(huán)境
- 簡(jiǎn)單了解.NET Framework
- .NET Core/Framework如何創(chuàng)建委托大幅度提高反射調(diào)用的性能詳解
- Windows Server 2012 R2或2016無(wú)法安裝.NET Framework 3.5.1的解決方法
- .NET framework 4.0 安裝失敗回滾問(wèn)題
- 安裝.NET Framework進(jìn)度條卡住不動(dòng)的解決方案(推薦)
- 基于.net standard 的動(dòng)態(tài)編譯實(shí)現(xiàn)代碼
- Visual Studio 2017創(chuàng)建.net standard類庫(kù)編譯出錯(cuò)原因及解決方法
相關(guān)文章
ASP.NET學(xué)習(xí)中常見(jiàn)錯(cuò)誤總結(jié)歸納
這篇文章主要介紹了asp.net學(xué)習(xí)過(guò)程中碰到的常見(jiàn)錯(cuò)誤的解決方法,通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-09-09ASP.NET?Core?6最小API中使用日志和DI示例詳解
這篇文章主要為大家介紹了ASP.NET?Core?6最小API中使用日志和DI示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08使用.NET6實(shí)現(xiàn)動(dòng)態(tài)API
本文詳細(xì)講解了使用.NET6實(shí)現(xiàn)動(dòng)態(tài)API,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12.Net Framework .Net .NET Standard的概念及區(qū)別
這篇文章主要介紹了.Net Framework .Net .NET Standard的概念及區(qū)別,需要的朋友可以參考下2021-08-08