.net跨平臺前世今生
.NET core 1.0并不是對原有的.net平臺的升級感昼,而是一次全新的重寫,這個開發(fā)過程微軟也史無前例的采用了全面開源的做法系忙,在github上接受全球開發(fā)者的pull request映跟。從上圖可以看出,.NET core與現(xiàn)有的.net framework是并行的拗小,是完全獨立發(fā)展的一套開發(fā)平臺重罪。與之前的.net framework最大的區(qū)別在于跨平臺,同時支持Windows/macOS/Linux 這三大操作系統(tǒng)哀九。在GitHub上.NET Core的發(fā)布時間線可以看到在過去的2年里剿配,微軟一步步的將.NET 從Windows操作系統(tǒng)上剝離,逐步添加了對macOS和Linux操作系統(tǒng)的支持阅束,同時與開源社區(qū)的合作也在逐步加深惨篱。
- 2014年7月 - 微軟在github上發(fā)布了asp.net vNext(也就是asp.net 5)的前身,這時還是alpha階段
- 2014年11月 - 發(fā)布了beta1围俘,并且開始使用asp.net 5的名稱
- 2015年10月 - 發(fā)布了beta8砸讳,這是最后的一個beta版本层玲,這一年的時間里播玖,微軟逐步提供了對于macOS和Linux操作系統(tǒng)的支持;同時隨著 Visual Studio Code 這個跨平臺代碼編輯器的流行,大家慢慢開始關注asp.net 5
- 2015年11月 - 發(fā)布了RC1而昨,標志著asp.net 5基本具備了使用在生產(chǎn)環(huán)境的能力
- 2016年6月27日 - 在RedHat全棧開發(fā)者大會DevNation上,微軟與RedHat攜手發(fā)布了Asp.net Core 1.0太示,標志著微軟這一跨平臺開發(fā)工具的正式發(fā)布
.net core
.net core 是一個通用的侥锦,模塊化的,跨平臺并且開源的 .NET標準的實現(xiàn)克胳。它包含來一個運行時平绩,基礎框架類庫,編譯器和一些工具以支持不同的CPU和操作系統(tǒng)漠另。
項目的GitHub地址:
發(fā)布計劃
- 2016.6 發(fā)布1.0
- 2016秋季 發(fā)布1.1
1.1計劃
- 廣泛的API支持捏雌,讓.NET Framewok和Mono在BCL級別上等價。
- 過渡把MSBuild和的csproj作為.NET的所有版本的默認生成系統(tǒng)和項目模型笆搓。
Version 1.0 OS Support:
OS | Version | Architectures | Configurations |
---|---|---|---|
Windows Client | 7 SP1 - 10 | x64, x86 | |
Windows Server | 2008 R2 SP1 - 2016 | x64, x86 | Full, Server Core, Nano (2016 only) |
Red Hat Enterprise Linux | 7.2 | x64 | |
Fedora | 23 | x64 | |
Debian | 8.2 | x64 | |
Ubuntu | 14.04 LTS, 16.04 LTS | x64 | |
Linux Mint | 17 | x64 | |
openSUSE | 13.2 | x64 | |
Centos | 7.1 | x64 | |
Oracle Linux | 7.1 | x64 | |
Mac OS X | 10.11 (El Capitan) | x64 |
.net standard
- .NET Standard Library 是所有.NET運行時.NET API的正式規(guī)范性湿,目的是為.NET 生態(tài)系統(tǒng)建立更大的統(tǒng)一性。
- .NET Standard Library實現(xiàn)了以下主要方案:
1. 定義了統(tǒng)一的BCL APIS(標準類庫接口)满败,所有的.NET平臺去實現(xiàn)它肤频,獨立的工作量
2. 允許開發(fā)人員編寫可移植類庫,使用相同的API運行在跨.NET 運行時上算墨。
3. 減少和消除那些希望共享源代碼的但是需要加入編譯預處理命令做條件編譯的的.NET API和那些僅適用于OS的API宵荒。
各種.NET運行時實現(xiàn)了.NET標準庫的特定版本。每個.NET運行時版本發(fā)布净嘀,它支持最高.NET標準版报咳,這意味著它也支持以前的版本的聲明。(向下兼容)
例如:
.NET Framework 4.6 實現(xiàn).NET Standard Library 1.3面粮,那么意味著 它支持.NET Standard Library versions 1.0 through 1.3.又比如.NET Framework 4.6.2 實現(xiàn) .NET Standard Library 1.5,while .NET Core 1.0 實現(xiàn)了 .NET Standard Library 1.6.
.NET Standard關系圖
Target Platform Name | Alias | ||||||||
---|---|---|---|---|---|---|---|---|---|
.NET Platform Standard | netstandard | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | |
.NET Core | netcoreapp | → | → | → | → | → | → | 1.0 | |
.NET Framework | net | → | → | → | → | → | → | 4.6.3 | |
→ | → | → | → | → | 4.6.2 | ||||
→ | → | → | → | 4.6.1 | |||||
→ | → | → | 4.6 | ||||||
→ | → | 4.5.2 | |||||||
→ | → | 4.5.1 | |||||||
→ | 4.5 | ||||||||
Universal Windows Platform | uap | → | → | → | → | 10.0 | |||
Windows | win | → | → | 8.1 | |||||
→ | 8.0 | ||||||||
Windows Phone | wpa | → | → | 8.1 | |||||
Windows Phone Silverlight | wp | 8.1 | |||||||
8.0 | |||||||||
Mono/Xamarin Platforms | → | → | → | → | → | → | * | ||
Mono | → | → | * |
NuGet
.NET Platform Standard version mapping
.NET Platform Standard version | NuGet identifier |
---|---|
1.0 - 1.6 | netstandard1.0 - netstandard1.6 |
Specific platform mapping
Platform | NuGet identifier |
---|---|
.NET Framework 2.0 - 4.6 | net20 - net46 |
.NET Core | netcoreapp |
.NET Micro Framework | netmf |
Windows 8 | win8, netcore45 |
Windows 8.1 | win8, netcore451 |
Windows Phone Silverlight (8, 8.1) | wp8, wp81 |
Windows Phone 8.1 | wpa8.1 |
Universal Windows Platform 10 | uap10.0, netcore50 |
Silverlight 4, 5 | sl4, sl5 |
MonoAndroid | monoandroid |
MonoTouch | monotouch |
MonoMac | monomac |
Xamarin iOS | xamarinios |
Xamarin PlayStation 3 | xamarinpsthree |
Xamarin PlayStation 4 | xamarinpsfour |
Xamarin PlayStation Vita | xamarinpsvita |
Xamarin Watch OS | xamarinwatchos |
Xamarin TV OS | xamarintvos |
Xamarin Xbox 360 | xamarinxboxthreesixty |
Xamarin Xbox One | xamarinxboxone |
棄用的包名
Platform | Deprecated NuGet identifier | Current NuGet identifier |
---|---|---|
ASP.NET 5.0 on .NET Framework | aspnet50 | net46 |
ASP.NET 5.0 on .NET Core | aspnetcore50 | netcoreapp1.0 |
DNX on .NET Framework 4.5.1 - 4.6 | dnx451 - dnx46 | net451 - net46 |
DNX on .NET Core 5.0 | dnxcore50 | netcoreapp1.0 |
.NET Standard Application 1.5 | netstandardapp1.5 | netcoreapp1.0 |
.NET Platform 5.1 - 5.6 | dotnet5.1 - dotnet5.6 | netstandard1.0 - netstandard1.5 |
.NET Platform 5.0 | dotnet | netstandard1.3 |
Windows 8 | winrt | win8 or netcore45 |
環(huán)境搭建
windows
最好的方式:
ps:如果已經(jīng)安裝了 vs2015 update3 在安裝.NET Core 1.0.0 - VS 2015 Tooling Preview 2時還是提示沒有安裝update3少孝,
可以使用“SKIP_VSU_CHECK=1”這個參數(shù)忽略vs的檢查。
在命令行使用:DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1
進行安裝熬苍。
其他方式
Linux
可以通過下載源碼編譯安裝稍走,也可以通過包管理器安裝,具體參考
官網(wǎng)教程
Mac
- 安裝Homebrew
- 安裝一些依賴環(huán)境
brew update
brew install openssl
ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/
ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/
- 安裝.Net Core SDK
最好的方式就是下載pkg的包進行安裝
.Net Core SDK
安裝好之后會將工具的路徑加入到PATH中柴底。
裝好環(huán)境后用運行命令 dotnet 進行檢驗
dotnet命令介紹
- dotnet new 初始化一個 .NET項目
- dotnet restore 使用NuGet還原在項目文件project.json 中定義的依賴關系和項目特定的工具婿脸。
注:運行 dotnet 還原生成一個鎖文件 project.json.lock,其中包括有關所有被恢復的軟件包的詳細的信息柄驻。
- dotnet build 生成.NET項目
build命令會把項目和他所依賴的項目編譯成一個二進制文件狐树,默認情況下二進制文件是IL 和.dll 為文件擴展名。編譯過程依賴于已經(jīng)存在鎖文件project.json.lock鸿脓,這是restore命令生成的抑钟。
為了生成一個可執(zhí)行的應用程序涯曲,您需要確保該項目配置的編譯選項設置應用的入口點︰
"buildOptions": {
"emitEntryPoint": true
}
- dotnet run 編譯執(zhí)行一個.NET項目
- dotnet pack 創(chuàng)建一個nuget包
pack命令編譯項目并生成NuGet包,該操作會生成兩個NuGet程序包:
一個包括已編譯代碼的程序集文件
一個包括調(diào)試符號和已編譯代碼的程序集文件
項目依賴的NuGet項目添加到生成nuspec文件中在塔,默認情況不打包項目之間的引用關系幻件,但可以通過更改項目的相關性類型。
- dotnet test 用Test運行工具運行項目中指定的單元測試
- dotnet publish 發(fā)布.NET項目(包括運行時)
發(fā)布命令會編譯應用程序并讀取項目文件蛔溃,
然后將結(jié)果集的文件發(fā)布到一個目錄绰沥。生成目錄的內(nèi)容將取決于項目的類型,但可以包括一個跨平臺的 IL 應用程序和他依賴項贺待,
這就是通常用的Portable部署方式徽曲,
應用程序共享.NET Core運行時環(huán)境與程序集依賴,
部署的目標機器上需要事先安裝.NET Core SDK麸塞,
然后用dotnet命令運行程序秃臣。或者是每個本機平臺的子文件夾或自包含的應用程序喘垂,
其中包括目標平臺的運行時甜刻,這就是Self-contained部署方式绍撞。
Self-contained部署方式就是每個應用程序自帶.NET Core運行時環(huán)境與程序集依賴正勒,
部署的目標機器不需要安裝.NET Core SDK,將應用程序文件夾拷貝過來就能運行傻铣。
默認的project.json編譯出來的應用沒有包括跨平臺章贞,需要修改project.json文件,需要在 project.json 加入 runtimes 節(jié)點 注釋掉 "type": "platform"非洲。
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"dependencies": {"hwapp":"1.0.0"},
"frameworks": {
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"version": "1.0.0"
}
},
"imports": "dnxcore50"
}
},
"runtimes":{
"win7-x64": { },
"win7-x86": { },
"osx.10.10-x64": { },
"osx.10.11-x64": { },
"ubuntu.14.04-x64":{ },
"centos.7-x64":{}
}
}
具體參考文檔參考文檔
.NET Core Application Deployment
project.json文檔
Global.json文檔
具體的用法可以通過
dotnet [new|restore|build|run|pack|publish|test] -h 獲取
IDE推薦
- Visual Studio 2015
- Visual Studio Code
- Project Rider(JetBrains)
Project Rider簡介
Project Rider項目呢是一個新的C#的IDE,它基于IntelliJ和Resharper两踏。
目前的話它打開和識別項目依賴于.sln 和 .xproj 和.csproj文件败京。但是.net core項目使用global.json和project.json文件來描述解決方案和項目。以后的話對于.net core的程序梦染,依賴于global.json和project.json文件識別項目赡麦。
DNX projects use a global.json and project.json files to describe a solution and projects. Rider cannot yet open DNX projects based on these files, and requires a .sln file and all projects to also have a .xproj file. These can be generated by opening the solution in Visual Studio. Rider itself does not use these MSBuild files, but talks directly to the DNX Design Time Host. Future builds will open DNX projects based on global.json and project.json.
根據(jù)最新的消息,.net core 項目組要取消project.json和global.json帕识,重新使用MSBuild和.csproj
News: Project.json for ASP.NET Core is going away
Farewell project.json - hello MSBuild and .csproj (.NET Core)
用dotnet命令 創(chuàng)建一個.netcore控制臺項目
mkdir dotnetcoreapp
cd dotnetcoreapp
dotnet new
dotnet restore
dotnet run
Project dotnetcoreapp (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling dotnetcoreapp for .NETCoreApp,Version=v1.0
Compilation succeeded.
0 Warning(s)
0 Error(s)
Time elapsed 00:00:01.4853106
Hello World!
項目結(jié)構(gòu)如下所示:
├── Program.cs
├── bin
│ └── Debug
│ └── netcoreapp1.0
│ ├── dotnetcoreapp.deps.json
│ ├── dotnetcoreapp.dll
│ ├── dotnetcoreapp.pdb
│ ├── dotnetcoreapp.runtimeconfig.dev.json
│ └── dotnetcoreapp.runtimeconfig.json
├── obj
│ └── Debug
│ └── netcoreapp1.0
│ ├── dotnet-compile-csc.rsp
│ ├── dotnet-compile.assemblyinfo.cs
│ └── dotnet-compile.rsp
├── project.json
└── project.lock.json
用dotnet命令 創(chuàng)建一個.netcore Web項目泛粹,再用vs code進行debug
mkdir dotnetcoreapp
cd dotnetcoreapp
dotnet new -t Web
dotnet restore
dotnet run
Project dotnetcoreapp (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling dotnetcoreapp for .NETCoreApp,Version=v1.0
Compilation succeeded.
0 Warning(s)
0 Error(s)
Time elapsed 00:00:03.9491092
info: Microsoft.Extensions.DependencyInjection.DataProtectionServices[0]
User profile is available. Using '/Users/cjt908/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest.
Hosting environment: Production
Content root path: /Users/cjt908/Desktop/dotnetcoreapp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
-
用vs code 打開項目
當我們第一次打開的時候,會出現(xiàn)缺少debug文件肮疗,點擊yes即可晶姊。
此時會會生成一個隱藏的文件夾,里面有兩個配置文件伪货。
-
修改HomeController里的Index方法们衙,然后斷點調(diào)試钾怔。
提示分兩種,一種是直接啟動web調(diào)試蒙挑,另外一種是附加進程調(diào)試蒂教,跟visual studio里面的類似。
用Project Rider創(chuàng)建一個netcore項目
- 去JetBrains官網(wǎng)填寫一些個人信息脆荷,然后訂閱一下凝垛,就會收到一份郵件,里面有相關下載的鏈接蜓谋,下載好之后進行安裝梦皮。
-
創(chuàng)建項目
-
創(chuàng)建一個.net core 項目
- 在Main方法里輸出Hello World,并且編譯運行桃焕。
但是會報錯剑肯,
Unable to perform Build: Select toolset to perform build
但是我們通過命令去運行的話,是可以正常編譯的观堂。
這是因為目前Rider不能基于global.json和project.json識別項目让网。
我們需要MSBuild或者XBuild來編譯項目。
注:因為微軟棄用global.json和project.json师痕,所以這個計劃應該不會再繼續(xù)執(zhí)行溃睹。
最簡單的解決方案,就是下載mono胰坟,安裝包里自帶里MSBuild因篇,不怕麻煩的話也可以去github下載編譯。
用visual studio 2015 創(chuàng)建一個簡單的.netcore項目
這個難度最低笔横,和平時操作無多大區(qū)別竞滓。
引用
.netcore開源
.net core 英文文檔
Project Rider EAP 入門指南