.NET Core 2.0發佈日期:2017年8月14日 前言 這一篇會比較長,介紹了.NET Core 2.0新特性、工具支持及系統生態,現狀及未來計劃,可以作為一門技術的概述來讀,也可以作為學習路徑、提綱來用。 對於.NET Core 2.0的發佈介紹,圍繞2.0的架構體系,我想通過一個系列來全 ...
.NET Core 2.0發佈日期:2017年8月14日
前言
這一篇會比較長,介紹了.NET Core 2.0新特性、工具支持及系統生態,現狀及未來計劃,可以作為一門技術的概述來讀,也可以作為學習路徑、提綱來用。
對於.NET Core 2.0的發佈介紹,圍繞2.0的架構體系,我想通過一個系列來全面介紹:
- .Net大局觀(1).NET Standard 2.0 特性介紹和使用指南(已發佈)
- .Net大局觀(2).NET Core 2.0 特性介紹和使用指南(已發佈)
- .Net大局觀(3)ASP.NET Core 2.0 特性介紹和使用指南
- .Net大局觀(4)Entity Framework Core 2.0 特性介紹和使用指南
.NET Core 2.0發佈最終版,基於.NET Core 2.0開發的項目可以放心用於生產環境。.NET Core 2.0開發不受開發工具影響,安裝SDK之後便可以使用命令行工具,Visual Studio Code或者你喜歡的文本編輯器編寫代碼發佈項目,當然對於重量級IDE需要更新到最新版:Visual Studio 2017 15.3、Visual Studio for Mac 7.1。
註意:VS 2017 15.3並沒有包含SDK,需另外單獨安裝.NET Core 2.0 SDK。
個人更喜歡使用輕量級編輯器Visual Studio Code,對我而言更新Visual Studio 2017 15.3是一項不小的工程,但是這個最新版本提供的單元測試Live Unit Testing功能,是其他IDE不能相比的,這會成為TDD開發者的最愛!
.NET Core 2.0進行了多項重要改進,這使得.NET Core 2.0更加具備作為平臺的能力。本文總結了.NET Core 2.0最新特性,詳細改進細節,可以參考GitHub Issues:dotnet/core #812。
特性概述
Runtime(運行時)
- 運行時和框架的主要提升性能
- 實現.NET Standard 2.0
- 更多的發行版,新增6個平臺支持,包含Debian Stretch, SUSE Linux Enterprise Server 12 SP2, 和 macOS High Sierra.
- RyuJIT is the x86 JIT in .NET Core 2.0
- Linux 和 Windows ARM32 構建版已經發佈預覽
SDK
- dotnet restore現在是一個隱式命令(需要的時候自動執行)
- .NET Core 和 .NET Standard項目可以引用.NET Framework NuGet包、項目和程式集。
- .NET Core SDK 可以進行源碼編譯,編譯代碼和腳本參看source-build repo
Visual Studio
- 支持.NET Core項目Live Unit Testing
- 代碼導航的改進
- C# Azure 函數支持
- CI/CD 支持容器
使用指南
快速使用 .NET Core 2.0
首先請安裝.NET Core SDK 2.0。(SDK中已經包含Runtime)
安裝完成之後就可以使用命令行或Visual Studio創建.NET Core 2.0應用程式了。
創建新項目是極其簡單的操作,在Visual Studio 2017可以使用提供的項目模板,也可以使用命令dotnet new
執行命令創建:
C:\samples>dotnet new console -o console-app
C:\samples>cd console-app
C:\samples\console-app>dotnet run
Hello World!
項目和類庫升級
可以將現有程式升級到 .NET Core 2.0。在Visual Studio中,更改目標框架為 .NET Core 2.0。
如果使用Visual Studio Code或者其他代碼編輯器,手動編輯項目文件將目標框架改為netcoreapp2.0
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
.NET Core 2.0和1.0/1.1之間的關係
三個版本是獨立的,且可可以共存,並分別使用對應的運行時,項目不會自動升級,除非設置了對應的版本。
開發環境下,安裝了多個SDK版本,預設使用最新的版本,在安裝完.NET Core 2.0 SDK之後,用於所有新創建的項目,指定為1.0和1.1版本的項目仍然使用對應版本運行時。
在項目中添加global.json配置文件,可以指定使用特定的SDK版本。
.NET CORE Rumtime改進
有以下主要改進
性能改進
在.NET Core 2.0中有多項性能改進,開發團隊發佈了一系列文章說明.NET Core Runtime改進的細節:
- Performance Improvements in .NET Core
- Performance Improvements in RyuJIT in .NET Core and .NET Framework
- Profile-guided optimization in .NET Core 2.0
.NET Core 2.0基於.NET Standard 2.0
.NET Core 2.0實現了.NET Standard 2.0規範。
參看diff between .NET Core 2.0 and .NET Standard 2.0理解.NET Core 2.0提供API和.NET Standard 2.0規範。
將Linux作為單個操作系統更容易實現
.NET Core 2.0將Linux作為單個操作系統來對待。(Linux的版本很多,這項支持意味著在我們眼中不同的版本都是Linux,無視差異,提高Linux系統上的相容性。)現在有一個單獨的Linux構建(基於晶元架構的構建),它適用於測試過的所有Linux發行版。到目前為止,支持僅限於基於glibc的發行版,特別是基於Debian和Red hat的Linux發行版。
計劃還將支持更多其他的Linux發行版。
Windows和macOS也有類似的改進。您現在可以將項目發佈為以下的“運行時”:
- linux-x64, linux-arm
- win-x64, win-x86
- osx-x64
Linux和Windows ARM32構建現在可用(預覽版)
.NET Core開發團隊正在為.NET Core 2.0+開發ARM32構建支持。
這些構建非常適合在樹莓派使用。這些構建還沒有正式發佈,現在只是預覽版。提供為.NET Core 2.0 生成ARM32 Runtime(沒有SDK)。因此,需要在另一個操作系統上構建應用程式,然後複製到樹莓Pi(或類似的設備)上運行。
下麵是兩個非常棒的 .NET Core ARM32開發實例:
全球化模式
.NET Core 2.0包含新的opt-in globalization mode,提供與操作系統和語言一致的基本的全球化相關功能。這種新模式的好處在於它的一致性、沒有任何全球化依賴。
參看.NET Core Globalization Invariant Mode瞭解更多關於這個特性的信息.
.NET Core SDK 改進
下麵是主要改進
dotnet restore 調整為隱式命令
在需要的時候會自動調用,dotnet restore
是命令中使用頻率較高的,用於項目引用更新時,恢復依賴的引用包,儘管沒有更新時會有提示執行,但這非常容易忘記。
現在,當我們執行命令,如:run
,build
,publish
時,會自動調用dotnet restore
。
下麵的示例演示
C:\Users\rich>dotnet new mvc -o mvcapp
The template "ASP.NET Core Web App (Model-View-Controller)" was created successfully.
This template contains technologies from parties other than Microsoft, see https://aka.ms/template-3pn for details.
Processing post-creation actions...
Running 'dotnet restore' on mvcapp\mvcapp.csproj...
Restoring packages for C:\Users\rich\mvcapp\mvcapp.csproj...
Restore completed in 32.3 ms for C:\Users\rich\mvcapp\mvcapp.csproj.
Generating MSBuild file C:\Users\rich\mvcapp\obj\mvcapp.csproj.nuget.g.props.
Generating MSBuild file C:\Users\rich\mvcapp\obj\mvcapp.csproj.nuget.g.targets.
Restore completed in 2.26 sec for C:\Users\rich\mvcapp\mvcapp.csproj.
Restore succeeded.
C:\Users\rich>cd mvcapp
C:\Users\rich\mvcapp>dotnet run
Hosting environment: Production
Content root path: C:\Users\rich\mvcapp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
Application is shutting down...
創建項目後,會自動調用dotnet restore
命令。
在.NET Standard項目中引用.NET Framework類庫
這個功能將幫助我們將.NET Framework 快速遷移到.NET Standard或.NET Core,在遷移的過程中,先直接使用,那麼隨著時間的推移(從二進位文件開始,然後移動到源代碼)遷移整個項目。
這個功能也為.NET Framework類庫提供一個新的運行框架支持。
引用.NET Framework類庫之後,類庫中的類型僅限於使用在.NET Standard API集合中支持的類型,所以要謹慎對待,進行完整測試。
類庫支持.NET Framework 4.6.1,或更早的版本,甚至包括1.0的版本。下圖展示了這項功能的使用:
從應用程式的調用堆棧可以看出程式集的目標框架。
.NET Standard NuGet包無需任何依賴
類庫的框架目標設置為 .NET Standard 2.0 或更高的版本,將無需任何依賴,底層依賴直接由.NET Core SDK提供。
下麵是目標框架為.NET Standard 2.0的NuGet包配置文件:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>ClassLibrary1</id>
<version>1.0.0</version>
<authors>ClassLibrary1</authors>
<owners>ClassLibrary1</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Package Description</description>
<dependencies>
<group targetFramework=".NETStandard2.0" />
</dependencies>
</metadata>
</package>
下麵是目標框架為.NET Standard 1.4的NuGet包配置文件:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>ClassLibrary1</id>
<version>1.0.0</version>
<authors>ClassLibrary1</authors>
<owners>ClassLibrary1</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Package Description</description>
<dependencies>
<group targetFramework=".NETStandard1.4">
<dependency id="NETStandard.Library" version="1.6.1" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
</package>
Visual Studio 2017 15.3 更新
SDK並行支持
最新版本的VS,可以識別最新的.NET Core SDK,並且應用相關的工具。15.3版本中Visual Studio對.NET Core SDK提供並行支持,即在創建新項目時,預設使用安裝的最高.NET Core SDK版本,同時允許您在需要時通過使用global.json來指定和使用舊版本。
這樣可以使用VS構建針對不同.NET Core版本的應用。
Visual Basic 支持
除了支持C#和F#,15.3現在還支持使用Visual Basic來開發.NET Core應用程式。
Live Unit Testing 支持
Live Unit Testing (LUT)是Visual Studio 2017企業版中一項新功能,在15.3中支持.NET Core應用程式。熱愛測試驅動開發(TDD)的用戶肯定會喜歡這個新功能。
啟用步驟非常簡單:Test->Live Unit Testing->Start
如下圖所示,當我們啟用LUT,可以在代碼編輯器中實時查看單元測試覆蓋和測試結果反饋,註意左邊的測試用例和右邊的被測試代碼。(這個好!)
IDE生產力增強
Visual Studio 2017 15.3提供多項生產力增強功能,幫助更快寫出更好的代碼。現在支持通過EditorConfig設置.NET命名規範和格式化規則,這樣允許您的團隊執行和配置幾乎所有代碼的編碼約定。(團隊開發統一代碼規範的痛點得到解決!贊!)
代碼導航改進:添加GoToAll(Ctrl+T)支持camelCase匹配(大寫簡稱匹配),只需要輸入縮寫,可以導航到任意文件、類型、成員定義,比如:bh
將會搜索到BusHelper.cs
。
在下圖中還可以看到建議的變數名,變數名遵循編輯器配置中的代碼規範:
新增部分重構功能:
- 解決合併衝突(Resolve merge conflict)
- 添加參數(根據調用方法推斷)
- 生成重載(overrides)
- Add named argument
- Add null-check for parameters
- Insert digit-separators into literals
- Change base for numeric * literals (e.g., hex to binary)
- Convert if-to-switch
- Remove unused variable
項目系統優化
對項目文件.csproj
進行優化,移除部分不需要的元素。從下圖可以看到項目的依賴項進行分類,結構更加清晰。
另一個針對.NET Core項目系統的增強是項目編譯更加高效。
Docker支持
.NET Core 2.0項目可以更好的支持Docker:
- Docker latest tag moved to .NET Core 2.0
- microsoft/dotnet Docker Hub README adopted segmented OS/Arch style
- Linux ARM32 Docker images are now available.
- .NET Core 2.0 multi-arch tags now use Debian Stretch
- .NET Core Docker images use multi-arch based tags
- .NET Core supports Multi-Stage Build
版本支持和生命周期
.NET Core 2.0可以應用於生產環境。
微軟有兩個支持級別:長期支持(Long Term Support-LTS)和當前版本(Current release)。LTS版本有三年的支持,而當前版本更短,通常在一年左右,甚至可能更短。當前版本又被稱為“快速跟蹤支持”。.NET Core 1.0 and 1.1 是LTS版。
.NET Core 2.0是當前版本支持,正在等待質量和可靠性的反饋,然後會轉到LTS支持。一般來說,在發佈LTS版時,要確保該版本處於只需要為它提供安全修複的階段,一旦你部署了一個帶有LTS版本的應用程式,就不應該更新它,至少不會因為平臺而更新。
Red Hat完全支持.NET Core,會很快發佈相應的版本,可以查看這個網站RedHatLoves.NET查看。
還記得這些圖片嗎?微軟高調示愛Linux
當然,愛是相互的,微軟用了三年時間終於也收穫了被愛的感覺,技術的最終方向是:融合,感動O(∩_∩)O~!
最後
2.0 是.NET Core一個重要的里程碑版本,讓人感到非常興奮!2.0不僅是目前所有.Net框架中最快的版本,同時.NET Standard 2.0也實現了承諾:讓.NET無處不在。結合Visual Studio家族,.NET Core為開發人員在Windows、MacOS以及Linux系統提供最高效的開放平臺。
寫給自己的話
寫文章真是一件耗費腦力和體力的事情,對這篇文章的整理和編輯持續兩天才完成,計算下大概耗時4小時,感覺寫代碼爽多了,可能還沒適應寫東西,但是我會堅持更新完這個系列。希望更多人第一時間瞭解.NET Core!