引言
最近, 微软刚刚发布.net core 2.0, dotnet世界有了一个新的开始. 但是这里有一些疑问,
- .net core是不是dotnet的下一个版本? 无论如何asp.net 5直接就变成了asp.net core.
- 微软是不是会放弃framework? 还有xamarin是不是会被core替代?
- 如果我现在用dotnet开发, 应该选用core,还是framework,抑或Xamarin?
抱着这样的疑问, 我仔细探究了一下dotnet目前的生态系统,希望对大家有点帮助.
dotnet的生态化反图
经过多年的努力,在推出Core以后, 微软终于做到了当初的承诺, 一次编写到处运行了. 目前dotnet应该仅次于javascript了, 除了浏览器, dotnet应该都可以运行了.
从上图, 可以很简单的发现, .Net体系分为三大块,
- 底层支持平台,包括编译器,运行时及CSharp/FSharp/VB.Net等
- 标准类库,统一大部分通用的API
- 应用模型, 适用于不同的操作系统
通过这张图, 我们可以很清楚的看出.Net Framework, .Net Core, Xamarin, 他们是平行的框架,不是互相取代的关系.
- .NET Framework将继续在windows世界发力, 重点会在Desktop UI应用方面
- .NET Core会在UWP及后端应用(Back-End)发力,适应现在Linux服务器满天飞的现状.
- Xamarin 会继续在移动平台发力,作为一个快速App的工具
dotnet standard
.Net Standard是新推出来用以替代Portable, Standard和Portable之间,按照我的理解是替代关系, 将来Portable将慢慢消亡. Portable和Standard的关系如下表:
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, 而更多是一个标准, 不同的standard版本其实是对应的不同的API集合. 当然,版本号越小,支持的API越少. 但是支持的API越少,就意味着可以在更多的平台上运行. 我们开发的功能性类库应该都是Standard的,而且如果可能,应该使用小版本
如dotnet生态图的Base Libraries层可以看出, .Net标准库更像一个垫片层(Adaper设计模式),用来调用具体平台相关的实现库, 比如在windows平台就调用.Net Framework 类库, 在Linux上就调用CoreFx类库,而在移动平台则调用Mono类库.
standard和framework/core/xamarin之间的关系
.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平台,用于创建运行在任何地方(Windows,Linux和MacOS)的现代Web应用程序,微服务器,库和控制台应用程序。它更多的是为后端应用(back-end)准备的,所以core其实和asp.net core捆绑很紧密. 当然core还可以编写命令行程序, 也就是说我们在linux开发一些工具可以选择C#了. 这是一个很好选项. :-).
当然core还可以开发UWP的应用,对于UWP不太熟,好像发展的也不咋的.
- core和原来的framework一个很大的区别是core所用的类库可以单独打包,并且可以把所有依赖项打包在一起, 发布core的应用可以不要求目标系统安装有dotnet的运行时了,非常方便发布了,而且发布包可以很小.
- core和docker生态捆绑紧密,作为微服务开发的一个很好的选择
Core是一个.Net everywahre的唯一平台,有了core, CSharp经验终于可以应用于大部分开发工作了!
xamarin
Xamarin可以开发原生的Android,iOS,MacOS和Windows应用程序(这个还是用wpf/winform更方便)。
Xamarin平台基于Mono(Mono是来自社区Mono Project的.NET的原始开源和跨平台实现。)
传统上,Mono的API遵循.NET Framework的进展,而不是.NET Core。
除了跨平台的移动设备,使用Xamarin创建的应用程序本身提供与使用Objective-C / Swift / for iOS或Java for Android创建的应用程序相似的性能以及还有更大的体积:-( 。
Xamarin提供以下总结功能:
本地用户界面 - Xamarin应用程序是使用标准的本地用户界面控件构建的。
应用程序不仅看起来终端用户期望的方式;
他们也是这样做的。
本机API访问 - Xamarin应用程序可以访问底层平台和设备公开的全部功能,包括平台特定功能(如iBeacons和Android Fragments)。
本机性能 - Xamarin应用程序利用特定于平台的硬件加速,并针对本机性能进行编译。
在运行时解释代码的解决方案无法实现这一点。
生产力 -使用Xamarin.Forms开发人员可以使用与iOS,Android和Windows 10 UWP相同的逻辑和UI。
在Xamarin的图中,您可以看到如何在Xamarin.iOS,Xamarin.Android甚至Windows 10的UWP项目之间的平台上共享客户端代码(通常是C#应用程序逻辑,如ViewModels,Models,Service Agents等)。
如果使用Xamarin.Forms,您还可以在平台之间共享相同的UI代码(Xamarin XAML定义页面/视图)。
注意:使用Xamarin,您还可以开发Mac(MacOS)应用程序,但图中没有表示,因为Xamarin的主要目的是“跨平台移动”。
dotnet framework
NET Framework是一个非常强大而成熟的框架,拥有一个庞大的类库(称为.NET Framework Class Library),可在Windows上支持各种各样的应用程序和解决方案。为您现有的应用程序和库提供了最高级别的兼容性。
它作为Windows操作系统的一部分运行,因此在新版本可用时或通过可选的独立安装程序通过Windows Update进行服务。当与Windows一起运送时,Windows 8附带4.5,Windows 8.1附带4.5.1,Windows 10附带4.6。对于服务器,Windows Server 2012附带4.5,Windows Server 2012 R2附带4.5.1。
自2002年发布以来,.NET Framework得到了开发人员的广泛支持,开发人员喜欢其一致的编程模型,易于使用Visual Studio入门的环境,调试和分析工具以及Microsoft的直接支持。它还使应用程序部署和维护直截了当。不过由于windows在服务器端的弱势, 现在.net其实一直在走下坡路.
在.NET Framework之上建立了多个应用程序堆栈,允许开发人员构建从控制台应用程序到富客户机(WPF)应用程序到可扩展Web应用程序的应用程序.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的代码是开源的,但只是部分开源,社区不活跃..NET Framework将继续发展,当下一版本的Windows操作系统发布时,通过发送新的更新.
.net framework始终是构建Windows桌面应用程序的最好已经最快的开发框架!
总结
回到开头的三个问题, 答案应该非常清楚了:
- .Net Framework, .Net Core, Xamarin是三个基于dotnet的三个不同开发框架应用于不同场景, 他们可以通过.Net Standard共享代码.
- 微软是不会放弃framework的,除非微软放弃windows :-)
- 我们应该根据具体的开发场景选择不同的开发框架, 具体我的建议是:
- 所有的类库应该尽可能使用.net standard,以便在各个平台共享逻辑代码
- 后端代码(backend)因尽可能选择.Net Core, 特别是asp.net应该转换到asp.net core
- windows的桌面应用应该选择framework(UWP还是觉得不靠谱),特别是wpf,是开发桌面应用的一个好选择.
- 移动端的快速原型应该选用xamarin.
- 工具类的应用应该选择.net core
以上是我的个人见解,欢迎大家提出不同看法.
参考文献: https://blogs.msdn.microsoft.com/cesardelatorre/2016/06/27/net-core-1-0-net-framework-xamarin-the-whatand-when-to-use-it/