.Net大局观(2).NET Core 2.0 特性介绍和使用指南

.NET Core 2.0发布日期:2017年8月14日

前言

这一篇会比较长,介绍了.NET Core 2.0新特性、工具支持及系统生态,现状及未来计划,可以作为一门技术的概述来读,也可以作为学习路径、提纲来用。

对于.NET Core 2.0的发布介绍,围绕2.0的架构体系,我想通过一个系列来全面介绍:

  1. .Net大局观(1).NET Standard 2.0 特性介绍和使用指南(已发布)
  2. .Net大局观(2).NET Core 2.0 特性介绍和使用指南(已发布)
  3. .Net大局观(3)ASP.NET Core 2.0 特性介绍和使用指南
  4. .Net大局观(4)Entity Framework Core 2.0 特性介绍和使用指南

.NET Core 2.0发布最终版,基于.NET Core 2.0开发的项目可以放心用于生产环境。.NET Core 2.0开发不受开发工具影响,安装SDK之后便可以使用命令行工具,Visual Studio Code或者你喜欢的文本编辑器编写代码发布项目,当然对于重量级IDE需要更新到最新版:Visual Studio 2017 15.3、Visual Studio for Mac 7.1。

注意:VS 2017 15.3并没有包含SDK,需另外单独安装.NET Core 2.0 SDK。

个人更喜欢使用轻量级编辑器Visual Studio Code,对我而言更新Visual Studio 2017 15.3是一项不小的工程,但是这个最新版本提供的单元测试Live Unit Testing功能,是其他IDE不能相比的,这会成为TDD开发者的最爱!

.NET Core 2.0进行了多项重要改进,这使得.NET Core 2.0更加具备作为平台的能力。本文总结了.NET Core 2.0最新特性,详细改进细节,可以参考GitHub Issues:dotnet/core #812。

特性概述

Runtime(运行时)

  • 运行时和框架的主要提升性能
  • 实现.NET Standard 2.0
  • 更多的发行版,新增6个平台支持,包含Debian Stretch, SUSE linux Enterprise Server 12 SP2, 和 macOS High Sierra.
  • RyuJIT is the x86 JIT in .NET Core 2.0
  • Linux 和 Windows ARM32 构建版已经发布预览

SDK

  • dotnet restore现在是一个隐式命令(需要的时候自动执行)
  • .NET Core 和 .NET Standard项目可以引用.NET Framework NuGet包、项目和程序集。
  • .NET Core SDK 可以进行源码编译,编译代码和脚本参看source-build repo

Visual Studio

  • 支持.NET Core项目Live Unit Testing
  • 代码导航的改进
  • C# Azure 函数支持
  • CI/CD 支持容器

使用指南

快速使用 .NET Core 2.0

首先请安装.NET Core SDK 2.0。(SDK中已经包含Runtime)

安装完成之后就可以使用命令行或Visual Studio创建.NET Core 2.0应用程序了。

创建新项目是极其简单的操作,在Visual Studio 2017可以使用提供的项目模板,也可以使用命令dotnet new执行命令创建:

C:\samples>dotnet new console -o console-app
C:\samples>cd console-app
C:\samples\console-app>dotnet run
Hello World!

项目和类库升级

可以将现有程序升级到 .NET Core 2.0。在Visual Studio中,更改目标框架为 .NET Core 2.0。

如果使用Visual Studio Code或者其他代码编辑器,手动编辑项目文件将目标框架改为netcoreapp2.0

<PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>

.NET Core 2.0和1.0/1.1之间的关系

三个版本是独立的,且可可以共存,并分别使用对应的运行时,项目不会自动升级,除非设置了对应的版本。

开发环境下,安装了多个SDK版本,默认使用最新的版本,在安装完.NET Core 2.0 SDK之后,用于所有新创建的项目,指定为1.0和1.1版本的项目仍然使用对应版本运行时。

在项目中添加global.json配置文件,可以指定使用特定的SDK版本。

.NET CORE Rumtime改进

有以下主要改进

性能改进

在.NET Core 2.0中有多项性能改进,开发团队发布了一系列文章说明.NET Core Runtime改进的细节:

  • Performance Improvements in .NET Core
  • Performance Improvements in RyuJIT in .NET Core and .NET Framework
  • Profile-guided optimization in .NET Core 2.0

.NET Core 2.0基于.NET Standard 2.0

.NET Core 2.0实现了.NET Standard 2.0规范。

参看diff between .NET Core 2.0 and .NET Standard 2.0理解.NET Core 2.0提供API和.NET Standard 2.0规范。

