.NET Core 和 PCL 之间有什么区别?

What's the difference between .NET Core and PCLs?

我最近正在为我的 PCL 编写支持的平台,其中之一是其他 PCL。如果我的库(以 .NET Framework 4.5 和 Windows/Phone 8.1 为目标)是否也可以在 .NET Core 项目中使用,我感到很困惑。

据我了解,PCLs 允许您跨多个平台共享代码而无需重新编译,而 .NET Core 也这样做。唯一的区别是 .NET Core 面向少数 个平台,即OS X 和Linux,并且是开源的。

所以从本质上讲,我看不出 .NET Core 与 Microsoft 重塑 PCL 并说“请注意 我们将开源有何不同并针对非 Windows 平台!"

所以最重要的是,PCL是否与 .NET Core 兼容,反之亦然?它们有什么区别?

有一个关于它的漂亮文章系列解决了我的问题...

https://oren.codes/2015/06/16/demystifying-pcls-net-core-dnx-and-uwp-redux/ https://oren.codes/2015/07/29/targeting-net-core/

.Net Core 将所有库(例如 System.IO)放在单独的 NuGet 包中(每个包都可用于 SDK DNX、UWP 和 .Net 4.6)。第三方库以 dnxcore50 (DNX) 或 uap10.0 (UWP) 为目标,如果它们本地访问平台或依赖于它们的功能。如果他们不访问该平台而仅依赖于其他包,则他们应该以 dotnet.

为目标

dotnet 实际上意味着:我与满足我的依赖关系的任何平台兼容(你的库 XYZ "dotnet" 使用 System.Reflection dnxcore5+net45 不能被使用UWP uap10.0 应用)。这有效地结束了平台的组合噩梦。之前的目标组合 dnxcore5+net45 在平台库之间创建了一个交叉点,每次添加都会使情况变得更糟。另一方面,dotnet 不会将库限制在目标上,而是将此限制决定转发给它的依赖项(突然出现像著名的 unicorn 平台这样的新限制)。

因此,作为图书馆作者,如果您只需要其他图书馆,您可以选择 dotnet

回答您的问题:

  • 如果您根据需要添加目标 dotnetdnxcore50uap10.0,则您的 PCL 与 DNX 和 UWP 等 .Net Core 风格环境兼容您的图书馆(请参阅 Owen 的文章以了解与合同配置文件 259 相同的基本兼容性)。
  • .Net Core 不仅仅是一组 PCLed 库。它是一个新的 CLR、一个新的有组织的框架(打包成小部分)和新的 .Net SDK(DNX、UWP 和接下来出现的任何东西)的基础设施。术语“.Net Core”同时针对基础 class 库 "CoreFx" 和 CLR "CoreCLR"。但真正的平台实际上是 DNX(ASP.Net 团队)和 UWP(Windows 团队)。

所有这些答案都是我目前对 .Net Core 库情况的理解。它正在进行中,如帖子中所述,尚未 public 记录。

注意 2016 年 12 月:请注意,dotnet 作为 netstandard1.x 的前身,其概念从 netstandard2.x 开始发生了变化(.NET Core 2.0;~ 2017 年 6 月)。从 netstandard2.0 开始,将有一个 one 通用契约(netstandard.dll),所有平台(.NET Core、.NET Framework、Xamarin、Mono、Unity3D)都实现了.该合同将随着时间的推移而延长,平台必须放弃对最新标准的支持,抛出 NotImplementedException 或实施它。

我的理解是它们在概念上是不同的。

  • .NET Portable 建立在 .NET Full、.NET Core、Windows Phone 等之上,类似于 'bridging layer'。
  • 它实际上没有具体的实现,认为它是 'Interfaces'(合同)的 'Package' 程序集。
  • .NET Portable 'Package' 的范围是动态的,取决于您要使用的 'Targets' 平台 'bridge'。它是您针对的平台的交集,平台越多,包越小。
  • 在运行时,此可移植层 hooked/adapted 到 .NET full、.net core 或...的真正实现