引言
最近, 微軟剛剛發(fā)布.net core 2.0, dotnet世界有了一個新的開始. 但是這里有一些疑問,
- .net core是不是dotnet的下一個版本? 無論如何asp.net 5直接就變成了asp.net core.
- 微軟是不是會放棄framework? 還有xamarin是不是會被core替代?
- 如果我現(xiàn)在用dotnet開發(fā), 應(yīng)該選用core,還是framework,抑或Xamarin?
抱著這樣的疑問, 我仔細探究了一下dotnet目前的生態(tài)系統(tǒng),希望對大家有點幫助.
dotnet的生態(tài)化反圖
經(jīng)過多年的努力,在推出Core以后, 微軟終于做到了當(dāng)初的承諾, 一次編寫到處運行了. 目前dotnet應(yīng)該僅次于javascript了, 除了瀏覽器, dotnet應(yīng)該都可以運行了.
從上圖, 可以很簡單的發(fā)現(xiàn), .Net體系分為三大塊,
- 底層支持平臺,包括編譯器,運行時及CSharp/FSharp/VB.Net等
- 標(biāo)準類庫,統(tǒng)一大部分通用的API
- 應(yīng)用模型, 適用于不同的操作系統(tǒng)
通過這張圖, 我們可以很清楚的看出.Net Framework, .Net Core, Xamarin, 他們是平行的框架,不是互相取代的關(guān)系.
- .NET Framework將繼續(xù)在windows世界發(fā)力, 重點會在Desktop UI應(yīng)用方面
- .NET Core會在UWP及后端應(yīng)用(Back-End)發(fā)力,適應(yīng)現(xiàn)在Linux服務(wù)器滿天飛的現(xiàn)狀.
- Xamarin 會繼續(xù)在移動平臺發(fā)力,作為一個快速App的工具
dotnet standard
.Net Standard是新推出來用以替代Portable, Standard和Portable之間,按照我的理解是替代關(guān)系, 將來Portable將慢慢消亡. Portable和Standard的關(guān)系如下表:
PCL Profile | .NET Standard | PCL Platforms |
---|---|---|
Profile7 | 1.1 | .NET Framework 4.5, Windows 8 |
Profile31 | 1.0 | Windows 8.1, Windows Phone Silverlight 8.1 |
Profile32 | 1.2 | Windows 8.1, Windows Phone 8.1 |
Profile44 | 1.2 | .NET Framework 4.5.1, Windows 8.1 |
Profile49 | 1.0 | .NET Framework 4.5, Windows Phone Silverlight 8 |
Profile78 | 1.0 | .NET Framework 4.5, Windows 8, Windows Phone Silverlight 8 |
Profile84 | 1.0 | Windows Phone 8.1, Windows Phone Silverlight 8.1 |
Profile111 | 1.1 | .NET Framework 4.5, Windows 8, Windows Phone 8.1 |
Profile151 | 1.2 | .NET Framework 4.5.1, Windows 8.1, Windows Phone 8.1 |
Profile157 | 1.0 | Windows 8.1, Windows Phone 8.1, Windows Phone Silverlight 8.1 |
Profile259 | 1.0 | .NET Framework 4.5, Windows 8, Windows Phone 8.1, Windows Phone Silverlight 8 |
有一點需要特別說明, standard并不算一個libarary, 而更多是一個標(biāo)準, 不同的standard版本其實是對應(yīng)的不同的API集合. 當(dāng)然,版本號越小,支持的API越少. 但是支持的API越少,就意味著可以在更多的平臺上運行. 我們開發(fā)的功能性類庫應(yīng)該都是Standard的,而且如果可能,應(yīng)該使用小版本
如dotnet生態(tài)圖的Base Libraries層可以看出, .Net標(biāo)準庫更像一個墊片層(Adaper設(shè)計模式),用來調(diào)用具體平臺相關(guān)的實現(xiàn)庫, 比如在windows平臺就調(diào)用.Net Framework 類庫, 在Linux上就調(diào)用CoreFx類庫,而在移動平臺則調(diào)用Mono類庫.
standard和framework/core/xamarin之間的關(guān)系
.NET Standard | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 2.0 |
---|---|---|---|---|---|---|---|---|
.NET Core | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 2.0 |
.NET Framework (with .NET Core 1.x SDK) | 4.5 | 4.5 | 4.5.1 | 4.6 | 4.6.1 | 4.6.2 | ||
.NET Framework (with .NET Core 2.0 SDK) | 4.5 | 4.5 | 4.5.1 | 4.6 | 4.6.1 | 4.6.1 | 4.6.1 | 4.6.1 |
Mono | 4.6 | 4.6 | 4.6 | 4.6 | 4.6 | 4.6 | 4.6 | 5.4 |
Xamarin.iOS | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | 10.14 |
Xamarin.Mac | 3.0 | 3.0 | 3.0 | 3.0 | 3.0 | 3.0 | 3.0 | 3.8 |
Xamarin.Android | 7.0 | 7.0 | 7.0 | 7.0 | 7.0 | 7.0 | 7.0 | 7.5 |
Universal Windows Platform | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | vNext | vNext | vNext |
Windows | 8.0 | 8.0 | 8.1 | |||||
Windows Phone | 8.1 | 8.1 | 8.1 | |||||
Windows Phone Silverlight | 8.0 |
dotnet core
.NET Core是一個新版本的.NET轻庆,它是一個跨平臺鸽心,開源和模塊化的.NET平臺虹统,用于創(chuàng)建運行在任何地方(Windows璧亚,Linux和MacOS)的現(xiàn)代Web應(yīng)用程序望蜡,微服務(wù)器,庫和控制臺應(yīng)用程序臼膏。它更多的是為后端應(yīng)用(back-end)準備的,所以core其實和asp.net core捆綁很緊密. 當(dāng)然core還可以編寫命令行程序, 也就是說我們在linux開發(fā)一些工具可以選擇C#了. 這是一個很好選項. :-).
當(dāng)然core還可以開發(fā)UWP的應(yīng)用,對于UWP不太熟,好像發(fā)展的也不咋的.
- core和原來的framework一個很大的區(qū)別是core所用的類庫可以單獨打包,并且可以把所有依賴項打包在一起, 發(fā)布core的應(yīng)用可以不要求目標(biāo)系統(tǒng)安裝有dotnet的運行時了,非常方便發(fā)布了,而且發(fā)布包可以很小.
- core和docker生態(tài)捆綁緊密,作為微服務(wù)開發(fā)的一個很好的選擇
Core是一個.Net everywahre的唯一平臺,有了core, CSharp經(jīng)驗終于可以應(yīng)用于大部分開發(fā)工作了!
xamarin
Xamarin可以開發(fā)原生的Android直奋,iOS,MacOS和Windows應(yīng)用程序(這個還是用wpf/winform更方便)九杂。
Xamarin平臺基于Mono(Mono是來自社區(qū)Mono Project的.NET的原始開源和跨平臺實現(xiàn)颁湖。)
傳統(tǒng)上,Mono的API遵循.NET Framework的進展例隆,而不是.NET Core甥捺。
除了跨平臺的移動設(shè)備,使用Xamarin創(chuàng)建的應(yīng)用程序本身提供與使用Objective-C / Swift / for iOS或Java for Android創(chuàng)建的應(yīng)用程序相似的性能以及還有更大的體積:-( 镀层。
Xamarin提供以下總結(jié)功能:
本地用戶界面 - Xamarin應(yīng)用程序是使用標(biāo)準的本地用戶界面控件構(gòu)建的镰禾。
應(yīng)用程序不僅看起來終端用戶期望的方式;
他們也是這樣做的。
本機API訪問 - Xamarin應(yīng)用程序可以訪問底層平臺和設(shè)備公開的全部功能唱逢,包括平臺特定功能(如iBeacons和Android Fragments)吴侦。
本機性能 - Xamarin應(yīng)用程序利用特定于平臺的硬件加速,并針對本機性能進行編譯坞古。
在運行時解釋代碼的解決方案無法實現(xiàn)這一點备韧。
生產(chǎn)力 -使用Xamarin.Forms開發(fā)人員可以使用與iOS,Android和Windows 10 UWP相同的邏輯和UI痪枫。
在Xamarin的圖中织堂,您可以看到如何在Xamarin.iOS,Xamarin.Android甚至Windows 10的UWP項目之間的平臺上共享客戶端代碼(通常是C#應(yīng)用程序邏輯奶陈,如ViewModels易阳,Models,Service Agents等)吃粒。
如果使用Xamarin.Forms潦俺,您還可以在平臺之間共享相同的UI代碼(Xamarin XAML定義頁面/視圖)。
注意:使用Xamarin徐勃,您還可以開發(fā)Mac(MacOS)應(yīng)用程序事示,但圖中沒有表示,因為Xamarin的主要目的是“跨平臺移動”疏旨。
dotnet framework
NET Framework是一個非常強大而成熟的框架很魂,擁有一個龐大的類庫(稱為.NET Framework Class Library)扎酷,可在Windows上支持各種各樣的應(yīng)用程序和解決方案檐涝。為您現(xiàn)有的應(yīng)用程序和庫提供了最高級別的兼容性。
它作為Windows操作系統(tǒng)的一部分運行,因此在新版本可用時或通過可選的獨立安裝程序通過Windows Update進行服務(wù)谁榜。當(dāng)與Windows一起運送時幅聘,Windows 8附帶4.5,Windows 8.1附帶4.5.1窃植,Windows 10附帶4.6帝蒿。對于服務(wù)器,Windows Server 2012附帶4.5巷怜,Windows Server 2012 R2附帶4.5.1葛超。
自2002年發(fā)布以來,.NET Framework得到了開發(fā)人員的廣泛支持延塑,開發(fā)人員喜歡其一致的編程模型绣张,易于使用Visual Studio入門的環(huán)境,調(diào)試和分析工具以及Microsoft的直接支持关带。它還使應(yīng)用程序部署和維護直截了當(dāng)侥涵。不過由于windows在服務(wù)器端的弱勢, 現(xiàn)在.net其實一直在走下坡路.
在.NET Framework之上建立了多個應(yīng)用程序堆棧,允許開發(fā)人員構(gòu)建從控制臺應(yīng)用程序到富客戶機(WPF)應(yīng)用程序到可擴展Web應(yīng)用程序的應(yīng)用程序.Windows Forms宋雏,Windows Presentation Foundation(WPF)芜飘,Windows Communication Foundation (WCF),ASP.NET到v4.x磨总,ASP.NET Web窗體嗦明,ASP.NET MVC, ASP.NET WebAPI蚪燕,SignalR等幾個子框架招狸。
雖然.NET Framework的代碼是開源的,但只是部分開源,社區(qū)不活躍..NET Framework將繼續(xù)發(fā)展,當(dāng)下一版本的Windows操作系統(tǒng)發(fā)布時邻薯,通過發(fā)送新的更新.
.net framework始終是構(gòu)建Windows桌面應(yīng)用程序的最好已經(jīng)最快的開發(fā)框架!
總結(jié)
回到開頭的三個問題, 答案應(yīng)該非常清楚了:
- .Net Framework, .Net Core, Xamarin是三個基于dotnet的三個不同開發(fā)框架應(yīng)用于不同場景, 他們可以通過.Net Standard共享代碼.
- 微軟是不會放棄framework的,除非微軟放棄windows :-)
- 我們應(yīng)該根據(jù)具體的開發(fā)場景選擇不同的開發(fā)框架, 具體我的建議是:
- 所有的類庫應(yīng)該盡可能使用.net standard,以便在各個平臺共享邏輯代碼
- 后端代碼(backend)因盡可能選擇.Net Core, 特別是asp.net應(yīng)該轉(zhuǎn)換到asp.net core
- windows的桌面應(yīng)用應(yīng)該選擇framework(UWP還是覺得不靠譜),特別是wpf,是開發(fā)桌面應(yīng)用的一個好選擇.
- 移動端的快速原型應(yīng)該選用xamarin.
- 工具類的應(yīng)用應(yīng)該選擇.net core
以上是我的個人見解,歡迎大家提出不同看法.