不同平台的.NET 开发者已经有了通用的开发工具:VS Code、Mac 版 Visual Studio 和 Windows 版 Visual Studio。
.NET Standard 为开发者提供了特定.NET 平台的 API 指南。
.NET Core 开发者可以选择 macOS、Linux、Windows 或三种兼而有之。
.NET Core 是开源的,由微软公开开发。
.NET Framework 仍然是微软在背后支持,主要面向专门针对 Windows 平台开发的开发者。
曾几何时,我们只有一个.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 实现,其他所有.NET 都来自它。无论是支持的 API 数量还是下载量,它都是.NET 中最大的一个。多年来,.NET Framework 发布了很多版本,每个版本都增加了新的 API 和功能。.NET Framework 由微软开发和支持,并且只能在 Windows 上运行。
如果你的应用程序只在 Windows 上运行,那么就应该使用.NET Framework。由于它支持的 API 数量最多,因此如果选择了.NET Framework,就无需担心是否可以轻松完成一些复杂的任务。不过,如果你希望应用程序从一开始就在 Windows 以外的平台上运行,或者希望将来在非 Windows 平台上运行应用程序,那么就要考虑使用不同的.NET 类型。
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 实现,由微软领衔。它支持 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 变种。与.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 上运行的库,并在面向特定平台的组件中隔离面向特定平台的部分,例如用户界面。
https://www.infoq.com/articles/varieties-dotnet