.NET Standard,.Net Core,PCL

Mel*_*per 42 .net c# 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 Standard(定义1) - 基于.NET的运行时环境的一组标准API定义

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

小智 25

围绕这个的文件确实令人困惑,但它大致可以理解为:

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

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

  • .NET核心不要在这里混淆,它是.NET框架的"另一个版本"..NET标准将跨运行时工作(.NET框架,.NET核心,Mono)

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


小智 9

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

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

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

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

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

希望这可以帮助


Mel*_*per 9

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

.NET DLL根据ECMA-335(更好地称为公共语言基础结构)进行格式化.这种格式适用于我们称之为.NET的所有平台; 完整框架,核心,Xamarin,Mono,Silverlight等

你不能使用针对一个平台编译的DLL与另一个平台的原因是该格式没有指定API(一般来说).因此,虽然他们都可以读取DLL,但是你会遇到类XYZ在一个平台上的命名空间ABC和另一个平台上的命名空间DEF中的问题,如果它存在的话.

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

他们使用了类型转发,因此即使您编写了代码期望在名称空间ABC中使用类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

  • 我已经与netfx团队成员进行了交谈。他说,基于netstandard的库如果其代码无法理解,将无法在所有平台上运行。例如,您可以编写netstandard代码打开一个文件,该文件将在Windows上存在,但在Linux上不存在。Nuget不会告诉您刚刚安装的软件包与您的Xamarin Android项目不兼容。Nuget仍然允许您添加软件包,因为您的项目也支持netstandard。这意味着您不再可以依靠nuget来检查软件包的兼容性。一个新的恐怖世界即将到来! (2认同)