终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

 本文已经同步到微信公众号「极客起源」 。

 现在都在谈论全场景开发,也就是用一套开发工具,可以开发包括但不限于桌面、移动、IOT、游戏、Web等平台的应用。这样对于开发人员是非常爽的。本文将介绍微软推出的开发平台:.net 5,这个开发平台将完美地满足我们的各种开发需求。.net 5也是.net家族的下一代产品。

 我们只需要使用.net 5,就可以为Windows、Linux、macOS、iOS、Android、tvOS、watchOS、Web等平台开发应用,是不是很酷呢?本文会介绍一下.net 5的一些新特性。并亲手开发我们的第一个基于.net 5的程序。

 从.NET Core项目开始以来,微软已经向该平台添加了大约五万个.NET Framework API。 .NET Core 3.0为了缩小与.NET Framework 4.8的功能差距,添加了Windows Forms,WPF、Entity Framework6等功能。.NET5在此基础上,利用.NET Core和Mono的优势创建了一个单一平台,你可以将其用于所有的现存的.net代码,一个完整的与.net framework平齐的跨平台开发平台终于诞生了。

 
微软计划在2020年11月发布.NET 5的正式版,目前已经发布了.NET 5的预览版。
 
1. .NET 5 = 下一代.NET Core
 
.NET 5是.NET Core的下一步计划。 该项目旨在通过一些下面的一些方式来改进.NET:
 
(1)拥有单一的.NET运行时和框架,该框架可在任何地方使用,并具有统一的运行时,开发者在任何地方都可以使用他们的开发经验;
(2)通过充分利用.NET Core,.NET Framework,Xamarin和Mono来扩展.NET的功能;
(3)用单个代码库构建该产品,开发人员(Microsoft和社区)可以一起工作并一起扩展,从而改善了所有方案;
 
这个新的项目和方向改变了.NET的游戏规则。 使用.NET 5,无论您要构建哪种类型的应用,代码和项目文件的外观看起来都是一样的。 你将可以使每个应用程序访问相同的运行时,API和语言特性。 这包括几乎每天都致力于corefx的新性能改进。
 
当然,目前.net core拥有的仍然继续存在并完善,例如:
(1)在GitHub上的开源和面向社区;
(2)跨平台支持;
(3)支持利用特定于平台的功能,例如Windows上的Windows Forms和WPF以及从Xamarin到每个本地平台的本地绑定;
(4)高性能;
(5)并排安装(多个.net core版本共存);
(6)多种开发工具(Visual Studio、Visual Studio for Mac和Visual Studio Code);
 
下面是.net 5的一些新特性:
(1)在运行时体验上有更多选择(见下面的内容);
(2)Java互操作性将在所有平台上可用;
(3)在多个操作系统上将支持Objective-C和Swift的互操作;
(4)CoreFX将得到扩展,以支持.NET的静态编译(ahead-of-time – AOT),占用更小的空间以及对更多操作系统的支持;
 
计划2020-11发布.net 5.0的正式版,以后打算每年11月发布一个主要的版本,下图是.net的发布计划表。也就是说,明年的11月份,我们将迎来.net 6.0 LTS。其中LTS是长期支持版。
 
终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP
 终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP
 
可能有的同学会注意到,为什么没有.NET 4呢?这里直接跳过了第4版,是因为它会使熟悉.NET Framework的用户感到困惑,.NET Framework已经使用4.x系列已有很长时间了,此外,微软想清楚地传达.NET 5是.NET平台的未来。
 
除此之外,微软还借此机会简化了命名。 微软认为,如果只推出一个.NET,就不需要像“core”这样的澄清术语。 简称是一种简化,也表明.NET 5具有统一的功能和行为。 如果愿意,可以继续使用“ .NET Core”。这就意味着以后微软官方正式的名字不再有core,而是.NET 6、.NET 7等。
 
2. 微软的野心与运行时们
 
微软一直想统一各个平台的开发框架,现在终于通过.net 5得以实现。这样微软就可以为未来的新平台以近乎零成本移植程序了。而这一切都是从一个跨平台运行时Mono开始的!
 
