.NET Core 和 PCL 有啥区别?

Posted

技术标签:

【中文标题】.NET Core 和 PCL 有啥区别?【英文标题】:What's the difference between .NET Core and PCLs?.NET Core 和 PCL 有什么区别? 【发布时间】:2015-10-27 02:43:34 【问题描述】:

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

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

所以本质上,我看不出 .NET Core 与 Microsoft 重新命名 PCL 并说“注意我们将开源并针对非 Windows 平台有什么不同!”

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

【问题讨论】:

【参考方案1】:

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

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”同时针对基类库“CoreFx”和 CLR“CoreCLR”。但真正的平台实际上是 DNX(由 ASP.Net 团队提供)和 UWP(由 Windows 团队提供)。

所有这些答案都是我目前对 .Net Core 库情况的理解。它正在进行中,就像帖子中提到的那样,尚未公开记录。

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

【讨论】:

【参考方案2】:

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

.NET Portable 建立在 .NET Full、.NET Core、Windows Phone 等之上,作为一种“桥接层”。 它实际上没有具体实现,将其视为“接口”(合同)的程序集的“包”。 .NET 便携式“包”的范围是动态的,取决于您要“桥接”的“目标”平台。它是您定位的平台的交集,平台越多,包越小。 在运行时,这个 Portable 层被挂钩/适应 .NET full、.net core 或...的实际实现。

【讨论】:

以上是关于.NET Core 和 PCL 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

.Net Framework 和 .Net Core 有啥区别? [复制]

.net Core 多目标和 .net Standard 有啥区别?

.NET 4.5.x 和 .NET Core 有啥区别? [关闭]

.NET Framework 开发包和.net core 有啥区别? [复制]

.NET Core 和 .NET 标准类库项目类型有啥区别?

.NET Core 身份验证中的 AddJwtBearer 和 AddOpenIdConnect 有啥区别?