如何确定 .net 框架版本以创建库 [重复]

Posted

技术标签:

【中文标题】如何确定 .net 框架版本以创建库 [重复]【英文标题】:How to decide .net framework versions to create a library [duplicate] 【发布时间】:2019-04-29 06:40:25 【问题描述】:

我想创建一个库以在 .Net 框架应用程序和 Xamarin 应用程序中使用。但是有 3 个框架版本:

.net 核心 .net 框架 .net 标准

所以我无法决定使用我的公共库的哪个版本。

    如果我创建一个 .net 标准库,它是否可以在 .net 框架和 .net 核心中工作。 如果我创建一个 .net 核心库,它是否可以在 .net 框架和 .net 标准中工作。

我对框架感到困惑。

【问题讨论】:

也许this 会有所帮助 【参考方案1】:

这可能会帮助您做出决定

    .Net Standard :用于构建可从所有 .NET 实现(例如 .NET Framework、.NET Core 和 Xamarin)引用的库 .Net Core :用于构建跨平台控制台应用程序和 ASP.NET Core Web 应用程序和云服务。

因此,如果您希望所有不同类型的 .Net 实现都支持您的库,那么 .Net 标准就是您要走的路。

【讨论】:

版本号重要吗?例如:.net 标准 x vesion 是否支持 .net 框架 y 版本? .Net 标准对每个版本都有不同的 API 集,例如 .Net 标准 2.0 比以前的版本有更多的 API。 .Net 框架版本完全支持每个版本。 @MuhammadHannan:.Net 框架版本完全支持每个版本 Aaaaaaaahh,应该小心该声明。到目前为止,这仅适用于当前发布的 .NET Standard 版本(1.0-1.6、2.0)。 .NET Standard 2.1 很可能(尚未发布最终版本,因此决定可能会改变)添加与 .NET Framework 的任何(可能是未来)版本不兼容的 API。见Announcing .NET Standard 2.1。 原因在博客中有解释(基本上是新的Span<T> 和更多的 api 来到 .NET 标准 2.1)并且 .NET Framework 不会实现这些,因为更改需要大量的工作在 .NET Framework 运行时上添加对这些的支持,因为破坏向后兼容性的风险很高(因为 .NET 框架在超过十亿台机器上运行,并且不支持像 .NET Core 那样的并行运行时)跨度> @Tseng 感谢您提到这一点。这就是为什么我只提到v2.0。【参考方案2】:

当您编写 C# 库时,我想您知道类和接口之间的区别。类是某些功能集的具体实现,而接口定义了您可以从实现它的实例中获得哪些功能。

以此为例,.NET Framework 和 .NET Core 就像类。 .NET Framework 是“经典”实现,.NET Core 是较新的实现,具有能够在 Linux 上运行等优势。如果您构建一个以 .NET Core 或 .NET Framework 为目标的库,那么您就是在构建它以针对这些具体实现之一。

另一方面,.NET Standard 就像一个接口。每个版本的 .NET Standard 都提供了一组功能,different versions of .NET Framework/.NET Core implement different versions of .NET Standard。当您构建一个针对给定版本的 .NET Standard 的库时,您是在说您可以支持该表对应列中的所有具体实现。

确定目标的 .NET Standard 版本取决于实现库所需的功能。更多的功能通常意味着更高的版本并支持更少的实现。更少的功能意味着更低的版本和更广泛的支持。

【讨论】:

【参考方案3】:

这里有很多令人困惑的其他答案。

首先,这取决于您所针对的平台。

    它是您想要与全世界共享的通用库吗? 它是在多个平台上使用的特定于应用程序的库(即同一应用程序的可重用代码,即业务线应用程序)

案例一

您应该使用 .NET Standard,因为它为您提供了最多的平台。您使用哪个版本,取决于您需要的功能。

如果您想覆盖大多数平台,请尝试尽可能低的目标(.NET Standard 1.0,它针对 .NET Core 1.0、.NET Framework 4.5、Mono、Xamarin ios 10/Mac 3.0/android 7.0、UWP 10和 Uniy 2018.1 以及所有更新版本)。

您可以在提供的链接中看到确切的.NET Standard Matrix。

如果您需要特定的 API,则必须针对更高版本,例如 .NET Standard 2.0,它很多(大约 22k 来自 .NET Framework 的新 API 已从1.1) API 高于 .NET Standard 1.1。

这可能不允许您使用所有 API(没有 WPF/WinForm 特定的 API),但在通用可重用库中这应该不是问题。

案例2

如果可能,您还可以在此处应用案例 1 提示。

如果这不包括您所需的 API,并且您知道您不想要目标 .NET Core 或 Unity,您仍然可以使用旧样式的 PCLs: Portable Class Library。

它们是更复杂的 .NET Standard 版本(有点像 .NET Standard 的前身),根据您的目标平台,API 表面会缩小到仅允许使用在所有这些平台上运行的 API。

现在不建议使用 PCL,因为 .NET Standard 是首选且更易于(对于库作者)使用和面向多个平台。

最后但同样重要的是,如果您真的只需要 Windows 和 .NET Framework 上的某些功能(或者您不关心 .NET Core),您仍然可以跨目标,即为所有人提供 .NET Standard 2.0平台并仅将特定 API 添加到 net45 目标和预处理器指令 (#if NET45/#endif)。

这会编译成两个库,一个用于netstandard2.0,一个用于net45 (.NET Framework 4.5)。

【讨论】:

以上是关于如何确定 .net 框架版本以创建库 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

确定最高的 .NET Framework 版本 [重复]

如何确定Oracle数据库表中重复的记录

Parquet 格式的可重复性/确定性如何?

防止.NET版本更改[重复]

在 Bamboo 中,如何将组件库存储库拉到固定位置以避免每个分支重复?

如何在 ASP.NET C# 中检索程序集信息窗口的文件版本 [重复]