标签:
本文介绍如何使用 .NET 标准,更容易地实现向 .NET Core 迁移。文中会讨论计划包含的 APIs,跨构架兼容性如何工作以及这对 .NET Core 意味着什么。
如果你对细节感兴趣,这篇文章正是为你准备的;如果你没有那么多时间或者对细节并不感兴趣,你可以仅仅只阅读 TL;DR 章节。
对于跨平台的 .NET 开发者来说,.NET 标准解决了编码共享的问题。.NET 标准带来了所有你所需要的和期待的,跨环境的 APIs:桌面应用,移动应用/游戏和云服务。
在文章中的介绍 .NET Core 部分会详细解释,.NET 平台已经分离开很多年了。
一方面,这其实是一个很好的事情。它允许根据需求来裁剪 .NET,这是一个单平台做不到的。例如,.NET Compact Framework 的创建是为了适应2000年代手机发展的足迹。今天同样也是这样:统一集合运行在20多个平台上。对于任何期待的技术来说,能够分离和定制是一项很重要的能力。
但另一方面,平台分离也给 .NET 多平台的开发者编写代码带来了很大的问题,因为没有一个统一的库类来使用:
目前 .NET 有三种主要的风格,这意味着你必须要掌握三种不同的基类库,来编写跨三种风格的代码。比起 .NET 被创立之初时,现状已变得更加的多样。微软或者其它人将会创建新的 .NET 风格,来支持新的操作系统或者裁剪 .NET 来适应特殊设备的兼容。
对于开发者来说,这意味着他们只需要掌握一个基础类库。针对 .NET 标准的库类,将能够在所有的 .NET 平台上运行。平台提供者不需要再猜测他们需要提供哪些 APIs ,来对应 NuGet 上获取的库类。
总而言之,我们需要 .NET 标准,原因有二:
当我们发布 .NET Core 1.0 时,我们还推出了 .NET 标准。还有很多个 .NET 标准的版本,来表示跨当前所有平台的 APIs 的可用性。下表显示了一个现有的平台的版本,与 .NET 标准的一个给定版本的兼容:
.NET平台 |
.NET标准 |
|||||||
1.0 |
1.1 |
1.2 |
1.3 |
1.4 |
1.5 |
1.6 |
2.0 |
|
.NET Core |
→ |
→ |
→ |
→ |
→ |
→ |
1.0 |
vNext |
.NET框架 |
→ |
4.5 |
4.5.1 |
4.6 |
4.6.1 |
4.6.2 |
vNext |
4.6.1 |
Xamarin.iOS |
→ |
→ |
→ |
→ |
→ |
→ |
→ |
vNext |
Xamarin.Android |
→ |
→ |
→ |
→ |
→ |
→ |
→ |
vNext |
通用的Windows平台 |
→ |
→ |
→ |
→ |
10.0 |
→ |
→ |
vNext |
视窗 |
→ |
8 |
8.1 |
|||||
Windows手机 |
→ |
→ |
8.1 |
|||||
Windows Phone的Silverlight的 |
8 |
箭头表示,该平台支持更高版本的 .NET 标准。例如,.NET Core 1.0 支持 .NET 标准1.6版,这就是为什么有指向的较低版本1.0 - 1.5的右箭头。
你可以借此来了解 .NET 标准的最高版本,以便根据你计划运行的 .NET 平台,更有针对性的选择。举例来说,如果你想在 .NET Framework 4.5 和 .NET Core 1.0 上运行,你可以最多可以选择 .NET 标准1.1。
您还可以看到哪些平台将支持 .NET 2.0 标准:
.NET 标准也与便携式类库兼容。从 PCLs 属性到 .NET 标准版本的映射列在我们的文档。
从一个目标 .NET 标准库类中,你就可以引用两个其它的类库:
从图形上看,就像这样:
不幸的是,NuGet 上 PCLs 和 .NET 标准的采用,并不是那么高。这是一个给定的目标包中有多少次发生在 NuGet.org:
目标 |
出现次数 |
.NET框架 |
46894 |
.NET标准 |
1886 |
Portable |
4501 |
正如你所看到的,这是很清楚, NuGet 上的绝大多数的类库,都是以 .NET 框架为目标的。但是,我们也知道那些库类中的很大一部分,都只使用了我们在 .NET2.0 标准中提供的 APIs。
在 .NET 2.0 标准中,我们将有可能使用以 .NET 标准为目标的库类,同样也可以通过兼容性的功能,实现现有的 .NET框架二进制文件的引用:
当然,这只是在 .NET 框架库使用 .NET 标准中可用的 APIs 时,才会起作用。这就是为什么这不是首选方式,来创建跨不同的 .NET 平台使用的库。然而,这种兼容性功能提供了一个桥梁,使你可以转换库类到 .NET 标准,而不必放弃那些没有被转换,却还在引用的现有库类。
如果您想了解更多关于兼容性功能是如何工作的,请看的规范 .NET 2.0 标准。
一个标准只有当平台实现时才有用。与此同时,我们也希望使得 .NET 标准有用并有意义,这是因为对以标准为目标的库类来说,这些 APIs 是可以用的:
下面列出了支持.NET标准的 .NET Framework 版本:
|
1.4 |
1.5 |
1.6 |
2.0 |
.NET Framework |
4.6.1 |
4.6.2 |
vNext |
4.6.1 |
为了让 .NET FrameWork 4.6.1 支持 .NET 2.0 标准,我们不得不删除所有的 .NET 标准中引入的 APIs。紧随普通版本规则之后,可以预料,.NET 2.0 标准将只会被一个更新的 .NET Framework 所支持。考虑到 .NET FrameWork 4.6.2 的最新版本只支持 .NET 1.5 标准。这意味着,针对 .NET 2.0 标准编制的库,不会运行在绝大多数 .NET 框架的安装上。
你可能想知道这一决定带来的影响是什么。我们针对 .NET1.5 标准和更高的版本,使用所有的 APIs 在 NuGet.org 上对所有的包,进行分析。在写这篇文章的时候,只发现了6个非微软的包做到这一点。我们会接触到这些包的拥有者,并与他们合作,以解决这个问题。从看它们的用来看途,很显然,他们的调用能够被 .NET 2.0 标准的 APIs 所代替。
为了使这些包能支持 .NET 1.5 标准,1.6 和 2.0,他们需要针对这些版本进行交叉编译。或者,他们可以选择对 .NET2.0 标准或更高版本给予广泛平台的支持。
为了决定哪些 APIs 会成为 .NET 标准的一部分,我们使用下面的方法:
可选 APIs 不是 .NET 标准的一部分,但可作为单独的 NuGet 包。我们尝试针对 .NET 标准,作为库类创建他们,以至于他们的实现可以根据平台的不同而定制,但对于平台特殊的 APIs,这不总是可行的。
为了使一些 APIs 可选,我们不得不删除这是必需 APIs 集的一部分其他 APIs。例如,我们决定在 .NET 标准中具有 AppDomain,而代码访问安全性(CAS)是一个传统部件。这就要求我们删除 AppDomain 中使用 CAS 类型包含的所有成员,如创建域中的重载。
.NET 标准 APIs 集,以及我们可选 APIs 的提议,将会被 .NET 标准的审查机构审阅。
这里是 .NET 2.0 标准的 APIs 界面的高度概括:
如果你想看看 .NET 2.0 标准特定的 APIs 集,你可以看看 .NET 标准 GitHub 的信息库。请注意,.NET 2.0 标准是一项正在进行的工作,这意味着一些 APIs 可能会增加,而另一些可能会被删除。
创建多平台库类的经验中的一个最大挑战,就是避免只有大众化的东西,同时确保你不会意外地创建原本不打算创建的库类。
在 PCLs,我们通过拥有多个配置文件(其中每一个代表着一套平台的交集),解决了这个问题。这样做的好处是,允许你在一组目标之间,最大输出该 APIs 界面。.NET 标准代表了所有 .NET 平台必须要实现的一组 APIs。
这也带来了问题,那就是如何定义那些无法在全部平台上实现的 APIs:
对于这些APIs,我们有以下的选项:
我们相信,最好的选择是一个组合。正如上面提到的,我们希望 .NET 标准代表一组所有 .NET 平台都要求实现的 APIs。我们要让这个设定合理地实施,同时确保流行的 APIs 也都存在,这样编写跨平台的库会非常简单,直观。
解决只在一些 .NET 平台可用的技术的一般策略是:提供给他们 .NET 标准上的 NuGet 包。所以,如果你创建一个基于 .NET 标准的库时,它会默认不引用这些 APIs 。你必须添加一个 NuGet 包进来。
对于自包含的并且可以整理成独立包的 APIs 来说,这种策略工作得很好。对于单个类型成员不能在所有环境下实现的情况,我们将使用第二和第三种方法:平台必须有这些成员,但他们可以决定丢弃或模仿他们。
让我们看几个例子,了解我们是计划如何模拟它们:
一般情况下,就像你今天做的,你可以通过以特殊 .NET 平台为目标,使用 .NET 标准中还没可用的 APIs 工作。我们正在考虑如何才能改善我们的工具,来帮助特殊平台与位置平台之间迁移地更加流畅,你可以根据你的情境做出最好的选择,不必考虑早先设计的选择。
总结:
我们的目标是让 .NET 基础标准库尽可能强大的并具有表现力,同时让你了解到你所依赖的技术并不是在任何环境下都起作用。
我们设计 .NET Core,是为了它的引用程序集是 .NET 可移植的。这使得它很难增加新的 APIs ,因为在 .NET Core 中添加这些 APIs,取代了决定这些 APIs 是否在任何环境下都可用。更糟的是,由于版本规则,这也意味着我们必须决定哪些 APIs 的组合在老版本中是可用的。
从 .NET Core 中分离便携性,帮助我们加快 .NET Core 的发展,使得新特性的实验更加的容易。除了人工设计位于现存平台顶端的特性,我们可以简单的修改底层,以便支持这个特性。我们还可以将 APIs 添加到逻辑上归属的类型中,而不必担心类型是否已经在其它平台上拓展过。
给 .NET Core 中添加新的 APIs 已经不是一个陈述了,我们对 .NET 标准的目标,是创造 .NET 平台之间的一致性,所以新的类型成员成为标准的一部分,在标准更新时已经被自动考虑了。
作为一个库类开发者,你应该考虑切换到 .NET 标准,因为以多 .NET 平台为目标,它会取代便携式库类。
在 .NET 1.x 标准下,可用的 APIs 集合与 PCLs 非常相似。但是,.NET 2.x 标准将会有更大的 APIs 集,这也允许你依赖于 .NET 框架的库类。
PCLs和 .NET 标准之间的主要区别是:
为了做出明智的决定,我建议你:
例如,如果你想确认你是否能够使用 .NET2.0 标准,你可以通过以下的 APIs 文件命令行工具并且像这样运行你的库类,来检测应该使用 .NET1.6 标准还是 .NET2.0 标准:
> APIs port analyze -f C:\src\mylibs\ -t ".NET Standard,Version=1.6"^
-t ".NET Standard,Version=2.0"
注: .NET 标准2.0 仍然在制定中,因此 APIs 的可用性随时可能更改。我也建议你注意,那些在 .NET1.6 标准中可用,但是在 .NET2.0 标准中移除的APIs。
我们已经创建了 .NET 标准,以便使得多个 .NET 平台之间代码的共享和复用变得更加容易。
在 .NET 2.0 标准中,我们更关注于兼容性。为了在 .NET Core 和 UWP 中支持 .NET 2.0 标准,我们将扩展这些平台,以便包括更多的现有的 APIs 。这也包含了兼容性功能,这种兼容性功能允许引用 .NET 框架中无法编译的二进制文件。
展望未来,我们建议你使用 .NET 标准,而不是便携式类库。.NET 2.0 标准也会在即将到来的 Visual Studio “Dev 15”发布的同时,进行推广。你可以以一个 NuGet 包的形式,来引用 .NET 标准。对于 Visual Studio, VS Code 和 Xamarin Studio,将会有一流的库类支持。
文章来源:by
原文链接:https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/
标签:
原文地址:http://www.cnblogs.com/powertoolsteam/p/introducing_net_standard.html