57

我有一些在 asp vnext 中我可以定义 3 种运行时类型

  • dnx核心
  • dnx451
  • 点网

在 Project.json 中,它看起来像这样:

"frameworks": 
{
    "dotnet": { },
    "dnx451": { },
    "dnxcore50": { }
}^

用户界面缩短了这个

在此处输入图像描述

我假设如下:

dnxCore是新的 .net 核心框架。

dotnet是以前的运行时

dnx451: 在 project.json 中定义“dotnet”或“dnx451”时有什么不同?

两者都不应该与 .net 执行运行时一起运行吗?

还取决于我选择的项目模板(vNext ClassLib 或 vNext Console Lib)默认包含一个或另一个。

4

2 回答 2

69

以不同的方式回答您的问题:库应针对 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.099% 的 ASP.NET 堆栈只是带有netstandard1.5. 不推荐使用的 DNX 名字对象 (dnx451dnxcore50)。在 .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通过使用中间兼容性填充程序集成到包中。

于 2015-08-07T11:10:13.447 回答
7

dotnet针对大量 .NET Core 4.6 兼容性。参考链接

“dotnet 这是新的 .NET Core,适用于没有任何应用模型要求的包。” -参考链接

因此,根据这些定义, dotnet是新的运行时,而不是以前的运行时

于 2015-07-21T15:50:34.207 回答