.NET Standard,.Net Core,PCL

时间:2016-08-20 05:48:33

标签: c# .net xamarin .net-core

我对所有关于.Net Standard的讨论感到困惑。从某种意义上说,标准.NET库的想法听起来很棒。我注意到在NuGet库中,您可以为许多平台选择.NET Standard(例如Silverlight)。但这让我感到困惑。 .NET标准是一个库吗?还是DLL格式?

无论如何,现在有.NET Core项目,以及旧的PCL项目,但我没有看到.NET Standard的任何Visual Studio模板。虽然,我确实发现如果你进入项目的设置,你可以将现有的PCL库切换到.NET Standard。

无论如何,我要问的基本问题是我们应该针对哪种类型的库?我主要是为Xamarin项目做这件事,但如果我们可以与其他平台共享这些库,那将会很棒,特别是.NET Core和UWP。

但是,我真的很困惑为什么微软同时推出了两个看似相同的库类型:.NET Core和.NET Standard。

编辑:我现在对此并不那么困惑。我正在编辑原帖,因为我还没有完全回答我自己的问题。以下是我认为理解这些事情的关键。我愿意接受更正。

解释

NET Core - 基于.NET的运行时环境,符合.NET标准API定义。

PCL - 基于.NET的库格式,由多个运行时环境支持,包括.NET,Mono,Windows Phone等

.NET标准(定义1) - 基于.NET的运行时环境的一组标准API定义

.NET标准(定义2) - 基于.NET的库格式,由多个运行时环境支持,包括.NET,Mono,Windows Phone等,这是PCL格式的延续。在Visual Studio中,可以通过访问项目的属性并编辑目标框架将PCL库转换为.NET标准库。

4 个答案:

答案 0 :(得分:25)

这方面的文件确实令人困惑,但大致可以理解为:

  • PCL:以一组平台为目标的库(具有这些平台的API的“最小公分母”)。因此,在编写PCL时,您说我想要以平台A,B,C

  • 为目标
  • .NET标准:一组“标准”API而非平台。所以基本上你不关心平台,只关注标准(版本1.3,1.6 ......),你的代码将适用于支持它的所有平台。

  • 这里不要混淆.NET核心,它是.NET框架的“另一个版本”。 .NET标准将适用于跨运行时(.NET框架,.NET核,Mono)

所以我认为.NET标准是要走的路:)

答案 1 :(得分:9)

我相信这个资源可以回答你的大部分问题:

https://docs.microsoft.com/en-us/dotnet/articles/standard/library

  

.NET标准库是.NET API的正式规范,旨在提供给所有.NET运行时。标准库背后的动机是在.NET生态系统中建立更大的一致性。

据我了解,其他库类型是特定于平台的,而.NET标准与平台无关。

如果您希望您的代码在不同平台上可用,那么.NET标准似乎是理想的,但要密切关注其他平台支持的.NET标准版本(参见链接表)。

希望这有帮助

答案 2 :(得分:9)

来自Samuel Englard(https://github.com/dotnet/corefx/issues/973#issuecomment-249582799):

  

.NET DLL的格式符合ECMA-335(更好地称为   公共语言基础设施)。这种格式适用于所有人   我们称之为.NET的平台;完整框架,核心,Xamarin,Mono,   Silverlight等

     

你无法使用针对一个平台编译的DLL的原因   另一个原因是格式没有指定API(一般来说)。   因此,虽然他们都可以读取DLL,但你会遇到类问题   XYZ在一个平台上的命名空间A.B.C中,在命名空间D.E.F上   另一个,如果它存在的话。

     

PCL通过做两件事来解决这个问题:

     

他们使用了类型转发,因此即使您在代码名称A.B.C中编写了期望类XYZ的代码,也可以在其他地方使用它的平台上找到它。   它将您可以使用的API限制为您想要的所有平台共享的最低公共集。

     

将PCL转换为.NET标准项目并非如此   由于输出格式而重新编译,但由于元数据   包括(特别是类型转发)。

所以,我认为基本上.NET标准库与PCL库没有什么不同,除了它们将一个层放在不同标准化API集的顶层之外,这些API可能实现不同的指针(类型转发)

.NET Core当然是一个运行时环境,但我认为它与.NET Standard非常接近。除了它实现.NET标准API之外,我认为它与它没有任何特殊的关系。

请参阅此词汇表: https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/glossary.md

答案 3 :(得分:3)

标准用于定位与Android API版本类似的特定API集。 nuget库只是元包,包含所有符合标准的库。

Scott Hunter在MSDEV节目中已经很好地解释了这个概念。值得一试 - http://msdevshow.com/2016/07/dot-net-core-with-scott-hunter/