β

一文看懂.NET的各种变体

程序师 11 阅读

曾几何时,我们只有一个.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上运行的库,并在面向特定平台的组件中隔离面向特定平台的部分,例如用户界面。

作者:程序师
用程序师的眼光看世界
原文地址:一文看懂.NET的各种变体, 感谢原作者分享。

发表评论