专栏首页落跑架构师M拥抱.NET Core,如何开发一个跨平台类库 (1)

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

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

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

回到目录

创建一个.NET Core类库

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

结构如下

回到目录

设置项目支持的平台

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

其中“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的支持,(这种方式是理论上最优的,但可能只是一个梦,具体的会在下面的章节指出为什么),看上去像这样:

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

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

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

回到目录

如何编码?

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

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

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

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

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

接着让我们写个Hello World。

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

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

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

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

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

回到目录

看清“framework”的本质

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

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

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

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

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

回到目录

写在最后

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

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

本文分享自微信公众号 - 落跑架构师M(RabbitHub),作者:马坚

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 拥抱.NET Core,学习.NET Core的基础知识补遗

    .NET Core的新特性之一就是跨平台,但由于对之前框架的兼容导致编写一个.NET Core类库变得相当复杂,主要体现为相当多的框架目标和支持平台,今天我们就...

    落跑架构师M
  • 如何在 K8S 中优雅的使用私有镜像库

    在企业落地 K8S 的过程中,私有镜像库 (专用镜像库) 必不可少,特别是在 Docker Hub 开始对免费用户限流之后, 越发的体现了搭建私有镜像库的重要性...

    落跑架构师M
  • 项目脚手架 - 《Spring Boot + MyBatis + MyBatis Generator》

    最近启动了一个新的项目发现,每当一个新项目的启动往往需要从头搭建一个“框架”,其中虽然很多基础代码可以Copy,但也会浪费不少时间。 基于这个情况,我打算在Gi...

    落跑架构师M
  • BoneCP连接池重连机制分析

    朋友公司Mysql连接池用的BoneCP,应用程序访问Mysql以域名方式,配置如下:

    心平气和
  • 目标检测入门和实现思路!

    本文讲解了目标检测的基本概念,分析了实现目标检测的常用思路。下一篇将介绍目标检测经典数据集—VOC数据集的基本信息,和对VOC数据集进行处理的方法。

    Datawhale
  • 通俗解释协方差与相关系数

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    红色石头
  • 协方差详解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    Steve Wang
  • PHP内核之旅-1.生命周期

    悟空聊架构
  • 一个工具就够了?原型设计没那么简单!

    原型设计是软件设计开发过程中必不可少的一部分,但是现在我们能够看到的原型设计工具种类多到让人眼花缭乱。如果你只是选择了其中的一款工具,并且觉得原型设计工具只需...

    奔跑的小鹿
  • 算法与数据结构

    longzeqiu

扫码关注云+社区

领取腾讯云代金券