将Linux作为单个操作系统更容易实现

.NET Core 2.0将Linux作为单个操作系统来对待。(Linux的版本很多,这项支持意味着在我们眼中不同的版本都是Linux,无视差异,提高Linux系统上的兼容性。)现在有一个单独的Linux构建(基于芯片架构的构建),它适用于测试过的所有Linux发行版。到目前为止,支持仅限于基于glibc的发行版,特别是基于Debian和Red hat的Linux发行版。

计划还将支持更多其他的Linux发行版。

Windows和macOS也有类似的改进。您现在可以将项目发布为以下的“运行时”:

  • linux-x64, linux-arm
  • win-x64, win-x86
  • osx-x64

Linux和Windows ARM32构建现在可用(预览版)

.NET Core开发团队正在为.NET Core 2.0+开发ARM32构建支持。

这些构建非常适合在树莓派使用。这些构建还没有正式发布,现在只是预览版。提供为.NET Core 2.0 生成ARM32 Runtime(没有SDK)。因此,需要在另一个操作系统上构建应用程序,然后复制到树莓Pi(或类似的设备)上运行。

下面是两个非常棒的 .NET Core ARM32开发实例:

  • .NET Core on Raspberry Pi
  • .NET Core Docker Samples

全球化模式

.NET Core 2.0包含新的opt-in globalization mode,提供与操作系统和语言一致的基本的全球化相关功能。这种新模式的好处在于它的一致性、没有任何全球化依赖。

参看.NET Core Globalization Invariant Mode了解更多关于这个特性的信息.

.NET Core SDK 改进

下面是主要改进

dotnet restore 调整为隐式命令

在需要的时候会自动调用,dotnet restore是命令中使用频率较高的,用于项目引用更新时,恢复依赖的引用包,尽管没有更新时会有提示执行,但这非常容易忘记。

现在,当我们执行命令,如:run,build,publish时,会自动调用dotnet restore

下面的示例演示

C:\Users\rich>dotnet new mvc -o mvcapp
The template "ASP.NET Core Web App (Model-View-Controller)" was created successfully.
This template contains technologies from parties other than Microsoft, see https://aka.ms/template-3pn for details.

Processing post-creation actions...
Running 'dotnet restore' on mvcapp\mvcapp.csproj...
Restoring packages for C:\Users\rich\mvcapp\mvcapp.csproj...
Restore completed in 32.3 ms for C:\Users\rich\mvcapp\mvcapp.csproj.
Generating MSBuild file C:\Users\rich\mvcapp\obj\mvcapp.csproj.nuget.g.props.
Generating MSBuild file C:\Users\rich\mvcapp\obj\mvcapp.csproj.nuget.g.targets.
Restore completed in 2.26 sec for C:\Users\rich\mvcapp\mvcapp.csproj.
Restore succeeded.

C:\Users\rich>cd mvcapp

C:\Users\rich\mvcapp>dotnet run
Hosting environment: Production
Content root path: C:\Users\rich\mvcapp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
Application is shutting down...

创建项目后,会自动调用dotnet restore命令。

在.NET Standard项目中引用.NET Framework类库

这个功能将帮助我们将.NET Framework 快速迁移到.NET Standard或.NET Core,在迁移的过程中,先直接使用,那么随着时间的推移(从二进制文件开始,然后移动到源代码)迁移整个项目。

这个功能也为.NET Framework类库提供一个新的运行框架支持。

引用.NET Framework类库之后,类库中的类型仅限于使用在.NET Standard API集合中支持的类型,所以要谨慎对待,进行完整测试。

类库支持.NET Framework 4.6.1,或更早的版本,甚至包括1.0的版本。下图展示了这项功能的使用:

从应用程序的调用堆栈可以看出程序集的目标框架。

.NET Standard NuGet包无需任何依赖

类库的框架目标设置为 .NET Standard 2.0 或更高的版本,将无需任何依赖,底层依赖直接由.NET Core SDK提供。

下面是目标框架为.NET Standard 2.0的NuGet包配置文件:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
    <metadata>
        <id>ClassLibrary1</id>
        <version>1.0.0</version>
        <authors>ClassLibrary1</authors>
        <owners>ClassLibrary1</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>Package Description</description>
        <dependencies>
            <group targetFramework=".NETStandard2.0" />
        </dependencies>
    </metadata>
</package>

下面是目标框架为.NET Standard 1.4的NuGet包配置文件:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
    <metadata>
        <id>ClassLibrary1</id>
        <version>1.0.0</version>
        <authors>ClassLibrary1</authors>
        <owners>ClassLibrary1</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>Package Description</description>
        <dependencies>
            <group targetFramework=".NETStandard1.4">
                <dependency id="NETStandard.Library" version="1.6.1" exclude="Build,Analyzers" />
            </group>
        </dependencies>
    </metadata>
