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

Ath*_*ari 19 .net c# compatibility nuget .net-standard

TL; DR:

  • 鉴于:我编写了一个具有相对便携功能的库(例如Left.Pad.©.dll).我想通过NuGet提供它.

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

  • 问:什么是最低的NuGet 目标框架,以实现这一目标?

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


思想(旧版):

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

Com*_*Guy 10

在撰写本文时,最简单的方法是创建.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的可能目标平台.我认为你需要至少,net11并且netstandard1.0可能添加一些Silverlight和.NET MicroFramework支持......


Ath*_*ari 5

2018解决方案

基于给定的答案,并假设不依赖于特定于平台的技术(例如System.Drawing,ASP.NET或WPF;在这种情况下,仅针对您可以并且可以使用的平台):

  1. netstandard1.0netstandard2.0从.NET Standard 1.0开始,直到达到最大功能为止。

    这应该包括:

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

    如果您不能在相对较小的.NET Standard 1.0–1.2的范围内合理地实现该库,则很可能会排除最后三点。如果仍然需要它们,请参阅以下几点。

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

  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提供了一些有用的其他功能,则可以直接将其定位,而不是通过PCL。

    这应该包括:

    • .NET Framework 4.0
    • Windows非通用8.0
    • Windows Phone 8.0
    • Windows Phone Silverlight 8.0
  3. net20net35如果要支持较旧的桌面Windows版本(例如Windows XP)和未更新的较新Windows版本(例如带有.NET 3.0+的Windows Vista +),则应直接添加对桌面.NET Framework目标的支持。请注意,自2018年1月1日起,支持的最低版本.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