.NET生态系统掠影

1,830 阅读14分钟

如果你是一名开发人员,想要进入到.NET的世界,你需要知道都有哪些可能。由于..NET Framework是.NET生态系统中最流行的技术,你可以用它来构建各种各样的应用程序,但是最近,出现了一些新的东西,比如 .NET Core 和.NET Standard library。我们可以在项目或构建中使用它吗?

在.NET生态系统中使用特定的技术堆栈会产生一些困惑,因为有很多选择,比如应该使用哪种类型的运行时?在这篇文章中,我们将试图把这些要点都说清楚。

众所周知.NET是一个由微软创建的开源开发平台,用于构建许多不同类型的应用程序,如:web、移动设备、桌面、游戏等。它由不同的工具、编程语言和库组成。让我们从.NET的历史开始。

.NET背后的历史

在20世纪90年代,微软开始致力于.NET战略。这个策略的关键是包含所有的微软产品,并在现有的产品名称中添加.NET。在2000年代,.NET Framework被称为下一代Windows服务(NGWS)。. NET框架的第一个测试版发布于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标准2.0。
  • . NET Framework 4.8(2019年4月):最终版本包括JIT增强、WPF应用的高DPI增强、可访问性改进、性能更新和安全增强。
  • . NET Core 3.0(2019年9月):性能改进,c# 8.0新特性,实现. net标准2.1。Windows桌面支持。.net Core for Windows窗体和WPF。

.NET生态系统:概述

目前,. NET生态系统由开发平台中的不同组件组成。它包含不同的运行时,例如:

  • .Net Framework(WPF, Windows窗体,ASP.NET) -以Windows为中心。
  • .NET Core (ASP.net。NET Core,通用Windows平台- UWP) -跨平台,与其他版本并排工作。
  • Xamarin的Mono (IOS, OS X, Android)——跨平台。

上面所有的运行时都实现了.net标准库,它是.net APIs的规范,每个运行时都有实现。因此,为一个运行时创建的代码可以与其他运行时一起执行。

所有运行时都使用工具和基础设施来编译和运行代码。这包括语言(c#, Visual Basic),编译器(Roslyn),垃圾收集,以及构建工具,如MS build,或(Core) CLR。

.NET运行时

在这一节中,我们将看到主要的.NET运行时:

.NET Framework

.NET Framework是一个用于在Windows上构建和运行应用程序的软件开发框架。在这里它是部分开源的。. NET Framework由公共语言运行时(CLR)、.NET Framework类库和应用程序工作负载(WPF、Windows窗体和ASP.NET)组成。CLR是通用基础设施的一部分,它可以运行代码,JIT,做垃圾收集(C#, VB.NET, F#)等。

由CLR管理的代码称为托管代码。代码被编译成公共中间语言(CIL)并存储在程序集中(扩展名为.exe或.dll)。当应用程序运行时,CLR进行汇编并使用即时编译器(JIT)将机器代码转换为可以在特定计算机体系结构上运行的代码。

.NET framework库包含了类、接口和类型,它们提供了一些功能,比如字符串、文件系统支持等等。它允许用户创建不同类型的应用程序,如控制台应用程序或Windows窗体,Windows Communication Foundation (WCF), Windows Workflow Foundation (WF), Windows Presentation Foundation (WPF), ASP.NET(表单,Web API), Azure (WebJobs,云服务)。其中大多数都是特定于Windows平台的,并且使用Windows API,所以它们只能在Windows平台上工作。

如果你想要运行使用.NET Framework构建的应用程序,需要首先安装它,尽管Windows已经安装了一些版本。每个版本都有CLR和库。可以同时安装多个版本(只安装主要版本)。小版本将覆盖现有版本。例如,对于.NET 4.2.3:主要版本是4(新的CLR),次要版本是2(引入新特性的新库),以及3个修订(bug修复)。

.NET Framework通常安装在C:\Windows\Microsoft.NET\Framework (Framework64)。在里面,你会找到安装了所有主要版本的文件夹。

.NET Core

.NET Core是.NET生态系统中的一个运行时。它于2016年发布,是开源的(github.com/dotnet/core… Framework的新版本,也不会取代它。它是完全独立的构建,允许跨平台的能力来进行应用程序开发。.NET core包括运行CLR和应用程序Host(dotnet.exe)。它有公共语言运行时(CoreCLR)和.NET core类库。

CoreCLR使用JIT编译和垃圾收集来运行代码。它支持C#, VB.NET和F#,NET Core都有.NET Core类库,其中包含了提供不同功能的类,它是.NET Framework的一个更小的子集。它支持不同类型的应用程序工作负载,例如ASP.NET Core (MVC和API),控制台应用程序和UWP。UWP为运行在Windows 10上的所有设备提供了通用的类型系统、api和应用程序模型。在.NET Core 3.0 SDK中,包含了对Windows窗体应用程序的支持,包括Windows窗体设计器。

.NET Core可以运行在不同的平台上:Windows客户端,服务器,物联网,Linux, Ubnutu, FreeBSD, Tizen, Mac OSX,并可以安装在不同的版本,每台机器或每一个用户。

.NET Core 是安装在C:\Program Files\dotnet\shared\ Microsoft.NETCore.App[版本],它们在一起。

此外,它可以创建自包含的版本,不需要在主机上安装.NET core,因为它在结果的.exe文件中打包了app host。缺点是部署将会更大。

dotnet publish -r linux-x64 --self-contained true

Mono For Xamarin

Mono是.NET 框架运行时的克隆产物。Mono创建于2001年,但Xamarin的特定部分是在2011年发布的。它的开源地址:github.com/mono/mono和w… X和Android等应用工作负载。

Mono类似于.NET Core,包括垃圾收集、JIT、AOT和对c#的完全支持。Mono AOT编译器可以将.NET 代码构建为一个可以在机器上运行的本地代码可执行文件,就像c++代码一样。Xamarin的Mono有一个类库,支持创建应用程序(IO、集合等)。但是它是.NET Framework的一个子集,并不是所有的组件都被支持。

它可以运行以下工作:苹果IOS应用程序,MAC OS X应用程序(桌面),Android应用程序等,并允许在这些平台之间共享代码,它们作为本地应用程序运行在运行在Mono上的设备上。每个应用程序都绑定了Mono运行时和一个类库。没有必要在设备上安装Mono。

随着时间的推移,它扩展到了更广泛的领域,比如游戏开发,Unity和针对Xamarin的Mono长期以来一直合作在Unity中提供c#支持。

其他框架:.NET Compact Framework and .NET Micro Framework

这些是具有特定用途的特定框架。这两个运行时都试图提供在受限设备(如pda、移动电话等)上运行的精简运行时。例如,.NET Micro Framework是为资源受限的设备构建的,这些设备至少有256KB的flash和64KB的RAM内存。

Silverlight

Silverlight是一种流行的跨平台.NET技术,它支持为浏览器构建丰富的媒体体验。它于2007年发布,具有多种功能,如播放视频、下载媒体、创建丰富的UI和动画等。在2015年,微软在2021年10月决定停止对Silverlight的支持。

Community Projects

除了微软的官方运行时,还有由社区制作的.NET运行时,如DotGNU Portable。NET, DotNetAnywhere, CosmosOS和CrossNet。它们都有不同的方法来构建这样的框架。

.NET Standard

因为不同的运行时使用不同的类库,例如.NET Framework使用.NET Framework类库,而.net Core包含自己的类库,Xamarin也有自己的类库。这样就很难在不同的运行时之间共享代码,因为它们不使用相同的API。微软对此的解决方案是.NET标准库,于2016年发布。它表示一组(正式的)规范,说明可以使用哪些api以及它由所有运行时实现。它是可移植类库(PCL)的发展。特定的运行时实现。net标准的特定版本(实现特定的api集)。例如,.NET Framework 4.6.1实现了.NET Standard 2.0 。

. NET Standard和可移植类库(可在不同平台上使用的类库)之间的区别:

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

. NET Standard的每个版本都有一组api(如System.Drawing),它包含了以前版本的所有api,所以向后兼容。特定的.NET 运行时版本实现特定的.NET Standard。.NET 标准的较低版本覆盖更多的平台,这意味着应该始终尽可能地以最低版本为目标。

工具

.NET Framework工具

对于. NET Framework工具,使用MSBuild,在Visual Studio中构建代码时调用它,或者可以从命令行调用它。MSBuild知道如何构建或者由谁来编译它们。如果代码是c# /VB。它将调用.NET编译器平台(Roslyn)。编译的结果是一个使用中间语言(IL)的二进制文件(. exe或. dll)。它可以被CLR解释。CLR包含一个JIT编译器,它将编译成OS能够理解的本地代码。CLR有像垃圾收集器这样的工具,可以在不需要的时候清理内存。

.NET Core工具

MSBuild也被用于.NET Core工具,以及.NET 编译平台(Roslyn)。它生成二进制文件(。使用中间语言(IL),它被核心公共语言运行库(CoreCLR)使用。CoreCLR不同于.NET 框架CLR,因为它可以运行在多个框架上。它有JIT编译器,可以将IL编译为Windows、MacOS和Linux的本地代码。

还有另一种方法来编译应用程序。当UWP被编译时,它是用AOT-Compiled 编译的,它从IL生成本地代码,生成可部署的包代码,而不是在运行时进行编译,具有性能优势。

CoreCLR和本机代码由应用程序进程(dotnet.exe)加载。

. NET Core包含了新的命令行接口,称为dotnet cli。它允许创建新的项目。创建应用程序dotnet new。运行应用程序dotnet build。运行dotnet run或部署dotnet publish。可以尝试使用dotnet--info检查已经安装了哪些sdk和运行时,以及它们安装在哪个磁盘位置上。

Xamarin工具的Mono

MSBuild同样用于运行构建,但仅用于C#中的文件。如果有针对Android的C#代码,它是通过Xamarin编译器和针对Android平台编译(IL)编译的。然后Mono运行时作为JIT编译器,在运行时获取IL并生成特定于Android设备的本地代码。它还有运行时服务,比如垃圾收集器。

如果我们有IOS的c#代码,它是通过Xamarin编译器编译的,它为IOS预编译并生成原生包(使用ARM汇编语言)。

Xamarin也有不同的竞争对手,比如Uno平台和Avalonia UI。还有一个来自微软的新成员,名叫Blazor。所有这些工具主要使用WebAssembly (WASM)与C#、XAML或JavaScript相结合,让开发者可以在浏览器或不同的设备中部署应用程序。

Visual Studio IDE

Visual Studio是微软的一个IDE,用于跨平台构建、调试和发布应用程序,包括Android和iOS。Visual Studio与.NET 集成,并提供特定语言环境的特性。

Visual Studio可以在Windows和Mac上运行。有一个免费的社区版本可供使用。Mac版的Visual Studio和Windows版的Visual Studio是完全不同的环境,因为它基于MonoDevelop,用于Linux、macOS和Windows的IDE,由Xamarin公司(之前称为Xamarin Studio)构建。

在.NET生态系统中可以使用不同种类的库,其中大多数可以在NuGet包中找到。NuGet是一个为.NET构建的包管理器,包含超过90,000个包。

语言

不同种类的.NET应用程序可以用C#、F#或Visual Basic编写。

C#是一种简单的、现代的、面向对象的编程语言,它起源于C语言家族。当前版本是8.0,在.NET Core 3和.NET Standard 2.1上得到支持和。

F#是.net的一种跨平台、开源、函数式编程语言。

Visual Basic是来自Microsoft 的传统编程语言,具有用于构建类型安全的、面向对象的应用程序的简单语法。

使用

什么时候使用每个运行时。这是一个建议:

  • .NET Framework应该用于:

构建Form应用程序。

不能运行跨平台(Windows)。

  • .NET core应该被使用,如果:

构建占用空间小的高性能应用程序。

跨平台运行。

  • Xamarin应使用:

构建利用本机特性和跨平台的移动应用程序。

如果你使用.NET Core,你可以使用依赖于框架的应用程序或自包含的应用程序。

如果我们选择ASP.NET或ASP.NET Core,ASP.NET是一种更老的技术,只能在Windows上运行,但它有大量的功能和特性。ASP.NET Core可以跨平台运行,它的设计是高性能的,可以独立运行。它的功能和第三方库比ASP.NET少。没有ASP.NET Form。

关于共享代码的使用,我们首先需要检查是否需要它。如果是,我们应该使用.NET 标准库。如果不是,那么我们在相同的运行时中共享应用程序之间的代码,那么我们可以使用库与特定的运行时。这启用了.NET Standard中没有的运行时特定特性。

展望未来

在2019年微软宣布.NET Core和.NET Framework将在.NET 5中统一。针对不同的平台,如Windows、Linux、macOS、iOS、Android等,只有一个.NET SDK。这个框架将由一个新的.NET api、运行时功能和语言特性组成。. NET 5的主要主题之一将是. NET 以前版本的性能改进,以及RyuJIT代码质量、垃圾收集和JSON序列化方面的改进。.NET 5的发布计划是在2020年11月发布。

此外,今年它宣布将会有一个新的用于创建跨平台应用程序的一流UI框架,叫做.NET MAUI。这将是Xamarin的进化。表单和将简化开发人员的工作流程和一个项目结构到一个单一的项目,以多个平台为目标。MAUI将于2021年11月与.NET 6一起发布。

欢迎关注我的公众号,如果你有喜欢的外文技术文章,可以通过公众号留言推荐给我。