前言

早上起来.NET社区沸腾了,期待已久的.NET Core 2.0终于发布!根据个人经验,微软的产品一般在2.0时会趋于成熟,所以一个新的.Net开发时代已经来临!未来属于.NET Core。

.NET Standard是一套正式的 .NET API (.NET 的应用程序编程接口)规范。 推出 .NET Standard 的背后动机是要提高 .NET 生态系统中的一致性。

2017年6月,微软正式发布.NET Standard 2.0。

对于.NET Core 2.0的发布介绍,围绕2.0的开发生态,我想通过四篇文章(名称暂定):

  1. .NET Standard 2.0 特性介绍和使用指南
  2. .NET Core 2.0 特性介绍和使用指南
  3. ASP.NET Core 2.0 特性介绍和使用指南
  4. Entity Framework Core 2.0 特性介绍和使用指南

.NET Standard 2.0是基石,所以放在第一篇。

使用之前,下载安装.NET Core 2.0,下载地址。

.NET Standard 2.0 特性介绍

  • 代码共享:.NET Standard是API集合,更是代码实现标准,所有.NET实现必须符合该标准,防止代码碎片化。.NET Standard被设计用来作为替代可移植类库Portable Class Libraries(PCL)的构建工具。

  • API支持:在.NET Standard 2.0中API支持数量增多,包含API数量为32000个,.NET Standard 1.6 中API数量为13000个,目前为止已经包含.NET Framework中的大部分APIs,这意味着可以轻松地将现有代码移植到.NET Standard,从而使现有代码支持基于.NET Standard实现的任何平台,参看平台支持列表。

  • .NET Framework兼容模式:目前绝大多数的NuGet软件包使用.NET Framework,大多数项目被禁止引用到.NET Standard项目,因不是所有的项目依赖都支持.NET Standard,这是在.NET Standard 2.0中加入兼容模式的原因,使.NET Standard项目可以直接引用.NET Framework类库。目前70%的Nuget软件包是兼容.NET Standard 2.0,可能在某些特殊情况下不起会兼容失败,比如:WPF中的.NET Framework类库。

  • 平台支持
    • .NET Framework 4.6.1
    • .NET Core 2.0
    • Mono 5.4
    • Xamarin.iOS 10.14
    • Xamarin.Mac 3.8
    • Xamarin.Android 7.5
    • Upcoming version of UWP (预计今年下半年)

.NET Standard 2.0 使用指南

创建.NET Standard类库

通过创建一个新项目来实践一下,在VS中 文件 | 新项目 选择.NET Standard分类找到 Class Library (.NET Standard),项目名称为mylibrary

也可以通过命令行dotnet new创建一个类库(默认使用.NET Standard)

dotnet new lib -o mylibrary

为了让这个类库更加意义,编辑文件Class1.cs as,添加一行逻辑代码。

  1.  
    using System;
  2.  
     
  3.  
    namespace mylibrary
  4.  
    {
  5.  
    public class Class1
  6.  
    {
  7.  
    public static string GetMessage() => "Hello from .NET Standard!";
  8.  
    }
  9.  
    }

使用.NET Standard类库

在使用类库之前,需要创建一个项目。创建一个空ASP.NET Core项目。在VS中,创建项目时在.NET Core分类中选择ASP.NET Core Web Application,选中ASP.NET Core 2.0,类型为Empty。

命令行创建

dotnet new web -o aspnetcore

使用.NET Standard类库的方式和使用其他类库一样,只需要在项目中添加引用。在VS中右键项目,点击添加/引用,然后在项目(Projects)选项卡中选择 mylibrary。

命令行方式为项目添加引用

dotnet add reference ../mylibrary/mylibrary.csproj

Startup.cs文件,添加代码

  1.  
    app.Run(async (context) =>
  2.  
    {
  3.  
    var message = mylibrary.Class1.GetMessage();
  4.  
    await context.Response.WriteAsync(message);
  5.  
    });

在VS中F5运行。

