.Net Core 2.0 生态(1).NET Standard 2.0 特性介绍和使用指南
.NET Standard 2.0 发布日期:2017年8月14日
公告原文地址
前言
早上起来.NET社区沸腾了,期待已久的.NET Core 2.0终于发布!根据个人经验,微软的产品一般在2.0时会趋于成熟,所以一个新的.Net开发时代已经来临!未来属于.NET Core。
对于.NET Core 2.0的发布介绍,围绕2.0的架构体系,本系列相关文章:
- .Net Core 2.0 生态(1).NET Standard 2.0 特性介绍和使用指南(已发布)
- .Net Core 2.0 生态(2).NET Core 2.0 特性介绍和使用指南(已发布)
- .Net Core 2.0 生态(3)ASP.NET Core 2.0 特性介绍和使用指南(已发布)
- .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
,添加一行逻辑代码。
using System;
namespace mylibrary
{
public class Class1
{
public static string GetMessage() => "Hello from .NET Standard!";
}
}
使用.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
文件,添加代码
app.Run(async (context) =>
{
var message = mylibrary.Class1.GetMessage();
await context.Response.WriteAsync(message);
});
在VS中F5运行。
命令行工具运行
$ dotnet run
Now listening on: http://localhost:50878
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属性:
<ItemGroup>
<PackageReference Include="Huitian.PowerCollections" Version="1.0.0" NoWarn="NU1701" />
</ItemGroup>
上面的配置是将Huitian.PowerCollections(版本:1.0.0)
包引用时产生的警告名为NU1701
设置为不提示。
在VS中直接在包的属性中进行设置
再次编译,不再提示警告信息。注意:配置只针对每个引用包,不是全局的。因此,如果引用了另一个需要兼容模式的库,将再次得到警告,需要对该包进行单独设置。
发布NuGet包
当类库开发完成,可以将其发布成NuGet包,在VS中,右键项目选择属性(Properties),在选项卡中找到Package,选中Generate NuGet package on build
在命令行工具环境下,编辑项目文件添加GeneratePackageOnBuild设置值为true
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</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 Core 2.0 生态(1).NET Standard 2.0 特性介绍和使用指南的更多相关文章
- .Net Core 2.0生态(3):ASP.NET Core 2.0 特性介绍和使用指南
ASP.NET Core 2.0 发布日期:2017年8月14日 ASP.NET团队宣布ASP.NET Core 2.0正式发布,发布Visual Studio 2017 15.3支持ASP.NET ...
- .Net Core 2.0生态(4):Entity Framework Core 2.0 特性介绍和使用指南
前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升级EF也发展到EF6.x,Entity Framework Core是一个支持跨平台的全新版本, ...
- .Net Core 2.0 生态(2).NET Core 2.0 特性介绍和使用指南
.NET Core 2.0发布日期:2017年8月14日 前言 这一篇会比较长,介绍了.NET Core 2.0新特性.工具支持及系统生态,现状及未来计划,可以作为一门技术的概述来读,也可以作为学习路 ...
- .NET Standard 2.0 特性介绍和使用指南
.NET Standard 2.0 发布日期:2017年8月14日 公告原文地址 前言 早上起来.NET社区沸腾了,期待已久的.NET Core 2.0终于发布!根据个人经验,微软的产品一般在2.0时 ...
- .Net大局观(2).NET Core 2.0 特性介绍和使用指南
.NET Core 2.0发布日期:2017年8月14日 前言 这一篇会比较长,系统地介绍了.NET Core 2.0及生态,现状及未来计划,可以作为一门技术的概述来读,也可以作为学习路径.提纲来用. ...
- 【EF】Entity Framework Core 2.0 特性介绍和使用指南
阅读目录 前言 获取和使用 新特性 项目升级和核心API变化 下一步计划 遗憾的地方 回到目录 前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升 ...
- ActiveMQ客户端Apache.NMS从.net 4.0移植到.net standard 2.0
1.从官网或GitHub下载Apache.NMS源码 2.新建.net standard 2.0类库 3.将源码复制到新建的类库中,并删除或注释CommonAssemblyInfo.cs文件(程序集版 ...
- 【.Net Core 2.0 生态】-- 好文收藏
随笔分类 - .NET Core - dotNet实训营 .Net Core 2.0 生态(1).NET Standard 2.0 特性介绍和使用指南 .Net Core 2.0 生态(2).NET ...
- Net Core 2.0生态1
Net Core 2.0生态 阅读目录 前言:答读者问(time by:2017.8.19) 项目升级到ASP.NET Core 2.0 新增功能:Razor Pages介绍 模板更新 Entity ...
随机推荐
- Python--Click
Click Click 是 Flask 的开发团队 Pallets 的另一款开源项目,它是用于快速创建命令行的第三方模块. 我们知道,Python 内置了一个 Argparse 的标准库用于创建命令行 ...
- 【BJOI2019】光线 模拟
题目大意:有一束光线要依次穿过$n$块玻璃. 第i块玻璃的透射率为$a_i$,反射率为$b_i$. 问你有多少光能最终穿过所有玻璃. 数据范围:$n≤5\times 10^5$,答案对$9982443 ...
- HDU 6020---MG loves apple(枚举)
题目链接 Problem Description MG is a rich boy. He has n apples, each has a value of V(0<=V<=9). A ...
- 用synchronized同时修饰父类和子类,线程是安全的。即对象锁可重入
public class SyncDubbo { static class Main { public int i = 10; public synchronized void operationSu ...
- JAVA获取运行环境的信息
System.getProperties().list(System.out); 得到运行环境的信息
- 从零开始学 Web 之 Ajax(五)同步异步请求,数据格式
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- React Native顶|底部导航使用小技巧
导航一直是App开发中比较重要的一个组件,ReactNative提供了两种导航组件供我们使用,分别是:NavigatorIOS和Navigator,但是前者只能用于iOS平台,后者在ReactNati ...
- PHP算法之快速排序、冒泡排序
快速排序 <?php Class Sort { //快速排序 public function quickly($array) { //判断排序的数组是否大于1 if (count($array) ...
- Postman接口测试_添加断言
1.设置环境变量 postman.setEnvironmentVariable("key", "value"); 例子: postman.setEnviron ...
- Oracle字符串函数
Oracle字符串函数 平常我们用Oracle主要有两种字符串类型1.char始终为固定的长度,如果设置了长度小于char列的值,则Oracle会自动用空格填充的.当比较char时,Oracle用空格 ...