Mono是.NET的原始跨平台实现。它最初是.NET Framework的开源替代方案,并随着iOS和Android设备的流行而转变为可以开发Android和iOS App。这样Mono就作为了Xamarin的运行时 成为了Xamarin的一部分。
 
CoreCLR是用于.NET Core的运行时。它的主要目标是支持云应用,包括微软最大的服务,现在也用于Windows桌面,物联网和机器学习应用程序。
 
综上所述,.NET Core和Mono运行时有很多相似之处(毕竟它们都是.NET运行时),但也具有宝贵的独特功能。使选择所需的运行时体验变得有意义。现在微软正在互相替代CoreCLR和Mono。以便让它像构建开关一样简单,可以在不同的运行时选项之间进行选择。
 
下面的内容描述了微软计划为.NET 5设计的主要特性。它们提供了清晰的视图,说明了微软计划如何分别以及一起发展两个运行时。
 
3. 高吞吐量与高生产率
 
从一开始,.NET就依靠即时编译器(JIT)将中间语言(IL)代码转换为优化的机器代码。从那时起,我们就建立了行业领先的基于JIT的托管运行时,该运行时具有很高的吞吐量,并且还为开发人员提供了使编程变得快速简便的体验。
 
JIT非常适合长期运行的云和客户端方案。他们能够生成针对特定机器配置(包括特定CPU指令)的代码。 JIT还可以在运行时重新生成方法,该技术用于快速JIT,同时如果可以成为一种经常使用的方法,还可以选择生成代码的高度优化版本。
 
 
开发者工具是JIT的另一个很好的例子,例如dotnet watch工具对代码编辑并继续运行。工具通常需要在一个进程中多次编译和加载代码,而无需重新启动,因此需要非常快速地执行。使用.NET Core或.NET Framework的开发人员主要依靠JIT。因此,这种体验应该看起来很熟悉。
 
大多数.NET 5工作负载默认使用基于JIT的CoreCLR运行时。 iOS和客户端Blazor(Web程序集)是两个值得注意的例外,因为它们都需要提前(AOT)本机编译。
 
4. 快速启动,占用更少的空间以及和使用更少的内存
 
Mono Project已将大部分精力集中在移动和游戏机上。该项目的关键功能和成果是基于业界领先的LLVM编译器项目的.NET AOT编译器。 Mono AOT编译器使.NET代码可以内置到可以在计算机上运行的本地可执行文件中,这与C ++代码非常相似。 AOT编译的应用程序可以在较小的地方高效运行,并在需要时交换吞吐量以进行启动。
 
Blazor项目已经在使用Mono AOT。这将是过渡到.NET 5的首批项目之一。微软会将其用作证明该计划的方案之一。
 
AOT解决方案有如下两种:
 
(1)需要100%AOT编译的解决方案;
(2)其中大多数代码都是AOT编译的,但是可以使用JIT或解释器并将其用于对AOT不友好的代码模式(如泛型);
 
Mono AOT支持两种情况。通常,出于安全原因,Apple对于iOS和某些游戏机要求使用第1类AOT。第2个是首选,因为它提供了AOT的优点而没有任何缺点。
 
.NET Native是我们用于Windows UWP应用程序的AOT编译器,并且是上面列出的第一类AOT的示例。通过该特定实现,限制了你可以使用的.NET API和功能。
 
iOS,Web程序集和某些游戏机仍需要AOT编译。对于需要快速启动和/或占用低空间的类似设备的应用程序,AOT编译将称为成为一种选择。
 
5. 开发第一个基于.NET 5的应用程序(包含断点调试功能)
 
到现在为止,我们已经了解了.NET 5的基本功能和目标,以及新特性。是时候开始操练一下了。开发.net应用的IDE有如下3个:
 
(1)Visual Studio(Windows)
(2)Visual Studio for mac(macOS)
(3)Visual Studio Code(跨平台)
 
如果使用前两个IDE,需要安装2019及以上版本,而且这两套IDE比较大,安装需要更长的时间。如果只是学习C#和.NET 5的API,推荐使用Visual Studio Code,这款IDE更轻量,而且使用起来并不比Visual Studio逊色。
 
在正式开发之前,先要安装.NET 5,读者可以到下面的页面下载.net 5的最新版(注意自己用的OS平台)。
 
