TL; DR:
鉴于:我编写了一个具有相对可移植功能的库(例如,Left.Pad.©.dll
)。我想通过NuGet提供它。
要求:如果有人想在任何平台的任何平台任何版本上使用我的库通过在任何 IDE或任何代码编辑器中编写代码来安装任何更新的操作系统,他们应该能够做到这一点。
问题:实现该目标的最小 NuGet target frameworks 是什么?
奖金问题:如果存在任何不应该被定位的“死”框架,或者在选择目标框架时应该考虑的其他内容,您也可以提及它。
< / LI>思考(旧版):
NuGet包支持multiple .NET Framework versions and profiles,例如,包可以提供net20,net30,net35,net40,net45,sl3,sl4,sl5等版本。但是,假设在包的功能方面并不总是存在差异,那么提供大量版本将浪费构建时间和包大小并导致不必要的复杂性。另一方面,提供仅支持最低支持的Framework版本的软件包可能会导致功能丢失,例如.NET 4支持多个CLR版本的进程内并行执行,但以前的版本不支持,因此此功能如果只提供.NET 3.5的版本(我不确定;我从未使用它并且不知道细节),将会丢失。如果提供PCL版本,逻辑很简单我假设:只排除PCL涵盖的版本。
答案 0 :(得分:10)
在撰写本文时,最简单的方法是创建一个.NET Standard 1.1项目。它支持
所有现代平台都是如此。如果您想支持旧平台,例如。 .NET Framework 3.0,将其添加为单独的&#34;文件夹&#34;在NuGet。这样,较新的.NET Core应用程序仍然可以使用您的包。
.NET Standard替代PCL。您可以使用PCL定位的最低.NET Framework是4.0,与.NET Standard 1.1相比,它远低于4.5(因此不会使您的软件包更易于访问)。
PCL似乎也不支持.NET Core,而.NET Standard几乎支持所有平台:
另请注意according to Microsoft, only .NET Framework 3.5 SP1 and .NET Framework >= 4.5.2 are currently supported。所有其他.NET Framework版本已经达到使用寿命并且无法获得任何更新。 Windows Phone也已经死了,Silverlight也无处可去。
作为评论中提到的@Lex Li,.NET Standard 1.1具有非常低的API表面,这意味着可能缺少一些重要的API。因此,大多数NuGet包使用更高的.NET标准版本。 建议尽可能使用最低的.NET标准版本。
因此,使用.NET Standard 1.1,您将支持绝大多数现代框架。遗憾的是,我无法找到任何.NET Framework分发统计信息......
如果您确实想要为每个平台提供您的软件包,请查看at the possible target platforms for NuGet。我认为您至少需要net11
和netstandard1.0
,可能会添加一些Silverlight和.NET MicroFramework支持......
答案 1 :(得分:4)
基于给定的asnwers并假设不依赖于特定于平台的技术(如System.Drawing,ASP.NET或WPF;在这种情况下,只需将目标定位到平台即可完成):
netstandard1.0
- netstandard2.0
从.NET Standard 1.0开始,直到达到最大功能。
这应包括:
如果您无法在相对较小的.NET Standard 1.0-1.2的限制范围内合理地实现库,则可能会排除最后三个点。如果您仍然需要它们,请参阅以下几点。
.NET Standard 1.5+增加了对框架和操作系统版本的要求,因此可能需要多目标.NET标准版本才能实现最大兼容性。
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。
这应包括:
net20
- net35
如果您想支持古老的桌面Windows版本(如Windows XP)和未更新的更新Windows版本(如Windows Vista + with .NET 3.0+),您应该直接添加对桌面.NET Framework目标的支持。请注意,从2018-01-01开始,支持的最低.NET为3.5 SP1,因此低于此值可能是不必要的,并且可能会限制API太多而没有实际好处。
这应包括:
还有其他平台,即Xamarin特定的平台,Tizen,.NET Micro等。只能通过直接定位来访问它们。
这应包括:
<强> TL; DR 强>
netstandard1.1
+ portable-net40+win8
+ net35
等内容涵盖了所有相关平台。
当旧的.NET版本完全死亡时,只应保留.NET Standard。好吧,除非微软发明了另一种跨平台统一技术,就像它已经用.NET,.NET PCL,.NET Standard那样......
<强> TL; DR 强>
尽可能使用最低netstandard
。
答案 2 :(得分:2)
您应该定位.net framework 2.0及更高版本。该决定应基于应用程序将在生产中运行的平台。 .net 2.0包含在Windows 2008服务器(SP2及更高版本)中,人们仍然在生产中广泛使用它。 参考https://en.wikipedia.org/wiki/.NET_Framework
答案 3 :(得分:1)
如果您希望它不仅可以在Windows上使用 - .NET Standard就是您的选择。最新的目标是在项目的早期使用哪些库,很少重新访问,新项目倾向于使用最新版本的框架和库。
What .NET Standard versions are supported by what versions of other frameworks(GitHub)。
What .NET Framework versions are supported by which Windows Server versions(MS Docs)。
Server version share in SpiceWork network。 它不是全球数据的表示,但它是我发现了解Windows Server市场份额的最佳数据。
Info on Linux prerequisites for .NET Core versions(MS Docs)。
您可以轻松地根据互联网使用情况找到最近的用户设备市场份额。
查看数字,选择您想要访问的平台,并将它们与可用的.NET版本进行交叉引用。
答案 4 :(得分:0)
定位.Net Standard将为您的nuget包提供在.NET框架,.NET核心,单声道,Xamarin,通用Windows平台和Windows Phone项目中可以使用的奢侈品。
请参阅以下answer
中的以下内容要确定您应定位的.Net标准版本,请使用下表:
如果您不关心Windows Phone Silverlight或.Net标准1.2,我建议您使用.Net标准1.0。
另外,据我所知,很多选择.net核心的人实际上都在使用.net核心2.0,所以你可能想用.net标准2.0为他们创建一个单独的nuget版本。
关于你问题的第二部分,即使一个特定的框架已经死亡并不意味着它会立即消失,它仍然会在它完全死亡之前使用几年,只需转移到不同的选项需要时间
我要考虑的另一件事是常用的库,如Masstransit,EPPlus,以及常用的IOC等。我将对所支持的框架进行一般性研究。他们并遵循,因为许多正在进行的项目可能会被这些图书馆所驱动。