.NET程序是基於.NET Framework、.NET Core、Mono、【.NET實現】開發和運行的 ,定義以上【.NET實現】的標准規范稱為.NET Standard

.NET Standard
.NET標准是一組API集合,由上層三種【.NET實現】的Basic Class Library實現,更正式的說法,由統一契約集合構成的規范,這個集合確保了在不同【.NET實現】之間的可移植性,能讓你的代碼 run everywhere。
.NET Standard 也是一個 target framework。如果您的代碼針對的是.NET Standard的一個版本,那它可以在任意一個 支持該.NET Standard版本的.NET實現上運行。
[.NET實現]
上圖給出的是微軟積極支持和維護的有三個主要的【.NET實現】:.NET Framework,.NET Core,Mono
①.NET Framework
最早期的.NET 實現,.NET Framework 是為構建面向windows桌面環境而設計的,針對不同的應用程序形態設計了 WINFORM、 ASP.NET、WPF。
4.5+版本開始實現.NET Standard:
https://docs.microsoft.com/en-us/dotnet/standard/net-standard https://docs.microsoft.com/en-us/dotnet/standard/frameworks
②.NET Core
是近幾年微軟擁抱開源的結晶,.NetCore是一個跨平台的【.NET實現】,因為原生實現了.NET Standard(完全沒有版本包袱), 面向.NETStandard的代碼可以在.NET Core平台上編譯和運行。
針對Web程序.NetCore准備了ASP.NECore框架, 定位是微軟新一代高性能、開源、跨平台Web開發框架, 目前最新穩定版本為2.2
另外.NetCore 3.0即將支持WINFORM、WPF, 這樣將全面覆蓋.Net Framework 支持的應用程序形態。
③ Mono 是一個微小運行時的 【.NET實現】,驅動 Xamarin,用於android,ios 等開發,支持目前所有公開的.NET standard 版本。
本人近些年工作在.NetCore平台, 有一些宏觀上的經驗之談供參考。
.NetCore部署目標的選擇
部署目標是在Target Framework Moniker中定義, 決定了程序的部署定位, 常見有如下2種:
-
netstandard
-
netcoreapp
在實踐中:項目早期可能是定位是 netstandard,后面隨着項目演進,依賴的庫越來越多,大部分都會變成netcoreapp.
如前所述 .NetStandard也是 target framework, 期望在多個運行時(.Net Framework4.5+,.NET Core, XAMARIN)上都能運作的程序應該以此框架為編程目標。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard1.6</TargetFramework> </PropertyGroup> </Project>
伴隨項目演進, 程序依賴的某些庫可能只有針對 .NetCore的版本; 從生產實際看, 部署環境只會搭配一套.Net Core運行時, 所以后期項目很大可能性會演進成針對 .Net Core的運行時部署。
<TargetFramework>netcoreapp2.2</TargetFramework>
multi sdk、multi runtime選擇策略
開發環境存在多SDK、多Runtime版本時,會使用什么版本呢?
① 當運行SDK命令,會使用安裝的最新版本命令
SDK命令包括dotnet new/ dotnet run,即使項目生成文件被指定為早期版本的運行時 或 安裝的最新版本SDK是預覽版, SDK依舊使用安裝的最新SDK版本
② 目標框架標記target framework monikers定義編譯時刻的API
編譯.NetCore程序的API是在項目文件的 Target framework Moniker中定義的,
<TargetFramework>netcoreapp2.0</TargetFramework>
<TargetFrameworks>netcoreapp2.0;net47</TargetFrameworks>
③ 運行.NetCore程序( 框架獨立的.NetCore 程序 ), 在部署服務器上會適用版本前滾的策略
在項目文件中指定了netcoreapp2.0, 在部署環境中2.0.4 是安裝的最新運行時版本, 那么就會使用2.0.4運行時版本
④ 發布自包含的程序,自包含的部署文件會內置指定的運行時
部署自包含.NetCore 程序時, 部署文件包含了.NetCore 運行時和程序依賴的庫文件,自包含項目並不依賴 部署服務器上運行時環境,運行時版本選擇發生在發布階段,而不是在運行階段。目前 自包含.NetCore程序使用場景不多,一般用於需要將程序應用到復雜的多種客戶環境中,這種部署方式可將運行時和依賴環境打包,不用去提前知曉客戶服務器運行時。
Tip: 針對策略① 有些特殊應用場景,如果項目需要使用早期的SDK版本,可在global.json文件中指定該早期版本,規避最新策略
{ "sdk": { "version": "2.2.3" } }
本文沒有大篇幅講解 .NETCore SDK和CommandLine的用法,照葫蘆畫瓢即可,特別指出 部署目標的設定策略、服務器存在多SDK的選擇策略, 讀者可參照對比心中有數。
碼甲拙見,如有問題請下方留言大膽斧正;碼字+Visio制圖,均為原創,看官請不吝好評+關注, ~。。~
本文歡迎轉載,請轉載頁面明顯位置注明原作者及原文鏈接。
