c# - 使用 .NET 5.0 中的类型,同时保持与早期 .NET 版本(如 .NET Core 3.1)的兼容性
问题描述
假设您想要使用新System.Half
的 .NET Core 3.1 应用程序(或更旧的应用程序)使用您的库。我可以简单地复制System.Half
实现并失去旧 .NET 版本的内在优化行为,但我可以在单个程序集中这样做吗?
据我所知,这是不可能的(除非采用反射式方法,或者在首次使用时发出 IL 的疯狂行为):上述场景需要使用内置的 .NET 5.0System.Half
和更早版本单独构建.NET 版本(使用我们的内部System.Half
)。
但我希望是否有某种方法可以编译/配置具有一些创造性类型转发的单个程序集,以在可用时利用给定类型的 .NET 5.0 版本,否则使用 shim。
(这个问题与语言无关,并不特定于 just System.Half
)
解决方案
简而言之:不,不可能在单个程序集中进行- 这需要通过多目标库 5.0+ 和您想要支持的最低版本的 .NET CCore 并创建此库的 NuGet 包来完成。
然后使用该库的应用程序将选择最佳匹配程序集,因此 .NET 5/6/+ 应用程序将使用运行时的 System.Half 实现获得您的 .NET 5.0 切片,而 .NET Core 3.1 应用程序将获得包含您的实现的另一个切片System.Half 你放在一个#if
.
即使您不想多目标您的库,也需要一个不同的 NuGet 包,它为 .NET (Core) < 5.0 提供一个包含 System.Half 实现的切片。然后,您的库将依赖此包,导致消费者可传递地使用此包。
推荐阅读
- javascript - 如何在 html5 日历中阻止日期
- ios - 将 cgrect 框架上的 y 值更改为屏幕顶部下方的 80
- flutter - 从外部方法传递异常错误以显示在小部件树中
- css - 外部css不处理数据
- android - Flutter/Android Studio 使用来自另一个项目的密钥来签署我的发行版
- reactjs - 如何修复 React useEffect 时间?
- mysql - mysql中的字符串操作
- java - VSCode 是否可以选择为 java 类“创建测试”?
- php - Elastic Beanstalk 上的 PHP 编写器
- c++ - 一个简单的 3 文件项目中的循环依赖