NuGet包应该支持哪些.NET版本以最大化其可用性和function?

TL; DR:

  • 鉴于:我编写了一个具有相对便携function的库(例如, Left.Pad.©.dll )。 我想通过NuGet让它可用。

  • 要求:如果有人想在任何操作系统的任何版本上通过在任何 IDE或任何代码编辑器中编写代码来安装任何更新的任何版本的任何平台上使用我的库,他们应该能够这样做。

  • 问题:实现该目标最小 NuGet 目标框架是什么?

  • 奖金问题:如果存在任何不应该被定位的“死”框架,或者在选择目标框架时应该考虑的其他内容,您也可以提及它。


思想(旧版):

NuGet包支持多个.NET Framework版本和配置文件 ,例如,包可以提供net20,net30,net35,net40,net45,sl3,sl4,sl5等版本。 但是,假设包的function并不总是存在差异 ,提供大量版本将浪费构建时间和包大小,并导致不必要的复杂性。 另一方面,仅为最低支持的Framework版本提供软件包可能会导致function丢失,例如.NET 4支持多个CLR版本的进程内并行执行,但以前的版本不支持,因此此function如果只提供.NET 3.5的版本(我不确定;我从未使用它并且不知道细节),将会丢失。 如果提供了PCL版本,逻辑很简单我假设:只排除PCL涵盖的版本。

在撰写本文时,最简单的方法是创建.NET Standard 1.1项目。 它支持

  • .NET Core 1.0及更高版本
  • .NET Framework 4.5及更高版本
  • Mono,Xamarin,Windows Phone等……

几乎所有的现代平台都是如此。 如果您想支持旧平台,例如。 在.NET Framework 3.0中,将其添加为NuGet中的单独“文件夹”。 这样,较新的.NET Core应用程序仍然可以使用您的包。


更多信息

.NET Standard是PCL的替代品。 您可以使用PCL定位的最低.NET Framework是4.0,与.NET Standard 1.1相比,它不会低于4.5(因此不会使您的程序包更易于访问)。

PCL似乎也不支持.NET Core,而.NET Standard几乎支持所有平台: .NET标准支持表

另请注意, 根据Microsoft,目前仅支持.NET Framework 3.5 SP1和.NET Framework> = 4.5.2 。 所有其他.NET Framework版本已经达到使用寿命,并且不会获得任何更新。 Windows Phone也已经死了,Silverlight也没有出现在任何地方。

正如@Lex Li在评论中提到的,.NET Standard 1.1具有非常低的API表面,这意味着可能缺少一些重要的API。 因此,大多数NuGet包使用更高的.NET标准版本。 建议尽可能使用最低的.NET标准版本。

因此,使用.NET Standard 1.1,您将支持绝大多数现代框架。 可悲的是,我找不到任何.NET Framework分发统计信息……


如果您真的想让您的软件包适用于每个平台 ,请查看NuGet的可能目标平台 。 我认为你需要至少net11netstandard1.0 ,可能会添加一些Silverlight和.NET MicroFramework支持……

解决方案2018年

基于给定的asnwers并假设不依赖于特定于平台的技术(例如System.Drawing,ASP.NET或WPF;在这种情况下,只需将平台定位到您可以完成的平台):

  1. netstandard1.0netstandard2.0从.NET Standard 1.0开始直到达到最大function。

    这应包括:

    • .NET Framework 4.5
    • .NET Core 1.0
    • 单声道4.6
    • Xamarin.iOS 10.0
    • Xamarin.Android 7.0
    • Windows Universal 10.0
    • Windows非Universal 8.0(最高.NET标准1.2)
    • Windows Phone 8.1(最高.NET标准1.2)
    • Windows Phone Silverlight 8.0(最高为.NET Standard 1.0)

    如果您无法在相对较小的.NET Standard 1.0-1.2的限制范围内合理地实现库,则可能会排除最后三个点。 如果您仍然需要它们,请参阅下面的要点。

    .NET Standard 1.5+增加了对框架和操作系统版本的要求,因此可能需要多目标.NET标准版本才能实现最大兼容性。

  2. portable-net40+*下一个主要观点是过时的PCL。 它的.NET Framework 4.5+版本并不相关,因为它们主要由.NET Standard涵盖。 如果要支持Windows Phone 8和非通用Windows Store 8,则应通过PCL进行,除非您受到API的限制,在这种情况下,您必须添加特定于平台的目标。

    如果您不需要任何其他平台,并且.NET Framework 4.0在.NET 3.5上提供了一些有用的附加function,则可以直接将其定位,而不是通过PCL。

    这应包括:

    • .NET Framework 4.0
    • Windows非Universal 8.0
    • Windows Phone 8.0
    • Windows Phone Silverlight 8.0
  3. net20net35如果要支持古老的桌面Windows版本(如Windows XP)和未更新的最新Windows版本(如Windows Vista + with .NET 3.0+),则应直接添加对桌面.NET Framework目标的支持。 请注意,从2018-01-01开始,支持的最低.NET为3.5 SP1,因此低于此值可能是不必要的,并且可能会限制API太多而没有实际好处。

    这应包括:

    • .NET Framework 2.0-3.5
    • Windows XP
  4. 还有其他平台,即Xamarin特定的平台,Tizen,.NET Micro等。只能通过直接定位来访问它们。

    这应包括:

    • 其他一切

TL; DR

netstandard1.1 + portable-net40+win8 + net35涵盖了所有相关平台。

解决未来

当旧的.NET版本完全消亡时,只应保留.NET Standard。 好吧,除非微软发明了另一种跨平台的统一技术,就像它已经用.NET,.NET PCL,.NET Standard一样……

TL; DR

使用最低的netstandard

您应该以.net framework 2.0及更高版本为目标。 决策应基于应用程序将在生产中运行的平台。 .net 2.0包含在Windows 2008服务器(SP2及更高版本)中,人们仍然在生产中广泛使用它。 参考https://en.wikipedia.org/wiki/.NET_Framework

如果您希望它不仅可以在Windows上使用 – .NET Standard就是您的选择。 最新的目标是在项目的早期使用哪些库,而且很少重新访问,新项目倾向于使用最新版本的框架和库。

  • 其他框架 (GitHub)的哪些版本支持哪些.NET标准版本 。

  • Windows Server版本 (MS Docs) 支持哪些.NET Framework版本 。

  • SpiceWork网络中的服务器版本共享 。 它不是全球数据的代表 ,但它是我发现了解Windows Server市场份额的最佳数据。

  • 有关.NET Core版本 (MS Docs)的Linux先决条件的信息 。

您可以轻松地根据互联网使用情况找到最近的用户设备市场份额。

查看数字,选择要访问的平台,并将它们与可用的.NET版本进行交叉引用。

定位.Net标准将为您的nuget包提供在.NET框架,.NET核心,单声道,Xamarin,通用Windows平台和Windows Phone项目中可以使用的奢侈品。

请参阅本答案中的以下内容

.Net标准

要确定要定位的.Net标准版本,请使用下表:

.net标准支持表

来源 。

看看上面的表格,如果您不关心Windows Phone Silverlight或.Net标准1.2,我建议使用.Net标准1.0。

另外,据我所知,很多选择.net核心的人实际上都在使用.net核心2.0,所以你可能想用.net标准2.0为他们创建一个单独的nuget版本。

关于你问题的第二部分,即使一个特定的框架已经死了并不意味着它会立即消失,它仍然会在它完全死亡之前使用几年,只需转移到不同的选项需要时间。

我要考虑的另一件事是常用的库,如Masstransit , EPPlus和常用的IOC等。我会对它们支持的框架进行一般性的观察并遵循,因为许多正在进行的项目可能是由这些图书馆。