使用.NET 5.0中的类型,同时保持与.NET Core 3.1等早期.NET版本的兼容性

问题描述

假设您想利用the new System.Half,但是您还希望您的库供.NET Core 3.1应用程序(或更早版本)使用。我可以简单地复制System.Half实现,并失去旧版.NET的固有优化行为,但是我可以在单个程序集中进行此操作吗?

据我所知这是不可能的(除非采用反射样式的方法,否则将产生IL-on-First-Use的疯狂行为):上述情况将需要使用内置程序针对.NET 5.0进行单独构建。 System.Half和更旧的.NET版本(使用我们内部的System.Half)。

但是我希望是否有某种方法可以通过一些创造性的类型转发来编译/配置单个程序集,以便在可用时使用给定类型的.NET 5.0版本,否则可以使用补片。

(此问题与语言无关,并且不仅限于System.Half

解决方法

通常,它可以归结为:是否有提供该API某些部分的nuget软件包?请注意,对于诸如Half之类的原始类型,即使有nuget包,它的实现方式也可能有所不同-即,没有内置的JIT /内部支持-但它仍然可以工作。例如,考虑Span<T>,它在较低级别的框架中(通过nuget)可以工作,但是在.NET Core 3.1或更高版本中,最佳则可以工作。再举一个例子,考虑IAsyncDisposable / IAsyncEnumerable<T>,它们可以通过nuget包获得。

,

简而言之:不,在单个程序集中是不可能的-这需要通过多目标库5.0+和您想要的最低版本的.NET CCore来完成。支持并创建此库的NuGet包。

使用该库的应用程序将选择最匹配的程序集,因此.NET 5/6 / + Apps将使用运行时的System.NET 5.0切片来获取。一半实现和.NET Core 3.1 Apps会得到另一个包含以下内容的切片放在#if后面的System.Half的实现中。

即使您不想对库进行多目标设置,也需要使用其他NuGet包,该包为.NET(Core)