如何确定 .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 框架版本以创建库 [重复]的主要内容,如果未能解决你的问题,请参考以下文章