拥抱.NET Core,如何开发一个跨平台类库 (1)

时间:2021-12-26 23:37:24

在此前的文章中详细介绍了使用.NET Core的基本知识,如果还没有看,可以先去了解“拥抱.NET Core,学习.NET Core的基础知识补遗”,以便接下来的阅读。

在本文将介绍如何配置类库项目支持不同的平台,并为不同的平台进行兼容的编码。

创建一个.NET Core类库

首先我们创建一个.NET Core的类库项目。

拥抱.NET Core,如何开发一个跨平台类库 (1)

结构如下

拥抱.NET Core,如何开发一个跨平台类库 (1)

设置项目支持的平台

我们打开“project.json”文件,会看到如下内容:

拥抱.NET Core,如何开发一个跨平台类库 (1)

其中“framework”就是用来配置所支持的目标,默认为netstandard1.6。

要点回顾

问:netstandard1.6可以被应用在哪些平台之上?(这里大家可以回忆一下)

答:

  1. netcoreapp 1.0+(.NET Core)
  2. net4.6.2(.NET Framework)

如果你的答案跟此一致,那么恭喜你已经基本掌握了各个平台直接的关系了。

支持net4和netcoreapp

接着我们想让类库支持目标的为:net4 net45 netcoreapp。

根据上一篇的内容我们可以了解到,可以通过降低netstandard版本以来兼容更多的net平台,其中netstandard1.1就可以支持net45,也就是说如果我们把netstandard1.6改为netstandard1.1就可以达成net45和netcoreapp1.0的支持,(这种方式是理论上最优的,但可能只是一个梦,具体的会在下面的章节指出为什么),看上去像这样:

拥抱.NET Core,如何开发一个跨平台类库 (1)

现在这个类库可以兼容net45+和netcoreapp1.0+,那么net40呢?上篇的内容中说net40根本没有对netstandard做兼容。

是的,net40没有对netstandard做兼容,所以我们需要单独设置一个新的目标,标识类库同时需要被netstandard和net4使用。

这边的netstandard和net4是一个互不兼容的分支。修改后文件像这样子:

拥抱.NET Core,如何开发一个跨平台类库 (1)

如何编码?

设定了不同的平台后,在编码方式上又有哪些区别?

我们首先考虑一个问题,net45和net4是同一种性质的实现,只不过前者是后者的升级版,所以net4的大部分代码net45可以无缝支持,也就是说基于net4的代码不需要改动就可以让net45进行支持。

但netstandard是个新目标,其中包含了许多net平台上没有的类库,比如:wcf,System.Web.dll等,那么改如何在一个项目中与net4、net45共存呢?

我们来看一下“Class1.cs”代码文件

拥抱.NET Core,如何开发一个跨平台类库 (1)

可以看到在左上方的下拉框中列出了这个类库所支持的平台,点击选中其中一个平台可以设置开发环境为这个选中的平台。

接着让我们写个Hello World。

拥抱.NET Core,如何开发一个跨平台类库 (1)

这是一个很简单的写法,可以发现Task.FromResult(“rabbit”)不支持net4,那么我们就需要利用“条件编译符”设置在net4环境下的兼容代码,修改之后看上去如下:

拥抱.NET Core,如何开发一个跨平台类库 (1)拥抱.NET Core,如何开发一个跨平台类库 (1)

根据项目框架选择的不同ide会自动高亮当前生效的代码。

这样我们就完成了GetName方法net4+和netstandard1.1的支持了。

那么大家在回顾一下现在支持哪些平台?

  1. net4
  2. net45
  3. net451
  4. net452
  5. net4.6
  6. net4.6.1
  7. net4.6.2
  8. netcoreapp1.0
  9. uap10.0
  10. win8.0
  11. win8.1
  12. wpa8.1
  13. Mono/Xamarin Platforms
  14. mono

是不是一下变得高大上,除了net4外其余的都依靠netstandard的强大支持。

是不是netstandard版本越小越好?

答案是否定的,虽然netstandard可以兼容更多平台但有个很致命的缺点就是为了兼容损失了很多类库和新特性,比如:

拥抱.NET Core,如何开发一个跨平台类库 (1)这个属性在net4.6之后才被支持也就是说netstandard1.3+才可以使用此属性。

当然这只是很小的一个例子,还有更多的组件不支持低版本。这意味着你得最更多的兼容操作,而有一些类库的缺失可能是致命的。

所以大家在编写类库的时候把我一下兼容的度,一般来说支持.net45+netcoreapp1.0+就可以了。

看清“framework”的本质

以上的项目开发方式给我们照成一个错觉,它就是一个东西,同样的编码,同样的项目文件。

其实不同的framework中是完全独立的,共享的只是文件而已,framework配置的越多你项目的生成速度越慢

为什么呢?让我们看一下vs的输出窗口。

拥抱.NET Core,如何开发一个跨平台类库 (1)

有次可以看出在生成环境vs将不同的framework区别看来,进行单独生成,上面我们配置了两个平台,vs就执行了两次生成,项目越大框架越多生成越慢。

所以不要被表明混淆,在进行编码的时候要记清楚他们是两个独立的东西,只不过在开发方式上微软做出了优化。

写在最后

本文介绍了开发一个跨平台类库的基本做法,接下来会接着介绍:

  1. 不同框架直接的依赖(引用的包和程序集)
  2. 如何将.NET Core类库项目打包成nuget包
  3. 如何让旧的.NET Framework项目使用这个跨平台类库。
  4. 跨平台类库不同目标中代码兼容的小技巧