一、.NET Core概述
1、相關歷程
.NET在設計之初也是考慮像Java一樣跨平臺,.NET Framework是在Windows下運行的,大部分類是可以兼容移植到Linux下,但是沒有人做這個工作。
2001年米格爾為Gnome尋找桌面開發技術,在研究了微軟的.NET Framework之后發起了mono項目。
后來novell公司收購了mono,進一步完善了mono,并且把大部分.NET Framework功能移植到Linux下。mono也成為xamarin(使用.NET開發Android、iOS 移動應用技術)和unity3d(使用.NET 開發android,iOS游戲的技術)基礎。
.NET Core是微軟開發的另一個可以跨Linux、Windows、Mac等平臺的.NET。
2016年初,微軟收購mono的公司xamarin。那為什么微軟已經收購了mono,還要搞出來一個.NET Core呢?因為mono完全兼容.NET Framework,架構太陳舊,不利于現在云計算、集群等新的架構理念。因此,微軟推翻重寫推出了.NET Core。
2、相關技術
.NET Core是.NET Framework的新一代版本,是微軟開發的第一個具有跨平臺(Windows、Mac OSX、Linux) 能力的應用程序開發框架。
.NET Core會包含.NET Framework的類庫(部分命名空間改變、部分類庫可能因為不適用已無對應),與.NET Framework不同的是,.NET Core采用包化(Packages)的管理方式,應用程序只需獲取需要的組件即可。與.NET Framework大包式安裝的做法截然不同,并且各個包有獨立的版本線,不在硬性要求應用程序跟隨主線版本。
.NET Core由許多項目所組成,除了基本的類庫(Core FX)外,還包含了采用RyuJIT編譯的運行平臺 Core CLR、編譯器平臺.NET Compiler Platform、采用AOT編譯技術運行最優化的包 Core RT(.NET Core Runtime),以及跨平臺的MSIL編譯器LLILC(LLVM-based MSIL Compiler)等項目。
RyuJIT: 微軟發展的新式即時編譯器(Just-in-Time Compiler),用來代替.NET Framework的JIT以及JIT64即時編譯器。據微軟測試報告數據,RyuJIT的性能較前一代JIT提升約25%,并支持SIMD(Single Instruction,Multiple Data)技術。RyuJIT已經應用于.NET Framework 4.6以及.NET Core中。
Core CLR:移植了.NET Framework的CLR功能,包含核心程序庫mscorlib、JIT編譯器、垃圾回收器(GC)以及其他運行MSIL所需的運行時環境。
Core RT:以AOT(Ahead-of-time)編譯方式為主的核心功能,在.NET Core內成為Core RT,在UWP(Universal Windows Platform,通用應用平臺)中稱為.NET Native。
Core RT會在構建時期(非運行期間)在編譯時將MSIL轉換成平臺本地的機器代碼,其優點是引導時間短(JIT采用的是運行時編譯,使得引導時間拉長),并且內存占用量少。Core RT在不同的平臺會使用不同的AOT技術。
Windows下使用的是.NET Native。
Mac OSX和Linux上使用的是LLILC(同時支持JIT和AOT)。
LLILC:(LLVM-based MSIL Compiler,英文發音“lilac“)是.NET Core在非Windows平臺的MSIL編譯器,基于ECMA-335(Common Language Infrastructure)的標準將MSIL編譯成本地碼運行,適用于可運行LLVM的操作系統,例如Mac OSX和Linux操作系統。
Roslyn:.NET Compiler Platform(項目代碼為Roslyn)是將.NET 平臺的編譯架構標準化的平臺,它可提供程序管理工具(如集成開發環境)相當多的信息,用于發展有助于編寫程序域管理程序機構所需要的功能,如類型信息、語法結構、語義、參考鏈接、自動化、編譯器、錯誤回收等功能。
只要是遵循CLI標準的編程語言,都可以利用.NET Compiler Platform實現編譯器,讓程序管理工具能夠實現如語法提示、語法自動完成、關鍵字高亮等可視化功能。
.NET Compiler Platform可同時支持.NET Framework 4.6以上版本,.NET Core也原生支持。
二、.NET Core安裝和驗證
1、下載安裝
訪問.NET Core下載頁面,下載.NET Core 3.1版本
下載后直接雙擊安裝一步一步安裝即可。
2、驗證
安裝完成以后,我們打開命令提示符:
dotnet --version
查看當前.NET Core安裝的最新版本。
dotnet --info
查看本機上.NET Core的相關信息。
三、.NET Core常用命令介紹
1、dotnet new
初始化創建一個有效的.NET Core項目和示例源代碼
可以使用dotnet new -h來查看命令的幫助信息。
示例:
dotnet new mvc
2、dotnet restore
還原指定應用程序的依賴項和工具。
命令使用NuGet還原在project.json文件中被指定的依賴項,以及特定于項目的工具。默認情況下,依賴項和工具的還原是并行完成的。
對于依賴項,我們可以在還原操作時使用--packages 參數指定還原包的位置。如果沒有指定,則默認使用NuGet包緩存,它可以在所有的操作系統上的用戶目錄下的.nuget/packages目錄中找到。(Linux上的/home/user、Windows上使用%HOMEPATH%/.nuget/packages)
對于特定項目的工具,dotnet restore首先還原該工具的包,然后繼續還原在project.json中指定的工具依賴項。
示例:
還原在當前目錄中的項目依賴項和工具
dotnet restore
還原在給定的路徑發現coreapp項目依賴項和工具
dotnet restore ~/projects/coreapp/project.json
還原在當前目錄中的項目依賴項和工具,使用兩個文件路徑作為備用源
dotnet restore -f c:\packages\mypackages -f c:\packages\myotherpackages
還原在當前目錄中的項目依賴項和工具,并在輸出中僅顯示errors
dotnet restore --verbosity Error
3、dotnet build
生成項目和所有的依賴。
該命令從源項目中的多個源文件及其依賴生成二進制文件。默認情況下,生成的二進制文件為中間語言(IL)并具有DLL擴展名。dotnet build還刪除了\*.deps文件,該文件概述了主機運行應用程序所需的條件。
生成需要存在鎖定文件,也就是說,在生成代碼之前,必須先運行dotnet restore。
在任何編譯開始之前,都應生成動詞分析項目及其增量安全檢查的依賴。如果所有的檢查都能通過,就會繼續生成與項目及其依賴的增量編譯;否則,它將退回到非增量編譯。通過配置文件標志,用戶可以選擇接受有關如何縮短生成時間的附加信息。
依賴項中需要編譯的所有項目必須通過下面的安全檢查,是編譯過程為增量編譯:
不使用預編譯/編譯后腳本。不從PATH加載編譯工具(如Resgen、編譯器)。僅使用已知編譯器(csc、vbc、fsc)為了生成可執行的應用程序,而不是庫,需要在project.json文件中進行特殊配置:
{
“compilerOptions”:{
"emitEntryPoint":true
}
}
示例:
編譯當前目錄的項目
dotnet build
編譯當前項目并輸出到c:\mydll
dotnet build --output c:\mydll
針對特定運行時生成項目及其依賴項
dotnet build --runtime ubuntu.16.04-x64
4、dotnet run
運行當前目錄下的應用源代碼。
此命令依賴于dotnet build,以便在啟動程序前生成.NET程序集的源輸入。輸出的文件被寫到bin文件夾,如果不存在則創建它,根據需要,文件將被覆蓋。臨時文件被寫入到obj文件夾。
對于具有多個指定框架的項目情況下,dotnet run將首先選擇.NET Core框架,如果不存在,則會輸出錯誤。若要指定其他框架,需要使用--framework參數。
dotnet run命令必須在項目上下文中使用。如果你想執行一個dll,可以使用不帶任何參數的dotnet命令 dotnet myapp.dll 直接運行生成后的dll。
示例:
運行當前目錄中的項目
dotnet run
運行指定的項目
dotnet run --project /projects/coreapp/project.json
5、dotnet test
使用project.json中指定的測試執行工具執行單元測試。
該命令用于執行給定項目中的單元測試。單元測試是包含單元測試框架(包含NUnit或xUnit)和該單元測試框架的dotnet測試運行程序上的依賴項的類庫項目。單元測試打包為NuGet包,并還原為該項目的普通依賴項。
測試項目需要在project.json中使用testRunner節點指定測試運行程序屬性。此值應包含單元測試框架的名稱。
dotnet test支持兩種運行模式:
控制臺,此模式下,dotnet test完全執行傳遞給它的任意命令,并輸出結果。當只調用但不傳遞dotnet test時,在控制臺模式下運行的端口將反過來使運行程序在控制臺模式下運行。設計時,在其他工具,如編輯器或集成開發環境(IDE)的上下文中使用。示例:
運行當前目錄所包含項目中的測試
dotnet test
運行test1項目中的測試
dotnet test /projects/test1/project.json
6、dotnet pack
使用代碼創建NuGet包。
該命令生成項目并創建NuGet包,此操作將生成兩個含有nupkg擴展名名的包:一個是包含代碼,另一個包含調試符號。
被打包的項目的NuGet依賴項添加到nuspec文件,以便在安裝包時可以將其解析。默認情況下,項目到項目的引用不會打包到項目內,要做到這一點,需要在依賴中將引用項目的type節點設置為build
{
"version":"1.0.0-*",
"dependencies":{
"ProjectA":{
"target":"project",
"type":"build"
}
}
}
dotnet pack 默認情況下,首先會生成項目,如果想避免這種情況,使用--no-build選項。這在持續集成(CI)生成方案中非常有用。
示例:
打包當前目錄中的項目
dotnet pack
打包test1項目
dotnet pack ~/projects/test1/project.json
打包當前目錄中的項目,并將生成的包放置到指定的nupkgs文件夾中
dotnet pack --output nupkgs
打包當前目錄中的項目到指定的nupkgs文件夾中,并跳過生成步驟
dotnet pack --no-build --output nupkgs
打包當前項目,并更新生成的具有給定后綴的包版本,例如版本1.0.0-*將更新為1.0.0-ci-1234
dotnet pack --version-suffix "ci-1234"
7、dotnet publish
發布.NET 可移植或獨立應用程序。
該命令用于打包應用程序及所有依賴到文件夾中,準備發布。
編譯應用程序,讀取在project.json文件中指定的依賴,并將生成的文件結果集發布到目錄。
根據可移植應用的類型,生成的目錄包含以下內容:
可移植應用程序,應用程序的中間語言(IL)代碼和應用程序的所有托管依賴項。含本機依賴項的可移植應用程序:除上述內容外,還包括每個本機依賴項的受支持平臺的子目錄。獨立應用程序,除上述內容外,還包括目標平臺的完整運行時。示例:
使用在project.json中發現的框架發布一個應用程序,如果project.json包含runtimes節點,則發布當前平臺的RID。
dotnet publish
使用指定的project.json發布應用程序
dotnet publish ~/projects/test1/project.json
使用netcoreapp1.0框架發布當前應用程序
dotnet publish --framework netcoreapp1.0
使用netcoreapp1.0框架和OS X 10.10運行時發布當前應用程序,這個RID必須存在于project.json的runtimes節點中
dotnet publish --framework netcoreapp1.0 --framework osx.10.11-x64