.NET Standard 2.0 發布日期:2017年8月14日
公告原文地址
前言
早上起來.NET社區沸騰了,期待已久的.NET Core 2.0終於發布!根據個人經驗,微軟的產品一般在2.0時會趨於成熟,所以一個新的.Net開發時代已經來臨!未來屬於.NET Core。
對於.NET Core 2.0的發布介紹,圍繞2.0的架構體系,本系列相關文章:
- .Net Core 2.0 生態(1).NET Standard 2.0 特性介紹和使用指南(已發布)
- .Net Core 2.0 生態(2).NET Core 2.0 特性介紹和使用指南(已發布)
- .Net Core 2.0 生態(3)ASP.NET Core 2.0 特性介紹和使用指南(已發布)
- .Net Core 2.0 生態(4)Entity Framework Core 2.0 特性介紹和使用指南(已發布)
.NET Standard 2.0是基石,所以放在第一篇。
使用之前,下載安裝.NET Core 2.0,下載地址。
.NET Standard 2.0 特性介紹
-
代碼共享:.NET Standard是API集合,更是代碼實現標准,所有.NET實現必須符合該標准,防止代碼碎片化。.NET Standard被設計用來作為替代可移植類庫Portable Class Libraries(PCL)的構建工具。
-
API支持:在.NET Standard 2.0中API支持數量增多,包含API數量為32000個,.NET Standard 1.6 中API數量為13000個,目前為止已經包含.NET Framework中的大部分APIs,這意味着可以輕松地將現有代碼移植到.NET Standard,從而使現有代碼支持基於.NET Standard實現的任何平台,參看平台支持列表。
-
.NET Framework兼容模式:目前絕大多數的NuGet軟件包使用.NET Framework,大多數項目被禁止引用到.NET Standard項目,因不是所有的項目依賴都支持.NET Standard,這是在.NET Standard 2.0中加入兼容模式的原因,使.NET Standard項目可以直接引用.NET Framework類庫。目前70%的Nuget軟件包是兼容.NET Standard 2.0,可能在某些特殊情況下不起會兼容失敗,比如:WPF中的.NET Framework類庫。
-
平台支持
- .NET Framework 4.6.1
- .NET Core 2.0
- Mono 5.4
- Xamarin.iOS 10.14
- Xamarin.Mac 3.8
- Xamarin.Android 7.5
- Upcoming version of UWP (預計今年下半年)
.NET Standard 2.0 使用指南
創建.NET Standard類庫
通過創建一個新項目來實踐一下,在VS中 文件
| 新項目
選擇.NET Standard分類找到 Class Library (.NET Standard),項目名稱為mylibrary
。
也可以通過命令行dotnet new
創建一個類庫(默認使用.NET Standard)
dotnet new lib -o mylibrary
為了讓這個類庫更加意義,編輯文件Class1.cs as
,添加一行邏輯代碼。
using System;
namespace mylibrary
{
public class Class1
{
public static string GetMessage() => "Hello from .NET Standard!";
}
}
使用.NET Standard類庫
在使用類庫之前,需要創建一個項目。創建一個空ASP.NET Core項目。在VS中,創建項目時在.NET Core分類中選擇ASP.NET Core Web Application
,選中ASP.NET Core 2.0
,類型為Empty。
命令行創建
dotnet new web -o aspnetcore
使用.NET Standard類庫的方式和使用其他類庫一樣,只需要在項目中添加引用。在VS中右鍵項目,點擊添加/引用,然后在項目(Projects)選項卡中選擇 mylibrary。
命令行方式為項目添加引用
dotnet add reference ../mylibrary/mylibrary.csproj
在Startup.cs
文件,添加代碼
app.Run(async (context) =>
{
var message = mylibrary.Class1.GetMessage();
await context.Response.WriteAsync(message);
});
在VS中F5運行。
命令行工具運行
$ dotnet run
Now listening on: http://localhost:50878
Application started. Press Ctrl+C to shut down.
運行效果
恭喜!創建的.NET Standard 2.0類庫在.NET Core中調用成功。同樣也可以在 .NET Framework或Xamarin等不同類型的應用中使用,方式一樣。
重用現有.NET Framework類庫
.NET Standard 2.0 提供兼容模式,現在添加一個非.NET Standard類型的NuGet包,如要添加NuGet包為:Huitian.PowerCollections,在VS中右鍵項目mylibrary
,選擇Manage NuGet Packages.,然后選擇Browse,搜索Huitian.PowerCollections,在結果中找到包並點擊安裝。
命令行添加Nuget包
dotnet add package Huitian.PowerCollections
安裝完包后,將顯示以下警告:
NU1701: Package ‘Huitian.PowerCollections 1.0.0’ was restored using ‘.NETFramework,Version=v4.6.1’ instead of the project target framework ‘.NETStandard,Version=v2.0’. This package may not be fully compatible with your project.
這段警告不僅在安裝包時提示,在每次構建時都會提示。
警告出現的原因是因為NuGet無法確定.NET Framework類庫是否能夠完全正常工作。例如,它可能依賴於Windows Forms(不跨平台)。建議測試應用程序,如果所有功能都按預期工作,您可以阻止警告。
編輯項目文件中包引用配置,添加NoWarn屬性:
<ItemGroup>
<PackageReference Include="Huitian.PowerCollections" Version="1.0.0" NoWarn="NU1701" />
</ItemGroup>
上面的配置是將Huitian.PowerCollections(版本:1.0.0)
包引用時產生的警告名為NU1701
設置為不提示。
在VS中直接在包的屬性中進行設置
再次編譯,不再提示警告信息。注意:配置只針對每個引用包,不是全局的。因此,如果引用了另一個需要兼容模式的庫,將再次得到警告,需要對該包進行單獨設置。
發布NuGet包
當類庫開發完成,可以將其發布成NuGet包,在VS中,右鍵項目選擇屬性(Properties),在選項卡中找到Package,選中Generate NuGet package on build
在命令行工具環境下,編輯項目文件添加GeneratePackageOnBuild設置值為true
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
編譯項目,在輸出目錄中會找到生成的NuGet包。
補充:關於可移植類庫(Portable Class Libraries)
.NET Standard 2.0發布之后,在.NET項目中共享代碼,不再推薦使用PCL類庫,有可能后面會廢棄,如果現在使用PCL應該移植為.NET Standard類庫。
總結
.NET Standard 2.0 支持API數量是 .NET Standard 1.x 的兩倍多,這意味着我們將.NET Framework 中的代碼移植到.NET Standard變得更加順暢,另外通過兼容模式在.NET Standard類庫中可以引用.NET Framework項目或類庫,這樣允許在沒有將所有代碼移植到.NET Standard的情況下快速使用現有類庫。(提供一個過渡措施,如果代碼沒有執行到不支持的API是不會出錯的。)
幾乎所有.NET平台都支持 .NET Standard 2.0,包括.NET Framework, .NET Core, 和 Xamarin(前身是Mono),UWP在今年稍后的時間會支持。所有這些實現得益於新增的API以及兼容模式,特別是.NET Core和UWP,他們以前只能使用一個受限的API集。
建議你將所有的業務邏輯和UI中依賴的代碼轉換成.NET Standard,能確保你的業務邏輯可以在任何平台被復用,比如桌面應用、移動應用、雲應用。