记一次基于.netCore的跨平台经历

前言

       公司传统的采集系统都是基于Windows开发,Windows系统因为图形界面操作的便利性以及软件开发的便捷性广受各个公司所青睐,但是大多数情况我们只需要在工控机上运行一个小小的软件反而需要安装臃肿的Windows系统,这是得不偿失的。

受限于普通工控设备的性能问题,Windows系统也经常出现蓝屏和死机等情况。鉴于以上问题以及为了提高工控机的稳定性和对各个平台的兼容性支持,我们决定将软件制作为跨平台版本。

  本次开发主要是移植串口采集程序到Linux系统(Ubuntu18.04)中,基于.NetCore 2.1平台,使用C#语言。

一.安装Ubuntu18.04

       Ubuntu官网下载最新的镜像包以及Rufus工具,准备一个U盘,打开Rufus工具,按照下图进行配置,点击开始制作U盘按照工具。

记一次基于.netCore的跨平台经历_第1张图片

 

 

 

Rufus启动盘配置(图片来自网络)

       U盘插入工控机,设置BiosU盘优先启动,进入到安装选项时直接选择Install Ubuntu即可,或者进入系统再安装也可以。安装过程按需选择最小化安装或者完整安装都不影响使用,其他功能按需选择,一直下一步等待安装完成。

二..NetCore环境搭建

       工欲善其事必先利其器。搞.NetCore开发一套稳定的开发环境必不可少,除了.NetCore的运行环境。还需要开启SSH远程服务,方便后期调试。

       安装.NetCore2.1

       在Ubuntu的终端执行以下命令即可自动完成      

wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.asc.gpg

sudo mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/

wget -q https://packages.microsoft.com/config/ubuntu/18.04/prod.list

sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list

sudo apt-get install apt-transport-https

sudo apt-get update

sudo apt-get install dotnet-sdk-2.1 //安装.NetCore2.1的SDK包

开启SSH服务

  ps -e |gerp ssh  // 查看ssh服务

    sudo apt-get update

    sudo apt-get install openssh-server  // 安装ssh服务

    sudo ps -ef|grep ssh

    service sshd start  // 开启服务

    service sshd stop  // 关闭服务

三.将.NetCore程序编译为跨平台版本

       由于.NetCore本身就是跨平台的,所以Windows平台上一次编译好的程序可以运行在多种包含相同版本.NetCore RunTime的环境中。编写跨平台代码要注意保证代码的兼容性,适配各个操作系统的路径以及第三方包是否支持该系统。本次移植的是一个小小的串口采集程序,主要功能就是从数据库获取串口参数,指令,然后使用串口下发数据,收到数据后解析存入数据库。下面我写下我遇见的坑。

1.Linux路径问题

  这个问题很经典,Windows路径组成是单反斜杠’\’,但有些编译器可能会不认’\’,所以代码中经常使用’\\’来转义使用。Windows目录区分C,D盘,路径一般是这种形式 C:\Program Files

  Linux 路径一般使用单斜杠’/’,Linux目录类似树形,最顶层是根目录,路径一般是这种形式 /home/ ProgramFiles

  以读取当前目录的配置文件为例,建议使用Directory.GetCurrentDirectory()方法获取当前路径,使用Path.DirectorySeparatorChar获取当前系统的目录分割符,示例代码如下:

string strPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "server.xml";

2.使用跨平台的串口类

       现在版本的.NetCore还不算太完善,一些系统自带的包都不能很好的移植。在开发过程中串口包是我趟坑摔得最惨的。。。。。。

  目前System.IO.Ports中的SerialPort包稳定版是4.5,还不支持跨平台使用。查了网上的资料大多使用SerialPortStream等第三包来进行移植,但是效果都不太理想。一方面代码改动的地方大。另一方面,由于第三方包来源参差不齐,包的性能都不是很稳定,即便是SerialPortStream这种广泛使用的第三方包,我在调试的过程中也出现了数据接收不完整的情况。

  在看了微软的技术文档后,发现NuGet中已经有了System.IO.Ports SerialPort的预览版4.6(在我写这篇文章时已经发布了4.6的稳定版),里面集成了对.NetCore的支持。在管理NuGet程序包界面,勾选包括预览发行版,搜索System.IO.Ports包,选择对应的版本(4.6)直接更新就完事儿(我这里已经更新了所以按钮是灰色的)。

