什麼是.NET Standard?是套件?需要安裝?都不是~
隨著Xamarin與.NET Core 的浪潮來襲,.NET已儼然成為平台之姿提供豐富的開發環境開發各式各樣的應用
同時也產生不同應用間不盡相同的BCL實作,導致某些code,甚至整個library無法被reuse,需要針對特定平台重新撰寫該功能
.NET Standard的出現正是為了消彌這些亂象而衍生的開發困難,被視為是新一代PCL (Portable Class Library)
透過制定一系列.NET API的正式規範提供所有平台的.NET runtime實作,是一份協議、一系列API介面(Interface),並不是直接實作。
核心概念:如果Library是基於.NET Standard x.y版本實作,便可於所有符合x.y版本的.NET 應用上使用。※圖中橫向代表.NET Standard目前制定的版本,縱向對應各平台符合規範的實作版本,且.NET Standard在各版本間具有向上兼容(Upward Compatible)的特性。
例如寫一個.NET Standard 1.1的library,就可運行在UWP 10.0、Windows 8.0、.NET Framework 4.5....等等 ,但不包括WP Silverlight,
並且因為向上兼容特,符合1.1以後版本(如1.2...2.0)的平台都可以使用此Library,因此也可運行在.NET Core 2.0。
.NET Standard VS PCL (Portable Class Library)
兩者都是為了能夠使用同樣的API共享biniary code。
差異點
- PCL 是Microsoft平台only
- PCL是奇異的編號配置檔,STD是線性版本號
- .NET Standard是被精心策畫的(官方說),PCL只是找出現存平台的交集區
.NET Standard 2.0 改變
- 擁有更廣泛的API - 取自 Xamarin 與 .NET Framework 的交集,.NET Core 2.0實作
- 可以直接參考.NET Framwork的dll,包含Nuget packages
.NET Standard 工作原理
引用NuGet package NetStandard.Library x.y,如上圖
編譯期間
檢查程式中是否有可以先橋接至對應的.NET Framwork 或 PCL 組件進行型別轉送(Type Forwarding)
執行期間
Runtime提供實作使netstandard.dll能正確運行型別轉送(Type Forwarding)執行程式
建立.NET Standard 2.0 Library
需求環境:
- 安裝VS 2017 v15.3 以上版本
- 安裝.NET Core 2.0
※NQuery是一個net2.0的library
提供Muti-Target Framworks builds
- 直接編輯.csproj
- 修改TargetFramworks
- build!!!
.NET Standard相容性檢查工具-.NET Portability Analyzer
提供檢查dll或者專案的程式碼與.NET Standard x.y(or .NET framwork x.y......etc)相容性,輸出分析結果文件(JSON,HTML,Excel)
可以直接使用console指令分析某個資料夾下所有dll或是某個dll
ApiPort.exe analyze -f C:\git\Application\bin\Debug -b
也可以透過安裝Visual studio擴充套件,重新啟動後點選專案右鍵,就可以看到Analyzer Setting設定目標Framwork&Version還有輸出文件格式,Analyze Project 執行分析
分析結果的文件,提供涵蓋率、差異API與建議處理
※2017/7/7專案引用的外部參考dll or package目前似乎不包含在分析範圍內,會產生一張表Missing assemblies告知有哪些外部參考(有些奇怪)
參考&來源資料:
再來多聊一點 .Net Standard
https://docs.microsoft.com/zh-tw/dotnet/standard/net-standard
https://github.com/dotnet/standard/blob/master/docs/netstandard-20/README.md
https://www.slideshare.net/terrajobst/net-standard-under-the-hood
https://weblog.west-wind.com/posts/2016/Nov/23/NET-Standard-20-Making-Sense-of-NET-Again
https://www.youtube.com/playlist?list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY