Web开发

注册

 

发新话题 回复该主题

关于NET生态,你了解多少 [复制链接]

1#

如果您是一名开发人员,那么一定听说过.NET技术吧。它是由Microsoft创建的开源式开发人员平台,可用于构建诸如:Web、移动、桌面、游戏等许多不同类型的应用。通常,它由不同的工具、编程语言和库所组成。其中,.NETFramework是.NET生态系统中最受欢迎的技术之一。

近年来,.NETCore和.NETStandardLibrary(标准库)也在该生态系统中相继出现。面对这么多的技术栈,我们该如何选择呢?下面,我们将深入探讨它们的各种特点、用途与对应工具。首先,我们从.NET的简史开始。

.NET的发展历史

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

.NETFramework2.0(年11月):包含通用集合、迭代器、以及可为空的类型。.NETFramework3.0(年11月):包含WPF、WCF和WWF。.NETFramework3.5(年11月):包含AJAX、LINQ、ASP.NETMVC。.NETFramework4.0(年4月):包含MEF、DLR、任务并行库、Razor视图引擎、新的C#/VB语言功能。.NETFramework4.5(年8月):支持异步与zip压缩。.NETCore1.0(年11月):包括对跨平台的支持、ASP.NET5和.NETNative。.NETCore2.0(年8月):具有重大的性能改进,并实现了.NETStandard2.0。.NETFramework4.8(年4月):包括JIT增强功能,针对WPF应用的HighDPI增强功能,可访问性的改进,性能更新,以及安全性增强。.NETCore3.0(年9月):提供C#8.0的新功能,实现了.NETStandard2.1。让Windows桌面支持WindowsForms和WPF。.NET生态系统概述

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

.NETFramework(WPF、WindowsForms、ASP.NET)是以Windows为中心。.NETCore(ASP.NETCore、UniversalWindowsPlatform)是跨平台工具,可与其他版本并行使用。MonoForXamarin(IOS、OSX、Android)同样可以跨平台。上述三大运行时都实现了.NETStandardLibrary,同时它们也是.NETAPI的规范。因此,为某个运行时创建的代码,同样可以被其他运行时所执行。而且所有运行时都使用工具和基础架构来编译和运行代码。其中涉及到的语言有C#和VisualBasic,编译器有Roslyn,还有垃圾回收,以及诸如MSBuild或(Core)CLR之类的构建工具。

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

.NETFramework

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

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

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

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

.NETCore

作为.NET生态系统中的一种运行时,.NETCore于年被发布并开源。它并非.NETFramework的新版本,也不会替代.NETFramework,而是被独立地构建出来,旨在跨平台进行应用程序的开发。.NETCore由可运行CLR和Library的AppHost(dotnet.exe)所组成。它拥有公共语言运行时(CoreCLR)和.NETCoreClassLibrary。

CoreCLR使用JITCompilation和垃圾回收来运行代码。它支持C#、VB.NET和F#。作为.NETFramework库的子集,.NETCoreClassLibrary包括并提供不同的功能类。它支持不同类型的应用负载,包括:ASP.NETCore(如:MVC和API)、各种控制台应用,以及UWP。其中,UWP为所有在Windows10上运行的设备,提供了通用类型的系统、API和应用模型。从.NETCore3.0SDK开始,它能够支持包括WindowsFormsDesigner在内的各种WindowsForms应用。

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

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

MonoForXamarin

Mono是.NETFramework运行时的一个克隆。微软于年收购了Xamarin,并使其成为.NET平台的完全开源分支。目前,它是由Mono运行时和XamarinClassLibrary所组成,可以运行IOS、OSX和Android等应用负载。

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

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

其他框架

.NETCompactFramework和.NETMicroFramework

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

Silverlight

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

社区项目

除了Microsoft官方提供的运行时,开发者社区也提供了诸如:DotGNUPortable.NET、DotNetAnywhere、CosmosOS和CrossNet.NET等运行时。它们的构建方式略有不同。

.NETStandard

无论是.NETFramework、.NETCore还是Xamarin,不同的运行时会使用各自不同的类库。而由于它们使用的是不同API,因此不同的运行时无法彼此共享代码。为此,Microsoft于年发布了.NETStandardLibrary。它通过一组正式的规范,说明了各个运行时都能够使用和实现的API。而特定的运行时也能够实现特定版本的.NETStandard。例如:.NETFramework4.6.1就能够实现.NETStandard2.0。同时,它也是PortableClassLibraries(PCL)的一种发展方向。

.NETStandard和PortableClassLibraries(即,可在不同平台上使用的库)之间的区别是:

.NETStandard代表了Microsoft定义的一组API,而PCL使用的API则取决于所选择的平台。.NETStandard与平台无关,而PCL针对的是有限的平台集。.NETStandard的每个版本都有一组API(如:System.Drawing),由于它们都带有以前版本的所有API,因此能够向后兼容。同时,那些特定的.NET运行时版本实现的是特定的.NETStandard版本。也就是说,较低版本的.NETStandard能够覆盖更多平台。

工具类

.NETFramework工具

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

.NETCore工具

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

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

.NETCore带有一个被称为dotnetcli的全新命令行界面。您可以用dotnetnew来创建新的项目;用dotnetbuild来构建应用;用dotnetrun来运行;用dotnetpublish来部署。当然,您也可以用dotnet–info来检查SDK与运行时被安装的位置。

MonoForXamarin工具

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

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

VisualStudioIDE

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

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

类库

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

语言

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

C#是一种简单、时髦的、面向对象的编程语言。它源于C语言家族,其当前版本是8.0,能够支持.NETCore3.x和.NETStandard2.1。F#是针对.NET的跨平台、开源且功能性的编程语言。VisualBasic是Microsoft的传统编程语言。它具有用于构建安全、面向对象应用的简单语法。选择与使用

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

.NETFramework可用于:生成Forms(表单)应用。无法跨平台运行的Windows环境中。.NETCore可用于:构建占用空间较小的高性能应用。跨平台运行的场景中。MonoforXamarin可用于:构建利用原生功能和跨平台场景的移动应用中。通过使用.NETCore,您可以构建框架依赖型(framework-dependent)或自包含型(self-contained)应用。其中,框架依赖型应用适合于独立于操作系统,但需要进行小型部署的场景。而自包含型应用,可以控制版本,并且不需要安装.NETCore,当然要求的部署体量会更大,而且需要指定目标操作系统。

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

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

展望

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

此外,Microsoft也宣布将推出一个用于创建跨平台应用的全新UI框架--.NETMAUI。它将是Xamarin.Forms的演化版,旨在简化开发人员的工作流程和项目结构,将多个平台封装到一个项目之中。据说,.NETMAUI的通用版本将在年11月发布的.NET6中被提供。

一些实用的资源

.NET指南–Microsoft针对新手的常规文档;.NETCore指南–适用于那些正在考虑过渡到Core版本的用户;.NETFramework–.NET的原始文档;Xamarin–移动开发文档;.NETFoundation–.NET的开源社区;NuGet–可查看所有.NET的软件包;.NETCore和Framework–提供下载链接。.NET开发人员社区–开发人员社区和支持,其中包括:指向社交媒体、论坛、博客、实时研讨会、以及诸如.NETFoundation之类组织的链接。

分享 转发
TOP
发新话题 回复该主题