NuGet 包应支持哪些 .NET 版本以最大限度地提高其可用性和功能?

Posted

技术标签:

【中文标题】NuGet 包应支持哪些 .NET 版本以最大限度地提高其可用性和功能?【英文标题】:Which .NET versions should be supported by NuGet packages to maximize their availability and functionality? 【发布时间】:2015-10-16 18:50:39 【问题描述】:

TL;DR:

鉴于:我编写了一个具有相对可移植功能的库(例如,Left.Pad.©.dll)。我想通过 NuGet 使其可用。

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

问题:NuGet target frameworks最小集是什么?

额外问题:如果有任何“死”的框架不应该作为目标,或者在选择目标框架时应该考虑的其他因素,你也可以提及。


想法(旧版):

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

【问题讨论】:

只使用需要的最低版本。适用于任何同等或更高版本。 .NET Core 是一个 *framework *(像 Xamarin 和 .NET Framework),Standard 是一个“contract/api”,PCL 已经过时了。这个页面是一个很好的起点:docs.microsoft.com/en-us/dotnet/standard/net-standard它表明对于这样一个通用问题没有通用答案。你所追求的并不明显,也许你应该完全改写这个问题恕我直言。 @SimonMourier NuGet 将它们都称为“frameworks”。无论如何,编辑了这个问题,希望它更清楚。 把这个问题保持这么长时间是没有意义的,因为答案会随着产品生命周期的变化而变化。 正如 lex li 所说,这个问题没有真正的答案。今天,对于一个新项目,我会使用 Microsoft 所宣传的 netstandard 2.0。没有简单的解决方案来支持“任何”、“一切”,就像你想要的那样,我认为这毫无意义(SL 和 WP 已死,PCL 已过时等) 【参考方案1】:

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

.NET Core 1.0 及更高版本 .NET Framework 4.5 及更高版本 Mono、Xamarin、Windows Phone 和 more...

几乎所有的现代平台。如果您想支持较旧的平台,例如。 .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 几乎支持所有平台:

还要注意according to Microsoft, only .NET Framework 3.5 SP1 and .NET Framework >= 4.5.2 are currently supported。所有其他 .NET Framework 版本都已结束生命周期,不会获得任何更新。 Windows Phone 也死了,Silverlight 也没有任何进展。

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

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


如果您真的想让您的软件包适用于每个平台,请查看at the possible target platforms for NuGet。我认为您至少需要 net11netstandard1.0,也许添加一些 Silverlight 和 .NET MicroFramework 支持...

【讨论】:

Silverlight 虽然生命周期在 2022 年结束,但几乎没有主流浏览器支持它。您可能还应该指出,.NET Standard 1.1 的 API 表面非常小,而且 NuGet 上大多数著名的 .NET 开源库都针对 1.3 或 2.0。 我对这张表的最后 3 行感到困惑。 Windows 版本如何限制与 .NET Standard 的兼容性? / 那些对服务器感兴趣的人我猜是在最新的 .NET Core 上,而 SL 正式死了,所以 PCL 的这些部分无关紧要。剩下的唯一相关部分可能是较旧的 Win8 通用应用程序(呃,这种“通用”平台的混乱)。 .NET 4.0 的一个主要特性是它可以在 Windows XP 上使用,这有点死,但在 Enterprise 中并不完全如此。 总的来说,如果我决定从netstandard1.1 降级,看起来我会以net40/portable-net40+win8 为目标,甚至更低net35。因此,与至少远程相关平台的最大兼容性点似乎是netstandard1.1+portable-net40+win8+net35 @LexLi 如果我从netstandard1.1 切换到netstandard1.3netstandard2.0,我会错过哪些兼容性? 1.3 似乎需要增加主 .NET Framework 的版本(4.5 vs 4.6)并放弃对 WP 的支持,2.0 似乎也需要更新操作系统。那是对的吗?我对兼容性表中的最后 3 行感到满意。 @Athari “Windows”行似乎是指 Windows 8 附带的 Windows Store 应用程序。.NET Core 版本与操作系统版本无关,请参阅supported .NET Core 2 operating systems。如果您使用 netstandard1.3+portable-net40+win8+net35 而不是 netstandard1.1+...,则只会失去 Windows Store/Windows Phone 支持,因为 net35 涵盖其他 .NET Framework 版本。【参考方案2】:

2018年解决方案

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

    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 版本以实现最大兼容性。

    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

    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

    还有其他平台,即特定于 Xamarin 的平台、Tizen、.NET Micro 等。它们只能通过直接定位它们来访问。

    这应该包括:

    其他一切

TL;DR

netstandard1.1+portable-net40+win8+net35 之类的内容涵盖了所有相关平台。

未来的解决方案

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

TL;DR

尽可能使用最低的netstandard

【讨论】:

【参考方案3】:

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

【讨论】:

我已经向related/kind-of follow-up question 询问了如何 以“.NET Framework # 及更高版本”为目标。【参考方案4】:

如果您希望它不仅在 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 文档)。

Server version share in SpiceWork network。 它不是全球数据的代表,但它是我发现的用于了解 Windows Server 市场份额的最佳数据。

Info on Linux prerequisites for .NET Core versions(MS 文档)。

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

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

【讨论】:

【参考方案5】:

以 .Net Standard 为目标将使您的 nuget 包能够在 .NET 框架、.NET core、mono、Xamarin、通用 Windows 平台和 Windows Phone 项目中使用。

以下内容来自answer

要确定您应该针对哪个版本的 .Net 标准,请使用下表:

Source.

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

此外,据我所知,很多选择 .net core 的人实际上都在使用 .net core 2.0,因此您可能希望使用 .net standard 2.0 为他们创建一个单独的 nuget 版本。

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

我要考虑的另一件事是常用的库,如Masstransit、EPPlus,以及常用的 IOC 等。我将大致了解它们支持的框架并遵循,因为许多正在进行的项目可能是由此类库驱动的。

【讨论】:

以上是关于NuGet 包应支持哪些 .NET 版本以最大限度地提高其可用性和功能?的主要内容,如果未能解决你的问题,请参考以下文章

数商云:以数字化全面促进传统产业升级,纺织行业最大限度实现精益管理

为啥 ASP.NET MVC 4 有这么多的 NuGet 包,哪些是真正重要的?

.NET System.Drawing.Common 4.5.1 的 NuGet 包包含错误版本的程序集

持续唤醒和睡眠以最大限度地减少 Linux 上的功耗?

php 我创建的缩小php脚本,以最大限度地提高Googles页面速度得分

Github自动打包并推送Nuget包