关于.NET生态,你了解多少?

译文
开发 前端
本文将系统性地向您介绍.NET生态中.NET Framework、.NET Core和Mono For Xamarin三大运行时的各种特点、用途与工具,并展望.NET生态的发展。

【51CTO.com快译】如果您是一名开发人员,那么一定听说过.NET技术吧。它是由Microsoft创建的开源式开发人员平台,可用于构建诸如:Web、移动、桌面、游戏等许多不同类型的应用。通常,它由不同的工具、编程语言和库所组成。其中,.NET Framework是.NET生态系统中最受欢迎的技术之一。近年来,.NET Core和.NET Standard Library(标准库)也在该生态系统中相继出现。面对这么多的技术栈,我们该如何选择呢?下面,我们将深入探讨它们的各种特点、用途与对应工具。首先,我们从.NET的简史开始。

.NET的发展历史

在九十年代,Microsoft开始致力于开发名为.NET Strategy的产品。该策略涵盖了所有的Microsoft产品线。在2000年,.NET框架被命名为下一代Windows服务(NGWS)。.NET框架的第一个beta版发布于2000年末,而.NET 1.0的第一版是在2002年2月13日发布的。下面是其后续版本及其特点:

  • .NET Framework 2.0(2005年11月):包含通用集合、迭代器、以及可为空的类型。
  • .NET Framework 3.0(2006年11月):包含WPF、WCF和WWF。
  • .NET Framework 3.5(2007年11月):包含AJAX、LINQ、ASP.NET MVC。
  • .NET Framework 4.0(2010年4月):包含MEF、DLR、任务并行库、Razor视图引擎、新的C#/VB语言功能。
  • .NET Framework 4.5(2012年8月):支持异步与zip压缩。
  • .NET Core 1.0(2014年11月):包括对跨平台的支持、ASP.NET 5和.NET Native。
  • .NET Core 2.0(2017年8月):具有重大的性能改进,并实现了.NET Standard 2.0。
  • .NET Framework 4.8(2019年4月):包括JIT增强功能,针对WPF应用的High DPI增强功能,可访问性的改进,性能更新,以及安全性增强。
  • .NET Core 3.0(2019年9月):提供C#8.0的新功能,实现了.NET Standard 2.1。让Windows桌面支持Windows Forms和WPF。

.NET生态系统概述

目前,包含不同运行时(runtime)的.NET生态系统,由Microsoft开发平台中的如下组件构成:

  • .NET Framework(WPF、Windows Forms、ASP.NET)是以Windows为中心。
  • .NET Core(ASP.NET Core、Universal Windows Platform)是跨平台工具,可与其他版本并行使用。
  • Mono For Xamarin(IOS、OS X、Android)同样可以跨平台。

上述三大运行时都实现了.NET Standard Library,同时它们也是.NET API的规范。因此,为某个运行时创建的代码,同样可以被其他运行时所执行。而且所有运行时都使用工具和基础架构来编译和运行代码。其中涉及到的语言有C#和Visual Basic,编译器有Roslyn,还有垃圾回收,以及诸如MS Build或(Core)CLR之类的构建工具。

下面,我们将重点讨论.NET的三大主要运行时:

.NET Framework