命令行工具运行

  1.  
    $ dotnet run
  2.  
    Now listening on: http://localhost:50878
  3.  
    Application started. Press Ctrl+C to shut down.

运行效果

恭喜!创建的.NET Standard 2.0类库在.NET Core中调用成功。同样也可以在 .NET Framework或Xamarin等不同类型的应用中使用,方式一样。

重用现有.NET Framework类库

.NET Standard 2.0 提供兼容模式,现在添加一个非.NET Standard类型的NuGet包,如要添加NuGet包为:Huitian.PowerCollections,在VS中右键项目mylibrary,选择Manage NuGet Packages.,然后选择Browse,搜索Huitian.PowerCollections,在结果中找到包并点击安装。

命令行添加Nuget包

dotnet add package Huitian.PowerCollections

安装完包后,将显示以下警告:

NU1701: Package ‘Huitian.PowerCollections 1.0.0’ was restored using ‘.NETFramework,Version=v4.6.1’ instead of the project target framework ‘.NETStandard,Version=v2.0’. This package may not be fully compatible with your project.

这段警告不仅在安装包时提示,在每次构建时都会提示。

警告出现的原因是因为NuGet无法确定.NET Framework类库是否能够完全正常工作。例如,它可能依赖于Windows Forms(不跨平台)。建议测试应用程序,如果所有功能都按预期工作,您可以阻止警告。

编辑项目文件中包引用配置,添加NoWarn属性:

  1.  
    <ItemGroup>
  2.  
    <PackageReference Include="Huitian.PowerCollections" Version="1.0.0" NoWarn="NU1701" />
  3.  
    </ItemGroup>

上面的配置是将Huitian.PowerCollections(版本:1.0.0)包引用时产生的警告名为NU1701设置为不提示。

在VS中直接在包的属性中进行设置

再次编译,不再提示警告信息。注意:配置只针对每个引用包,不是全局的。因此,如果引用了另一个需要兼容模式的库,将再次得到警告,需要对该包进行单独设置。

发布NuGet包

当类库开发完成,可以将其发布成NuGet包,在VS中,右键项目选择属性(Properties),在选项卡中找到Package,选中Generate NuGet package on build

在命令行工具环境下,编辑项目文件添加GeneratePackageOnBuild设置值为true

  1.  
    <PropertyGroup>
  2.  
    <TargetFramework>netstandard2.0</TargetFramework>
  3.  
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  4.  
    </PropertyGroup>

编译项目,在输出目录中会找到生成的NuGet包。

补充:关于可移植类库(Portable Class Libraries)

.NET Standard 2.0发布之后,在.NET项目中共享代码,不再推荐使用PCL类库,有可能后面会废弃,如果现在使用PCL应该移植为.NET Standard类库。

总结

.NET Standard 2.0 支持API数量是 .NET Standard 1.x 的两倍多,这意味着我们将.NET Framework 中的代码移植到.NET Standard变得更加顺畅,另外通过兼容模式在.NET Standard类库中可以引用.NET Framework项目或类库,这样允许在没有将所有代码移植到.NET Standard的情况下快速使用现有类库。(提供一个过渡措施,如果代码没有执行到不支持的API是不会出错的。)

几乎所有.NET平台都支持 .NET Standard 2.0,包括.NET Framework, .NET Core, 和 Xamarin(前身是Mono),UWP在今年稍后的时间会支持。所有这些实现得益于新增的API以及兼容模式,特别是.NET Core和UWP,他们以前只能使用一个受限的API集。

建议你将所有的业务逻辑和UI中依赖的代码转换成.NET Standard,能确保你的业务逻辑可以在任何平台被复用,比如桌面应用、移动应用、云应用。

更多参考资料

    • .NET Standard 2.0新增命名空间
      提供绘图API啦!
    • .NET Standard documentation
    • .NET Standard AP

