在此前的文章中详细介绍了使用.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. 跨平台类库不同目标中代码兼容的小技巧

拥抱.NET Core,如何开发一个跨平台类库 (1)的更多相关文章

  1. 使用.NET Core快速开发一个较正规的命令行应用程序

    程序员的世界,命令行工具一直是"体验非常友好"的工具,也能自动化完成很多事情,同时还能结合shell来进行某项任务的批处理(脚本).在.NET Core中,命令行应用程序是基础,但 ...

  2. 使用electron+vue开发一个跨平台todolist(便签)桌面应用

    # 1 最近一直在使用electron开发桌面应用,对于一个web开发者来说,html+javascript+css的开发体验让我非常舒服.之前我一直简单的以为electron只是张网页加个壳,和那些 ...

  3. 十分钟使用ionic Framework开发一个跨平台移动应用

    Ionic是一个前端的框架,帮助开发人员使用HTML5, CSS3和JavaScript做出原生应用. ionic的理念类似前端开发的BootStrap,目标是封装HTML5移动跨平台开发的最佳实践. ...

  4. 用.net core mvc 开发一个虽小但五脏俱全的网站

    .net core mvc 发布有很长时间了,但是一直没有用过,最近突然想开发一个导航网站,于是就抽时间开发了一个专门为开发者使用的导航站点,想看的话请移步我的上一篇博客https://www.cnb ...

  5. 如何用 Electron + WebRTC 开发一个跨平台的视频会议应用

    在搭建在线教育.医疗.视频会议等场景时,很多中小型公司常常面临 PC 客户端和 Web 端二选一的抉择.Electron 技术的出现解决了这一难题,只需前端开发就能完成一个跨平台的 PC 端应用.本文 ...

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

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

  7. 拥抱.NET Core,如何开发跨平台的应用并部署至Ubuntu运行

    之前写了一篇博文宣布Rabbit Rpc跨平台了"拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc",在过程中尝试了如何编写支持跨平台的类库与应用程序,也尝试了在 ...

  8. 用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)

    汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai Python3 与 C# 基础语法对比:https://www.cnblogs.com/ ...

  9. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [上篇]

    微软在千禧年推出 .NET战略,并在两年后推出第一个版本的.NET Framework和IDE(Visual Studio.NET 2002,后来改名为Visual Studio),如果你是一个资深的 ...

随机推荐

  1. Ubuntu下使用nvm

    写在前面:刚写着写着博客就跨年了,希望新的一年大家万事如意,一切向"前"看! 安装 wget -qO- https://raw.githubusercontent.com/crea ...

  2. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4142  Solved: 1964[Submit][Statu ...

  3. fiddler发送post请求

    1.指定为 post 请求,输入 url Content-Type: application/x-www-form-urlencoded;charset=utf-8 request body中的参数格 ...

  4. 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...

  5. Phoenix综述(史上最全Phoenix中文文档)

    个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/users/6cb45a00b49c/latest_articles 网上关于P ...

  6. ASP.NET从零开始学习EF的增删改查

           ASP.NET从零开始学习EF的增删改查           最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...

  7. zookeeper源码分析之二客户端启动

    ZooKeeper Client Library提供了丰富直观的API供用户程序使用,下面是一些常用的API: create(path, data, flags): 创建一个ZNode, path是其 ...

  8. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

    学习架构探险,从零开始写Java Web框架时,在学习到springAOP时遇到一个异常: "C:\Program Files\Java\jdk1.7.0_40\bin\java" ...

  9. javascript 笔记!

    1.通过javascript向文档中输出文本 document是javascript的内置对象,代表浏览器的文档部分 document.write("Hello Javascript&quo ...

  10. java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE

    Android发出HTTP请求时出现了这个错误: java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INST ...