.NET Framework是用于在Windows上构建和运行应用程序的软件开发框架。目前,它部分开源(请参见--https://github.com/microsoft/referencesource)。.NET Framework是由公共语言运行库(Common Language Runtime,CLR)、. NET Framework类库和应用负载(WPF、Windows Forms和ASP.NET)所组成。其中,CLR是通用基础架构的一部分,既可以运行代码,又可以执行JIT(just-in-time)、以及垃圾回收(C#、VB.NET、F#)等。

由CLR管理的代码被称为托管代码。这些代码被编译为通用中间语言(Common Intermediate Language,CIL),并存储在扩展名为.exe或.dll的程序集中。当应用程序运行时,CLR会执行汇编,并使用JIT编译器将机器代码转换为可以在特定计算架构上运行的代码。

.NET Framework库包含各种功能的类、接口和数据类型(如:字符串、文件系统支持等)。它允许用户创建不同类型的应用程序,例如:控制台应用、Windows Form、Windows Communication Foundation(WCF)、Windows Workflow Foundation(WF)、Windows Presentation Foundation(WPF)、ASP.NET应用(如:各种表单、Web API)、以及Azure应用(如:WebJobs、Cloud Services)。不过其中大多数都仅限于Windows平台,并使用Windows API。

虽然Windows已经预安装了其中的某些版本,但是如果您要运行并使用由.NET Framework生成的应用的话,仍需要事先完成相应的安装。.NET Framework通常被安装在C:\Windows\Microsoft.NET\Framework(或Framework64)上。该文件夹内包含了所有已安装的主要版本。

.NET Core

作为.NET生态系统中的一种运行时,.NET Core于2016年被发布并开源(请参见--https://github.com/dotnet/core)。它并非.NET Framework的新版本,也不会替代.NET Framework,而是被独立地构建出来,旨在跨平台进行应用程序的开发。.NET Core由可运行CLR和Library的App Host(dotnet.exe)所组成。它拥有公共语言运行时(CoreCLR)和.NET Core Class Library。

CoreCLR使用JIT Compilation和垃圾回收来运行代码。它支持C#、VB.NET和F#。作为.NET Framework库的子集,.NET Core Class Library包括并提供不同的功能类。它支持不同类型的应用负载,包括:ASP.NET Core(如:MVC和API)、各种控制台应用,以及UWP。其中,UWP为所有在Windows 10上运行的设备,提供了通用类型的系统、API和应用模型。从.NET Core 3.0 SDK开始,它能够支持包括Windows Forms Designer在内的各种Windows Forms应用。

.NET Core可以运行在不同的平台上,其中包括:Windows客户端、服务器端、物联网、Linux、Ubnutu、FreeBSD、Tizen、Mac OSX等。.NET Core通常被安装在C:\Program Files\dotnet\shared\Microsoft.NETCore.App[versions]中。并且,它可以根据机器或用户的不同,实现多版本的并行安装。

此外,由于.NET Core能够将应用打包到.exe文件中,因此它可以创建一个自包含的版本,而无需在主机上安装.NET Core。例如,您可以运行shell命令“dotnet publish -r linux-x64 --self-contained true”。当然,其缺点是会导致部署的体量变大。

Mono For Xamarin

Mono是.NET Framework运行时的一个克隆。您可以在https://github.com/mono/monowww.mono-project.com处查看到它的源代码。微软于2016年收购了Xamarin,并使其成为.NET平台的完全开源分支。目前,它是由Mono运行时和Xamarin Class Library所组成,可以运行IOS、OS X和Android等应用负载。

与.NET Core相似,Mono包含垃圾回收、JIT、AOT、以及对C#(并非VB.NET和F#)的完全支持。与C++代码相似,Mono AOT编译器能够将.NET代码内置到可以在单机上运行的可执行文件中。同时,Mono For Xamarin具有一个支持创建应用程序(可用于I/O、集合等)的类库。

Mono For Xamarin可以被用来运行Apple IOS、MAC OS X、Android等应用负载,而且可以在这些平台之间共享代码,以作为原生应用。每个应用程序都可以与Mono运行时、以及一个类库捆绑在一起,而无需在设备上额外安装Mono。

其他框架

.NET Compact Framework和.NET Micro Framework

.NET Compact Framework和.NET Micro Framework两种框架都是通过精简​​运行时,运行在受限制的设备(如:PDA、移动电话控制器等)上。其中,.NET Micro Framework针对的是256KB闪存和64KB内存。

Silverlight

于2007年发布的Silverlight是一种流行的跨平台.NET技术。它能够为浏览器构建诸如:播放与下载视频,创建丰富的UI和动画等富媒体体验。不过,Microsoft已决定于2021年10月停止支持Silverlight。

社区项目

除了Microsoft官方提供的运行时,开发者社区也提供了诸如:DotGNU Portable.NETDotNetAnywhereCosmosOSCrossNet.NET等运行时。它们的构建方式略有不同。

.NET Standard

无论是.NET Framework、.NET Core还是Xamarin,不同的运行时会使用各自不同的类库。而由于它们使用的是不同API,因此不同的运行时无法彼此共享代码。为此,Microsoft于2016年发布了.NET Standard Library。它通过一组正式的规范,说明了各个运行时都能够使用和实现的API。而特定的运行时也能够实现特定版本的.NET Standard。例如:.NET Framework 4.6.1就能够实现.NET Standard 2.0。同时,它也是Portable Class Libraries(PCL)的一种发展方向。

.NET Standard和Portable Class Libraries (即,可在不同平台上使用的库)之间的区别是:

  • .NET Standard代表了Microsoft定义的一组API,而PCL使用的API则取决于所选择的平台。
  • .NET Standard与平台无关,而PCL针对的是有限的平台集。

.NET Standard的每个版本都有一组API(如:System.Drawing),由于它们都带有以前版本的所有API,因此能够向后兼容。同时,那些特定的.NET运行时版本实现的是特定的.NET Standard版本。也就是说,较低版本的.NET Standard能够覆盖更多平台。

工具类

.NET Framework工具

对于.NET Framework,您可以请使用MSBuild。它既可以在Visual Studio构建代码时被调用,也可以从命令行中被调用。MSBuild能够判断如何构建、以及由谁负责编译。例如:如果代码是由C#或VB.NET编写的,那么它将调用.NET编译器平台--Roslyn。而由于编译的结果是带有中间语言(intermediate language,IL)的二进制文件(如:.EXE或.DLL),因此它们可以被CLR所解释。如前所述,CLR包含了一个JIT编译器,可以编译出能够被操作系统理解的原生代码。而且CLR带有垃圾收集器(Garbage Collector )之类的工具,可以按需清理内存。

.NET Core工具

MSBuild也可以被用于.NET Core工具以及.NET Compiler Platform(Roslyn)。在使用IL生成二进制文件时,我们可以使用Core Common Language Runtime (CoreCLR)。与.NET Framwork CLR不同的是,CoreCLR可以在多个框架上运行,并通过JIT编译器,将IL编译为Windows、MacOS和Linux的原生代码。当然,CoreCLR和原生代码都是由应用主机进程--dotnet.exe进行加载的。

而在编译UWP时,我们可以使用AOT-Compiled(.NET Native)来进行编译,该编译器从IL生成原生代码,并将代码作为可部署的程序包来生成,而不是在运行时进行编译。此法提高了整体性能。

.NET Core带有一个被称为dotnet cli的全新命令行界面。您可以用dotnet new来创建新的项目;用dotnet build来构建应用;用dotnet run来运行;用dotnet publish来部署。当然,您也可以用dotnet –info来检查SDK与运行时被安装的位置。

Mono For Xamarin工具

在此,MSBuild再次被用于仅针对C#文件的构建过程。例如,我们可以通过Xamarin Compiler来编译Android设备上的C#代码。而作为JIT-Compiler的Mono运行时,会按需生成特定于目标Android设备的原生代码。当然,它也带有垃圾收集器(Garbage Collector )之类的工具。

而对于iOS上的C#代码,我们则可以通过Xamarin Compiler对其进行预编译,并使用ARM汇编语言,来生成IOS原生的软件包。

Visual Studio IDE

Visual Studio是由Microsoft提供的IDE,可用于横跨各种平台(包括Android和iOS),构建、调试和发布应用程序。通过与.NET的集成,Visual Studio可以提供特定于语言环境的各项功能。

Windows版的Visual Studio提供一个免费的社区版。而Visual Studio for Mac则是基于Xamarin公司(前身为Xamarin Studio)的MonoDevelop来构建的IDE。

类库

.NET生态系统涉及到许多类库,其中大多数可以在NuGet包中找到。此处的NuGet是.NET的软件包管理器,它包含了90,000多个软件包。

语言

我们可以用C#、F#或Visual Basic来编写各种.NET应用。其中:

选择与使用

我们该如何选择和使用上述三种运行时呢?下面是我的一些建议:

  • .NET Framework可用于:
  1. 生成Forms(表单)应用。
  2. 无法跨平台运行的Windows环境中。
  • .NET Core可用于:
  1. 构建占用空间较小的高性能应用。
  2. 跨平台运行的场景中。
  • Mono for Xamarin可用于:
  1. 构建利用原生功能和跨平台场景的移动应用中。

通过使用.NET Core,您可以构建框架依赖型(framework-dependent)或自包含型(self-contained)应用。其中,框架依赖型应用适合于独立于操作系统,但需要进行小型部署的场景。而自包含型应用,可以控制版本,并且不需要安装.NET Core,当然要求的部署体量会更大,而且需要指定目标操作系统。

就ASP.NET和ASP.NET Core而言,ASP.NET是一种传统技术,只能运行在Windows上,不过其功能比较丰富。而ASP.NET Core是为高性能的应用而设计的,能够实现跨平台的独立运行。不过它的功能和第三方库(如:表单)远不及ASP.NET。

此外,我们还应当事先判断是否需要共享代码。如果是,我们就应该使用.NET Standard Library;如果否,则需要在特定运行时中,使用其他的类库。

展望

Microsoft Build 2019大会曾宣布.NET Core和.NET Framework将在.NET 5中被统一,将只有一个.NET SDK来服务Windows、Linux、macOS、iOS、Android等平台。该框架将包含全新的.NET API、运行时功能、以及语言功能。此外,.NET 5还会对RyuJIT的代码质量、垃圾收集、以及JSON序列化等予以改进。

此外,Microsoft也宣布(请参见--https://devblogs.microsoft.com/dotnet/introducing-net-multi-platform-app-ui/)将推出一个用于创建跨平台应用的全新UI框架--.NET MAUI。它将是Xamarin.Forms的演化版,旨在简化开发人员的工作流程和项目结构,将多个平台封装到一个项目之中。据说,.NET MAUI的通用版本将在2021年11月发布的.NET 6中被提供。

一些实用的资源

原文标题:A Brief Walk Through the .NET Ecosystem,作者:Milan Milanovic

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

责任编辑:华轩 来源: 51CTO
相关推荐

2023-09-07 10:26:50

接口测试自动化测试

2023-12-24 12:56:36

协程

2023-05-05 07:10:42

IPv6互联网

2019-05-31 08:33:23

2021-08-16 05:39:33

云计算云计算环境信创云

2020-03-25 08:47:22

智能边缘边缘计算网络

2021-03-29 14:16:20

云计算

2023-10-25 08:17:06

Lite模式代理类

2012-12-27 10:58:24

KVMKVM概念

2023-10-29 08:35:47

AndroidAOP编程

2021-06-06 18:22:04

PprofGopher逻辑

2021-09-18 11:36:38

混沌工程云原生故障

2022-02-08 12:06:12

云计算

2022-06-07 07:37:40

线程进程开发

2019-08-07 17:18:18

云计算云原生函数

2011-08-23 11:03:35

ATM

2015-11-09 10:44:37

DevOpsIT运维

2023-08-17 10:12:04

前端整洁架构

2021-12-09 07:47:58

Flink 提交模式

2022-03-23 15:36:13

数字化转型数据治理企业
点赞
收藏

51CTO技术栈公众号