.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 Standard 2.0 特性介绍和使用指南
  • .NET Core 2.0 特性介绍和使用指南
  • ASP.NET Core 2.0 特性介绍和使用指南
  • 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。

创建.NET Standard类库

也可以通过命令行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类库

1. 创建一个项目

方式一:vs工具

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

方式二:命令行

  • 命令行创建
dotnet new web -o aspnetcore

2. 引用Standard类库

方式一:vs工具

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

方式二:命令行

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

dotnet add reference ../mylibrary/mylibrary.csproj

3. 在Startup.cs文件,添加代码

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

4. 运行

方式一:vs工具

在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类库

方式一:vs工具添加Nuget包

.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(不跨平台)。建议测试应用程序,如果所有功能都按预期工作,您可以阻止警告。

取消警告提醒

方式一:vs工具

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

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

方式二:直接文件修改方式

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

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

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

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

发布NuGet包

方式一:vs工具

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

发布NuGet

方式一:命令行

在命令行工具环境下,编辑项目文件添加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 Standard 2.0新增命名空间提供绘图API啦!
.NET Standard documentation
.NET Standard API

原文地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容