拥抱.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.3(.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. net4.6.3
  9. netcoreapp1.0
  10. uap10.0
  11. win8.0
  12. win8.1
  13. wpa8.1
  14. Mono/Xamarin Platforms
  15. 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. 跨平台类库不同目标中代码兼容的小技巧
时间: 2024-08-28 01:51:39

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

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

Ionic是一个前端的框架,帮助开发者使用HTML5, CSS3和JavaScript做出原生应用.ionic的理念类似前端开发的BootStrap,目标是封装HTML5移动跨平台开发的最佳实践,就像Twitter Bootstrap在前端开发中做的一样.Ionic框架目前发展很迅速,我们从2014年3月开始使用,当时是1.0.0beta2,现在已经更新到1.0.0beta10,大概每2个星期会出一个beta版本,并且都包含实质性更新.Ionic框架很先进,js部分是基于AngularJS框架,

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

程序员的世界,命令行工具一直是"体验非常友好"的工具,也能自动化完成很多事情,同时还能结合shell来进行某项任务的批处理(脚本).在.NET Core中,命令行应用程序是基础,但是如何实现像 "cat" 这种功能呢?今天就为大家介绍一个packages来优雅的实现一个命令行应用程序. 一般命令行程序包含什么? 使用方式 帮助信息 子命令 参数 选项 帮助信息 帮助信息如上,介绍了命令的作用和参数.选项作用. 这个是必不可少的. 子命令 一个应用程序打包了多个功能,

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

之前写了一篇博文宣布Rabbit Rpc跨平台了"拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc",在过程中尝试了如何编写支持跨平台的类库与应用程序,也尝试了在linux上的运行,今天特此将过程中的一些经历记录下来,方便后人. 安装开发环境 本人用Windows环境就直接用Visual Studio了,当然也可以用记事本或Visual Code. .NET Core开发要求 Visual Studio 2015 Update3 .NET Core 1.0 for V

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

微软在千禧年推出 .NET战略,并在两年后推出第一个版本的.NET Framework和IDE(Visual Studio.NET 2002,后来改名为Visual Studio),如果你是一个资深的.NET程序员,相信传统的.NET应用的开发方式已经深深地烙印在你的脑子里面..NET Core带来了全新的开发体验,但开发方式的差异根本不足以成为你快速跨入.NET Core 世界的门槛,因为在.NET Core在很多方面比传统的.NET Framework应用开发要简单.为了消除很多尚未接触过.

[ASP.NET Core 3框架揭秘] 跨平台开发体验: Linux

如果想体验Linux环境下开发.NET Core应用,我们有多种选择.一种就是在一台物理机上安装原生的Linux,我们可以根据自身的喜好选择某种Linux Distribution,目前来说像RHEL.Ubuntu.Debian.Fedora.CentOS和SUSE这些主流的Distribution都是支持的.如果读者朋友们觉得这种方式比较麻烦,我们也可以采用虚拟机的形式安装相应的Linux Distribution,比如我经常使用的都是安装在VirtualBox上的Ubuntu.对于X64 W

c#实战开发:用.net core开发一个简单的Web以太坊钱包 (六)

今天就来开发一个C# 版的简易钱包 先回顾以前的内容 c#实战开发:以太坊Geth 命令发布智能合约 (五) c#实战开发:以太坊Geth 常用命令 (四) c#实战开发:以太坊钱包快速同步区块和钱包卡死解决方案 (三) c#实战开发:以太坊钱包对接私链 (二) c#实战开发:以太坊私链搭建(一) 先看一下可视化钱包有哪些功能呢? 那这个钱包得有什么功能呢? 1.查看用户 2.查看交易记录 3.转账 4.发布智能合约 5.代币转账 6.代币查询 7.实时同步区块对比 8.智能填写手续费 首先新建

如何在ASP.NET Core中实现一个基础的身份认证

注:本文提到的代码示例下载地址> How to achieve a basic authorization in ASP.NET Core 如何在ASP.NET Core中实现一个基础的身份认证 ASP.NET终于可以跨平台了,但是不是我们常用的ASP.NET, 而是叫一个ASP.NET Core的新平台,他可以跨Windows, Linux, OS X等平台来部署你的web应用程序,你可以理解为,这个框架就是ASP.NET的下一个版本,相对于传统ASP.NET程序,它还是有一些不同的地方的,比

“前.NET Core时代”如何实现跨平台代码重用 ——程序集重用

除了在源代码层面实现共享(“前.NET Core时代”如何实现跨平台代码重用 ——源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的“中性”程序集通过创建一种名为“可移植类库(PCL: Portable Class Library)”项目来实现.为了让读者朋友们对PCL的实现机制具有充分的认识,我们先来讨论一个被我称为“程序集动态绑定”的话题. 一.何谓程序集动态绑定? 我们采用C#.VB.NET这样的编程语言编写的源文件经过编译会生成有IL代码和元数据构成的托管模块,一个

开源一个跨平台运行的服务插件 - TaskCore.MainForm

本次将要很大家分享的是一个跨平台运行的服务插件 - TaskCore.MainForm,此框架是使用.netcore来写的,现在netcore已经支持很多系统平台运行了,所以将以前的Task.MainForm改良成跨平台的服务共大家使用和相互交流:本来这篇应该分享的是nginx+iis+redis+Task.MainForm构建分布式架构后续文章,但使用.netcore来定义一个服务插件和跨平台测试经过让我既兴奋又头痛,不说了下次再分享分布式后续文章吧:那么开始今天的分享内容,希望各位多多支持: