以不同的方式回答您的问题:库应针对 SDK 所需的环境。如果您不需要使用 SDK netstandard
(或在 .NET Core RC2 之前dotnet
)。
dnxcore50
在 CoreCLR/CoreFx 上运行的 DNX SDK(已弃用,请netcoreapp1.0
改用)。
dnx451
在 .Net 4.5.1(桌面 CLR/完整 BCL 和 FCL)上运行的 DNX SDK(已弃用,请net451
改用)。
net46
.Net Framework 4.6 SDK 在桌面 CLR / Full BCL 和 FCL 上运行。
uap10.0
在 .Net Native/CoreFx 上运行的 UWP Windows 10 SDK。
netcoreapp1.0
在 CoreCLR/CoreFx 上运行的 .NET Core 1.0 SDK。
netstandard1.5
(RC2,dotnet
之前)任何声明其依赖项的纯 IL 代码(System.Runtime(基于)库而不是 PCL 合同)。框架依赖项可用于 .Net 4.5.x 及更高版本、.NET Core 或 UWP(不同版本中设置的基于 System.Runtime 的库)。dotnet
由于不推荐使用RC2 ,请netstandard
改用。
netstandard2.0
(.NET Core 2.0;~2017 年 6 月)任何纯 IL 代码仅依赖于netstandard.dll
所有平台(.NET Core、.NET Framework、Xamarin、Mono、Unity3D)必须实现(或抛出 NotImplementedException)的功能集。netstandard2.x
大致是 .NET Framework 的 BCL 库(没有 FCL 组件,如 WMI、WinForms、WPF、WCF、WWF ......)。通过兼容性填充程序,大多数现有 NuGet 包将自动成为netstandard2.0
.
因此,如果您的库只有一些算法或不是特定于平台的,请使用netstandard
/ dotnet
。如果您的任何依赖项受到限制,则此依赖项将传播到使用它的应用程序(例如 DNX、UWP、.Net46)。
我只能像玛拉基一样强调奥伦的文章系列。(他刚刚写了一个新的:https ://oren.codes/2015/07/29/targeting-net-core/关于同一主题)。
ps: dotnet
/netstandard
不是具体的运行时,它是它的抽象。它是一个目标,在这种情况下甚至没有指定运行时,而是说:正确解释 IL 的任何东西都可以。例如dnxcore5
,指定具有特定运行时 (CoreCLR) 的 SDK(DNX) 的目标。在这种情况下,您可以对运行时行为做出进一步的假设(如 JIT 的使用、x-plat 实现的可用性等)。
pps:请注意,该名称已在即将发布的 RC2 版本dotnet
中转换为术语。netstandard
此外,完整的 DNX SDK 在 .NET Core 和 ASP.NET 团队之间进行了拆分。因此,.NET Core (CoreCLR/CoreFx) 的框架名称是netcoreapp1.0
99% 的 ASP.NET 堆栈只是带有netstandard1.5
. 不推荐使用的 DNX 名字对象 (dnx451
和dnxcore50
)。在 .NET Framework(而不是 .NET Core)上运行 ASP.NET Core 时,使用net451
. 详细阅读:https ://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md
ppps:请注意,netstandard1.x
基于依赖的合同的概念并未进一步发展,而是改为一个(巨大的)标准合同(32k API;netstandard2.0
),所有平台都必须实施,包括即将推出的 .NET Core 2.0。这种变化的好处是,大多数现有的 NuGet 包生态系统(参考mscorlib
和朋友)可以netstandard2.0
通过使用中间兼容性填充程序集成到包中。