net core体系-Standard-1概述的更多相关文章

  1. Orchard Module,Theme,Core扩展加载概述

    Orchard 源码探索(Module,Theme,Core扩展加载概述) 参考: http://www.orchardch.com/Blog/20120830071458 1. host.Initi ...

  2. net core体系-1概要

    .net core最近园子讨论频率很高的话题,从不久前发布正式版本后,也是开始从netcore官网一步一步走向学习之路:.net跨平台的设计让人很是兴奋起来,因为做了多年的互联网研发者,见识了很多一流 ...

  3. 通俗易懂,什么是.NET/.NET Framework/.NET Core/.Net Standard?

    什么是.NET?什么是.NET Framework?本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要包 ...

  4. .net core .net standard .net framework

    由于对微软的技术比较感兴趣,所以最近就在研究用Visual Studio Code开发一个Asp.net core项目并且准备从后端开始干起. 一开始用dotnet new console创建了一个控 ...

  5. ASP.NET Core 2.0 : 一. 概述

    为什么要使用 ASP.NET Core? .NET Core 刚发布的时候根据介绍就有点心里痒痒, 大概看了一下没敢付诸于行动,  现在2.0发布了一段时间了, 之前对其"不稳定" ...

  6. net core体系-web应用程序-4net core2.0大白话带你入门-2asp.net core新建项目

    新建asp.net core项目   开发环境:Windows Server R2 2008 开发工具:Microsoft Visual Studio 2017 新建asp.net core项目 创建 ...

  7. net core体系-网络数据采集(AngleSharp)-1初探

    有这么一本Python的书: <<Python 网络数据采集>> 我准备用.NET Core及第三方库实现里面所有的例子. 这是第一部分, 主要使用的是AngleSharp:  ...

  8. ASP.NET Core 与 .NET Core 演变与基础概述

    https://github.com/dotnet/corehttps://github.com/aspnet/home 今天看到 .NET Core 的改名计划,感觉跨平台的时代快要来了,从之前的 ...

  9. ASP.NET Core Module overview模块概述

    原文地址:ASP.NET Core Module overview By Tom Dykstra, Rick Strahl, and Chris Ross ASP.NET Core模块(ANCM)让你 ...

随机推荐

  1. Docker 基本核心原理

    Docker内核知识 namespace资源隔离 namespace的6项隔离 NameSpace 系统调用参数 隔离内容 UTS CLONE_NEWUTS 主机名与域名 IPC CLONE_NEWI ...

  2. 【sql server】“因为数据库正在使用,所以无法获得对数据库的独占访问权” 解决方案汇总

    #事故现场: 在尝试还原数据库时,出现如下错误: #方案一:设置数据库在单用户模式下工作: 1.数据库上右键“属性”: 2.“选项”->“限制访问”,选择“SINGLE_USER” 3.还原数据 ...

  3. Maven之阿里云镜像仓库配置

    方式一:全局配置:修改maven的setting.xml配置 在mirrors节点下面添加子节点: <mirror> <id>nexus-aliyun</id> & ...

  4. nginx资料汇总

    nginx docker 中的一些目录和 windows下是不同的, 静态内容目录: /usr/share/nginx/html 配置文件目录: /etc/nginx 日志输出目录: /var/log ...

  5. Axure PR的使用

    1759139 王越 Axure RP是美国Axure Software Solution公司旗舰产品,是一个专业的快速原型设计工具,让负责定义需求和规格.设计功能和界面的专家能够快速创建应用软件或W ...

  6. react-intl

    internationalization standard https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glob ...

  7. 原生JS实现banner图的滚动与跳转

    HTML部分: <div id="banner"> <!--4张滚动的图片--> <div id="inside"> < ...

  8. 将JSON转换成MAP的工具类

    package com.xxxx.util; import java.io.BufferedReader; import java.io.InputStream; import java.io.Inp ...

  9. linux Centos7下安装python3及pip3

    先去python官网下载python3安装包 执行命令:wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 安装zlib-dev ...

  10. python基础之文件操作和函数

    一.知识点 1.三元运算 a = 2 b = 3 val = 6 if a < b else 7 print(val) 2.文件读取 f = open(file='file.txt',mode= ...