</package>

Visual Studio 2017 15.3 更新

SDK并行支持

最新版本的VS,可以识别最新的.NET Core SDK,并且应用相关的工具。15.3版本中Visual Studio对.NET Core SDK提供并行支持,即在创建新项目时,默认使用安装的最高.NET Core SDK版本,同时允许您在需要时通过使用global.json来指定和使用旧版本。

这样可以使用VS构建针对不同.NET Core版本的应用。

Visual Basic 支持

除了支持C#和F#,15.3现在还支持使用Visual Basic来开发.NET Core应用程序。

Live Unit Testing 支持

Live Unit Testing (LUT)是Visual Studio 2017企业版中一项新功能,在15.3中支持.NET Core应用程序。热爱测试驱动开发(TDD)的用户肯定会喜欢这个新功能。

启用步骤非常简单:Test->Live Unit Testing->Start

如下图所示,当我们启用LUT,可以在代码编辑器中实时查看单元测试覆盖和测试结果反馈,注意左边的测试用例和右边的被测试代码。(这个好!)

IDE生产力增强

Visual Studio 2017 15.3提供多项生产力增强功能,帮助更快写出更好的代码。现在支持通过EditorConfig设置.NET命名规范和格式化规则,这样允许您的团队执行和配置几乎所有代码的编码约定。(团队开发统一代码规范的痛点得到解决!赞!)

代码导航改进:添加GoToAll(Ctrl+T)支持camelCase匹配(大写简称匹配),只需要输入缩写,可以导航到任意文件、类型、成员定义,比如:bh将会搜索到BusHelper.cs

在下图中还可以看到建议的变量名,变量名遵循编辑器配置中的代码规范:

新增部分重构功能:

  • 解决合并冲突(Resolve merge conflict)
  • 添加参数(根据调用方法推断)
  • 生成重载(overrides)
  • Add named argument
  • Add null-check for parameters
  • Insert digit-separators into literals
  • Change base for numeric * literals (e.g., hex to binary)
  • Convert if-to-switch
  • Remove unused variable

项目系统优化

对项目文件.csproj进行优化,移除部分不需要的元素。从下图可以看到项目的依赖项进行分类,结构更加清晰。

另一个针对.NET Core项目系统的增强是项目编译更加高效。

Docker支持

.NET Core 2.0项目可以更好的支持Docker:

  • Docker latest tag moved to .NET Core 2.0
  • microsoft/dotnet Docker Hub README adopted segmented OS/Arch style
  • Linux ARM32 Docker images are now available.
  • .NET Core 2.0 multi-arch tags now use Debian Stretch
  • .NET Core Docker images use multi-arch based tags
  • .NET Core supports Multi-Stage Build

版本支持和生命周期

.NET Core 2.0可以应用于生产环境。

微软有两个支持级别:长期支持(Long Term Support-LTS)和当前版本(Current release)。LTS版本有三年的支持,而当前版本更短,通常在一年左右,甚至可能更短。当前版本又被称为“快速跟踪支持”。.NET Core 1.0 and 1.1 是LTS版。

.NET Core 2.0是当前版本支持,正在等待质量和可靠性的反馈,然后会转到LTS支持。一般来说,在发布LTS版时,要确保该版本处于只需要为它提供安全修复的阶段,一旦你部署了一个带有LTS版本的应用程序,就不应该更新它,至少不会因为平台而更新。

Red Hat完全支持.NET Core,会很快发布相应的版本,可以查看这个网站RedHatLoves.NET查看。

还记得这些图片吗?微软高调示爱Linux

当然,爱是相互的,微软用了三年时间终于也收获了被爱的感觉,技术的最终方向是:融合,感动O(∩_∩)O~!

最后

2.0 是.NET Core一个重要的里程碑版本,让人感到非常兴奋!2.0不仅是目前所有.Net框架中最快的版本,同时.NET Standard 2.0也实现了承诺:让.NET无处不在。结合Visual Studio家族,.NET Core为开发人员在Windows、MacOS以及Linux系统提供最高效的开放平台。

写给自己的话

写文章真是一件耗费脑力和体力的事情,对这篇文章的整理和编辑持续两天才完成,计算下大概耗时4小时,感觉写代码爽多了,可能还没适应写东西,但是我会坚持更新完这个系列。希望更多人第一时间了解.NET Core!

赞 (0) 评论 分享 ()