一文看懂.NET的各种变体
曾几何时,我们只有一个.NET,叫作.NET Framework。如果想要开发.NET应用程序,只要使用.NET Framework即可,非常简单。几年之后,出现了.NET变种的寒武纪大爆发(我们称之为“.NET大爆炸”):.NET Framework Client Profile、.NET Compact Framework、.NET Micro Framework、Windows Runtime、Universal Windows Platform、Mono、Xamarin、.NET Core和.NET Standard。就像来自寒武纪大爆发的有机体一样,.NET的很多变种最终都已经灭绝:它们不再被支持或不再被更新。有些变种只有一点点的立足之地,被用在非常专业化的领域。还有一些变种(“.NET幸存者”)蓬勃发展,目前正在发展壮大,因为一些特定的原因和用途。本文的目标不是要深入到各种.NET的技术细节中,关于技术细节已经有大量的技术资源可参考。相反,本文的目的是澄清一个简单的问题:在特定情况下应该使用哪种.NET?
.NET Framework
.NET Framework是最初的.NET实现,其他所有.NET都来自它。无论是支持的API数量还是下载量,它都是.NET中最大的一个。多年来,.NET Framework发布了很多版本,每个版本都增加了新的API和功能。.NET Framework由微软开发和支持,并且只能在Windows上运行。
如果你的应用程序只在Windows上运行,那么就应该使用.NET Framework。由于它支持的API数量最多,因此如果选择了.NET Framework,就无需担心是否可以轻松完成一些复杂的任务。不过,如果你希望应用程序从一开始就在Windows以外的平台上运行,或者希望将来在非Windows平台上运行应用程序,那么就要考虑使用不同的.NET类型。
Mono
Mono是.NET的一个开放源代码实现,旨在与.NET Framework兼容,但可以在不同的平台上运行,包括Windows、MacOS和Linux。该项目由爱好者创建,并由Miguel de Icaza领导,他相信.NET的优势也应该被移植到除Windows之外的平台上,而实现这一目标的最佳方式就是开源。Mono的管理权随着de Icaza从一家公司迁移到另一家公司:从Ximian到Novell,再到Xamarin,最后到了微软。
Mono覆盖到的.NET API并不完整,但已经很好了。从.NET Framework移植到Mono非常简单,即使是在API覆盖不到位的情况下,也有相对简单的解决方法。
Mono仍然是跨平台.NET的可行之选,尽管微软似乎将大部分跨平台.NET工作转移到了.NET Core中。所以如果你对.NET的未来有所期待,应该要考虑到这一点。此外,Xamarin/微软现在似乎将他们Mono的大部分工作集中在Xamarin平台和支持iOS和Android上,尽管Mono对桌面和服务器平台的支持似乎也很活跃。总之,如果你有一个运行在Windows上的.NET Framework应用程序,并且希望你的应用程序支持Windows、macOS、Linux、BSD等平台,但只想花费很少的精力来转换你的应用程序,那么Mono可能是你最好的选择。
.NET Core
.NET Core是另一个开源的跨平台.NET实现,由微软领衔。它支持Windows、MacOS和Linux。最初,.NET Core是一个轻量级的实现:强大到足以支持ASP.NET和控制台应用程序,但又不会太过。后来,它扩展到可以支持Windows、macOS和Linux上的API子集,但不支持Windows特有的注册表等东西。在这一点上,API的覆盖范围似乎已经进一步扩大了,所以它几乎就像.NET Framework的翻版,尽可能完整地支持多个平台,同时避免支持微软似乎不再需要的API(如.NET Remoting)。像Windows Forms和WPF这样的UI API也不受支持(微软已经宣布下一个版本的.NET Core将支持桌面应用程序编程,包括Windows Forms和WPF,但这只适用于Windows上运行应用程序)。
由于.NET Core似乎是跨平台.NET的未来,如果你正在开发在Windows、MacOS或Linux上运行的应用程序,而且不是非Web界面(Windows Forms和WPF不可用),那么我建议使用.NET Core。它可能没有.NET Framework那么多的API,但如果你从头开始开发应用程序,则可以考虑使用这种占用较小空间的API。但是,如果你想让现有的.NET Framework支持跨平台,迁移到.NET Core可能会是一个沉重的负担,因为它可能不支持一些关键API。请注意,微软试图通过Windows兼容包等产品来缓解这种情况,Windows兼容包为.NET Core中的Windows特定API提供支持。但是,如果你使用了这些API,则仍然被锁定在Windows中,至少在.NET Core提供这些API之前是这样的,或者可以通过重写代码移除对它们的依赖。
.NET Standard
.NET Standard是另一个支持跨平台的.NET变种。与.NET Framework、Mono和.NET Core不同,它不是一个包含运行时和库的完整软件包。相反,它是一个API规范,.NET的实现需要基于这一规范——特别是.NET Framework、.NET Core和Xamarin(微软支持的面向iOS、Android和macOS的Mono分支)。目的是让基于.NET Standard实现的库可以在任意.NET平台应用程序中运行。.NET Standard仅支持库,而不是应用程序,所以可以用它开发可在任何地方运行的库。
最新版本的.NET Standard 2.0覆盖了更广的API,但仍有大量缺失。它几乎涵盖了.NET Core,但缺失了相当数量的.NET Framework API。当然,你没有理由非要使用那些缺少的API,但如果你选择了.NET Framework,而不是.NET Standard,那么在移除那些API依赖之前,你会锁定在.NET Framework上。
如果你正在开发一组新库,我会建议你选择.NET Standard。这样,你的库就可以运行在.NET Framework、.NET Core或Xamarin上,而不需要做额外的工作。当然,你一定会创建针对特定.NET变体的应用程序,但如果应用程序足够小,而且包含.NET Standard不支持的GUI类,并且将大部分功能都放在共享库中,那么应该能够最大程度地获得跨平台好处。由于缺乏某些API,迁移现有的.NET Framework代码可能会涉及更多工作,但即使是这样,仍然可以将尽可能多的代码迁移到.NET Standard库,并隔离平台特定代码。在跨平台场景中可能会用到你的.NET Standard库,并且随着时间的推移,你可以花费额外的精力将其余代码迁移到.NET Standard。
关于工具的简要说明
一直以来,每个.NET变体都有自己的专用开发工具。Visual Studio用于.NET Framework开发,MonoDevelop用于Mono开发,Visual Studio Code主要用于.NET Core开发。到了最近,这些界限开始渐渐模糊。除.NET Framework之外,现在可以使用Visual Studio开发Xamarin、.NET Core和.NET Standard。Visual Studio Code最初是一个源代码编辑器,但现在已经成为一个更加完整的开发环境,可用于开发.NET Framework或.NET Core。Xamarin Studio(基于MonoDevelop)已被Windows(他们推荐使用Visual Studio)弃用,现在变成Visual Studio for Mac,可用于开发Xamarin或.NET Core。因此,除非你正在开发.NET Framework(在这种情况下应该使用Visual Studio),否则可以根据其他需求选择合适的环境。
结论
.NET“大爆炸”产生了很多.NET变体,其中一些已经消亡,其他一些则占据了非常狭小的市场空间,另一些正在蓬勃发展。蓬勃发展的.NET变种之间的相似性足以让开发者感到困惑,并且不确定要使用哪一个,但其实在它们之间做出选择很简单。如果你要创建一个只能在Windows上运行的应用程序,请使用原始的.NET Framework。如果你希望应用程序能够在多个平台上运行,并且需要接近完整的.NET Framework API,请使用Mono。如果将现有的.NET Framework应用程序迁移到Windows以外的其他平台,Mono也是一个很好的选择。如果你创建的跨平台应用程序可以使用.NET Core提供的不完整API,那么可以考虑.NET Core。最后,可以考虑使用.NET Standard创建可在.NET Framework、.NET Core或Xamarin上运行的库,并在面向特定平台的组件中隔离面向特定平台的部分,例如用户界面。
本文文字及图片出自 InfoQ
你也许感兴趣的:
- 【外评】Ubuntu 24.04 中 .NET 的新功能
- 【外评】使用 .NET Core 开发软件的 9 大优势
- 【译论】是 .net 遥遥领先,还是我有幻觉?
- 开发者阵营分化,.NET 开源生态系统如何走向未来?
- .NET 8.0中有哪些新的变化?
- Csharp 不停止膨胀,必将走向灭亡
- 押注.NET 是件好事
- .NET 从昨日辉煌到如今逐渐没落
- .NET Core 2.2 正式发布,有你喜欢的特性吗?
- 关于.NET Core是否应该支持WCF Hosting的争论
你对本文的反应是: