.NET架構開發應知應會

頭號碼甲發表於2019-07-03

  .NET程式是基於.NET framework、.NET Core、Mono、UWP【.NET實現】開發和執行的 ,定義以上【.NET實現】的標準規範稱為.NET Standard

 L1:.NET Standard

  .NET標準是一組API集合,由上層三種【.NET實現】的Basic Class Library實現,更正式的說法,由統一契約集合構成的規範,這個集合確保了在不同【.NET實現】之間的可移植性,能讓你的程式碼 run everywhere。

  .NET Standard 也是一個 target framework。如果您的程式碼針對的是.NET Standard的一個版本,那它可以在任意一個 支援該.NET Standard版本的.NET實現上執行。

 

L2: [.NET實現]

  上圖給出的是微軟積極支援和維護的有三個主要的【.NET實現】:.NET Framework,.NET Core,Mono

  ①.NET Framework

    最早期的.NET 實現, 4.5+版本開始實現.NET Standard      https://docs.microsoft.com/en-us/dotnet/standard/net-standard  https://docs.microsoft.com/en-us/dotnet/standard/frameworks

    早期的微軟比較閉源,.NET Framework 是為構建面向windows桌面環境而設計的,針對不同的應用程式形態設計了 WINFORM、 ASP.NET、WPF

  ②.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.

  如L1所述 .NetStandard也是一個 target framework, 旨在在多個執行時(跨越.Net Framework,.NET Core, XAMARIN)上執行的程式應該以此框架為目標。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard1.6</TargetFramework>
  </PropertyGroup>
</Project>

   伴隨專案演進, 程式依賴的某些庫可能只有針對 .NetCore的版本; 從生產實際看, 部署環境只會部署一套.Net Core執行時, 所以後期專案很大可能性會演進成 針對 .Net Core 執行時部署。

<TargetFramework>netcoreapp2.2</TargetFramework>

 

二: 開發環境存在多SDK、多Runtime版本時,應當知曉 .NET Core工具、SDK和執行時版本選擇的策略。

  ① 當執行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選擇策略上的經驗, 讀者可參照應用。

 

作者:JulianHuang

感謝您的認真閱讀,如有問題請大膽斧正;覺得有用,請下方或加關注。

本文歡迎轉載,但請保留此段宣告,且在文章頁面明顯位置註明本文的作者及原文連結。

相關文章