.net 5支持的CPU架构非常全,如下图所示。如果用Linux或Windows,可以选择x86架构或ARM架构的机器。
终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP
终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP
 下载完,直接安装即可,这个不用犹豫,因为so easy,这里就不详细介绍安装过程了。本文使用的是macOS版本的.net 5,其他平台的.net 5版本的使用方法类似。
 
安装完.net 5后,可以在终端输入下面的命令测试一下是否安装成功。
 
dotnet --version
 
如果输出如下内容,说明.net 5已经安装成功。
 
5.0.100-preview.8.20417.9
 
接下来到下面的页面去下载Visual Studio Code吧。
 
 
读者需要根据自己使用的操作系统平台下载特定版本的Visual Studio Code,如下图所示。下载完了,直接安装或运行即可。
 终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

 Visual Studio Code一开始并不支持.net 5开发,需要安装各种插件。现在打开Visual Studio Code,切换到插件页面(点击左侧第5个按钮),并在插件搜索栏中输入C#,会列出如下图所示的插件。第1个是必须安装的,其他一些包含C#的插件,大家能安装就安装一下吧,多多益善,反正我是大多数都安装了。右侧显示绿色“安装”按钮的是还未安装的插件,没有该按钮的是已经安装的插件,点击插件,会在右侧显示插件的详细信息。

终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

 Visual Studio Code的工程是以文件夹形式管理的。第1次打开Visual Studio Code,是如下图这样的。点击“打开文件夹”按钮打开一个文件夹,就相当于打开一个工程了,如果是个空文件夹,那么就是空工程。也可以先建立一个空文件夹,然后再打开该文件夹终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP 

这里新创建一个名为first的文件夹,然后打开该文件夹,如下图所示。当鼠标放到文件夹上时,右侧会显示4个按钮,其中第2个是新建子文件夹。
终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

 现在在first下新建一个名为src的子文件夹,并且在该文件夹的右键菜单中点击“在集成终端中打开”,如下图所示。

终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

这时会在右下角打开一个终端,在终端输入dotnet new console命令,会创建一个控制台.net工程,如果输出如下图所示的信息,说明创建.net工程成功了。

终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

这时应该在src目录中生成一堆文件和目录,如果Visual Studio Code左侧工程树没有刷新,重启一下就出来了。在生成的若干文件中有一个Program.cs文件,是.net 应用的入口文件,因为该文件中有一个Main方法。已经有一行输出文本的例子了,如下图所示。

终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

 接下来在终端输入dotnet run命令,系统就会编译和运行当前的.net 工程,并输出如下图所示的结果。

终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

 不过现在都是通过命令行运行应用,非常不方便。其实Visual Studio Code也有直接通过IDE运行和调试的功能。现在切换到“运行”页面,如下图所示。

终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

 然后点击“创建launch.json文件”链接,会弹出如下图的选项列表,选择第1个(.NET Core)。

终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

 这时会创建一个如下图所示的launch.json文件。

 终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

 还需要重新打开一下first工程,然后再次切换到“运行”页面,会看到上方有一个运行按钮,如下图所示。

 终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

 现在点击“运行”按钮,会在终端输出运行信息,如下图所示。

终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP

 很明显,程序的输出信息也在里面。

 
下面我们来编写一个用于计算阶乘的C#程序,代码如下:
 
using System;

namespace src
{
    class Program
    {
        static int factorial(int n) {
            if(n == 0) {
                return 1;
            } else {
                return n * factorial(n - 1);
            }
        }


        static void Main(string[] args)
        {
            Console.WriteLine("10! = " + factorial(10));
        }
    }
}
 
运行程序,会输出如下内容:
10! = 3628800
 
当然,Visual Studio Code同样支持断点调试功能,只需要用鼠标单击需要设置断点的代码行前面,就会显示一个表示断点的红点,现在运行程序,程序就会停到断点的位置,然后可以单步跟踪代码了,如下图所示。
 终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP
终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP
 
本文是关于.net 5和C# 9的第1篇文章,后续将推出系列文章,详细介绍如何用Visual Studio Code、Visual Studio 2019、.NET 5以及C# 9开发更复杂的应用。
 
终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!-LMLPHP
09-08 14:45