记一次基于.netCore的跨平台经历_第2张图片

 

 

 

管理NuGet程序包界面

  经过测试,微软官方的包还是蛮稳定的。

3.数据插入时间格式问题

       解决完路径问题和串口问题后,基本上软件就能在Linux环境中运行了。采集过程中一直有数据返回,但是查看数据库发现只有日期,时间都是0。无奈只有使用WriteLine大法进行调试。后来发现当使用DateTime.Now获取时间时,Windows与Linux获取的格式不一致

例:

  window 获取时间格式 2019/9/17 15:02:00

  linux 获取时间格式 2019/9/17 下午 15:02:00

解决方案:所有在插入数据库时直接将日期格式化成字符串(SaveDate.ToString("yyyy-MM-dd HH:mm:ss"))即可。

4.程序的编译与发布

       .NetCore程序在Windows平台调试完成后,就可以移植到Linux上啦。发布可以使用Debug版本或Release版本。生成Debug版本的目的是用于调试,而生成Release版本的目的是用于版本的最终分发,一般还是建议使用Release方式。

Debug版本不会把需要的程序集放在当前程序的目录中(如NuGet包一般放在个人文件夹里),如果要正常运行程序还需手动分配所有的依赖包,并在Debug的生成目录修改配置文件中依赖包的路径。这种方式太麻烦并且Debug版也不会针对代码进行优化。

       使用Release版会把所有的依赖包打包到当前程序目录,并对代码进行优化,方便分发使用。具体生成流程如下:

       右键项目->选择发布 配置好目标运行时,目标框架,输出路径等参数,点击发布完事儿。

 记一次基于.netCore的跨平台经历_第3张图片

 

 配置发布参数

发布成功后会在设定路径生成文件夹存放编译好的程序,直接将该文件夹拷到目标设备上就可以了。下面会讲如何运行.NetCore程序。

四.软件的部署

1.启动程序

       程序经过编译后不再是Windows上常见的exe格式,而是Dll文件。无论Windows还是Linux都需要在终端界面执行指令运行(Windows和Linux指令类似)。指令如下:

       cd 主程序所在文件夹路径

       dotnet 主程序.dll

2.注意事项

  1.如果要开启串口等操作,需要使用管理员权限运行。

  2.Windows串口与Linux串口有所区别,Windows串口可以设备管理器里面查看,命名一般为“COM1”,串口号可以根据需要更改。Linux中串口可通过指令 ls /dev/ttyU*查看,命名一般为“/dev/ttyUSB0”,串口号根据设备插入的顺序叠加。

  3.启动软件如果不想展示运行的界面,可以使用nohup命令(nohup dotnet 主程序.dll &)    将程序放在后台运行,使用jobs指令可以查看当前后台的运行情况。

  4.使用top命令可以查看当前系统的资源占用情况。

  5.在之前的操作中我们已经开启了SSH的远程访问,使用Xshell等工具可以方便地远程连接Linux终端,执行程序的结果也会在Xshell中同步展示出来。具体使用方法这里不再赘述,有需要自行百度。

写在最后

       由于我没有Linux使用经验,以及跨平台开发经验,在开发的过程中也是趟坑不少。好在现在网上相关资料多,自己摸索着也最终解决了。要想成为优秀的开发人员,我要学习的东西还很多,谨以此文记录本次趟坑的经历。

转载于:https://www.cnblogs.com/akagreen/p/11592868.html

你可能感兴趣的:(记一次基于.netCore的跨平台经历)