我有一些
在asp vnext中,我可以定义3种类型的运行时
- dnxCore
- dnx451
- 网络
在Project.json中,如下所示:
“框架”:
{
“dotnet”:{},
“dnx451”:{},
“dnxcore50”:{}
}^
用户界面显示了这一点
我假设如下:
dnxCore是新的.net核心框架
dotnet是上一个运行时
dnx451:
在project.json中定义“dotnet”或“dnx451”时有什么不同
两者不都应该与.net执行运行时一起运行吗
还取决于我选择的项目模板(vNext ClassLib或vNext Console Lib),默认包含其中一个
以不同的方式回答您的问题:库应该针对SDK所需的环境。如果不需要SDK,请使用netstandard
(或在.NET Core RC2dotnet
之前)
dnxcore50
在CoreCLR/CoreFx上运行的DNX SDK(已弃用,请改用netcoreapp1.0
)- 运行在.Net 4.5.1(桌面CLR/完整BCL和FCL)上的DNX SDK(
dnx451
DNX SDK已弃用,请改用net451
) net46
运行在桌面CLR/完整BCL和FCL上的.Net Framework 4.6 SDKuap10.0
UWP Windows 10 SDK运行在.Net Native/CoreFx上netcoreapp1.0
。运行在CoreCLR/CoreFx上的netcoreapp1.0SDKnetstandard1.5
(RC2,dotnet
之前)声明其依赖项的任何纯IL代码(基于System.Runtime的库,而不是PCL契约)。框架依赖项适用于.Net 4.5.x及以上版本、.Net Core或UWP(不同版本中基于System.Runtime的库集)。由于RC2dotnet
已被弃用,请改用netstandard
netstandard2.0
(.NET Core 2.0;~2017年6月)所有平台(.NET Core、.NET Framework、Xamarin、Mono、Unity3D)必须实现(或抛出NotImplementedException)的仅依赖于netstandard.dll的功能集的任何纯IL代码。
netstandard2.x
大致上是.NET Framework的BCL库(没有诸如WMI、WinForms、WPF、WCF、WWF等FCL组件)。通过兼容性垫片,大多数现有NuGet软件包将自动成为netstandard2.0
因此,如果您的库只有一些算法或不是特定于平台的,请使用netstandard
/dotnet
。如果您的任何依赖项受到限制,此依赖项将传播到使用它的应用程序(例如DNX、UWP、.Net46)
我只能像Malachi一样强调Oren的文章系列。(他刚刚写了一篇新的:https://oren.codes/2015/07/29/targeting-net-core/ 关于同一主题)
注:dotnet
/netstandard
不是一个具体的运行时,而是它的抽象。这是一个目标,在本例中,它甚至没有指定运行时,而是说:任何正确解释IL的东西都会运行。例如,dnxcore5
是一个目标,它指定一个具有特定运行时(CoreCLR)的SDK(DNX)。在这种情况下,您可以进一步假设运行时行为(如JIT的使用、x-plat实现的可用性等)
pps:请注意,dotnet
名称在即将发布的RC2版本中被转换为术语netstandard
。此外,完整的DNX SDK在.NET核心团队和ASP.NET团队之间进行了拆分。因此,.NET核心的框架名字对象(CoreCLR/CoreFx)是netcoreapp1.0
,而ASP.NET堆栈的99%只是具有netstandard1.5
的库。不推荐使用的DNX名字对象(dnx451
和dnxcore50
)。在.NET Framework上运行ASP.NET Core(而不是.NET Core)时,请使用net451
。详情请参阅:https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md
PPP:请继续注意,netstandard1.x
基于依赖关系的契约的概念没有得到进一步发展,而是变成了一个(巨大的)标准契约(32k API;netstandard2.0
),必须由包括即将推出的.NET Core 2.0在内的所有平台实现。此更改的优点是,NuGet软件包的大多数现有生态系统(参考mscorlib
和friends)可以通过使用中间兼容性插件集成到netstandard2.0
软件包中