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

在此前的文章中详细介绍了使用.NET Core的基本知识,若是尚未看,能够先去了解“拥抱.NET Core,学习.NET Core的基础知识补遗”,以便接下来的阅读。html

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

建立一个.NET Core类库

首先咱们建立一个.NET Core的类库项目。app

image

结构以下

image

设置项目支持的平台

咱们打开“project.json”文件,会看到以下内容:框架

image

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

要点回顾

问:netstandard1.6能够被应用在哪些平台之上?(这里你们能够回忆一下)学习

答:优化

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

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

支持net4和netcoreapp

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

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

image

如今这个类库能够兼容net45+和netcoreapp1.0+,那么net40呢?上篇的内容中说net40根本没有对netstandard作兼容。

是的,net40没有对netstandard作兼容,因此咱们须要单独设置一个新的目标,标识类库同时须要被netstandard和net4使用。

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

image

如何编码?

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

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

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

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

image

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

接着让咱们写个Hello World。

image

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

imageimage

根据项目框架选择的不一样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能够兼容更多平台但有个很致命的缺点就是为了兼容损失了不少类库和新特性,好比:

image这个属性在net4.6以后才被支持也就是说netstandard1.3+才可使用此属性。

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

因此你们在编写类库的时候把我一下兼容的度,通常来讲支持.net45+netcoreapp1.0+就能够了。

看清“framework”的本质

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

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

为何呢?让咱们看一下vs的输出窗口。

image

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

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

写在最后

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

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