一、背景
数字驾驶舱大屏采用UE4(Unreal Engine 4)作为基座(C/S架构),负责渲染三维城市模型以及数据指标,以及对接其他业务系统应用。
目前打包后的文件大小压缩后1.2GB,解压后默认8GB,在部署时碰到的问题如下:
- 无法同时打包不同环境的包,所以需要更新配置信息来切换不同环境。
- 其次启动驾驶舱目前依赖的外部应用比较多,本地NGINX(开启本地缓存较大的静态文件),宇视WebPlayer.exe(摄像头视频播放插件),HW CloudLink桌面端(视频会商),华为视频会商js sdk(指挥调度-单兵连线),X-Screen.exe(搭配UE,实现应用上屏)。
- 最后就是部分程序会中途退出。
基于以上几点问题,有了小工具的诞生,主要希望解决的痛点是能有个快速更新配置文件切换环境以及启动外部EXE应用并进行监控的windows桌面应用。在大学课程当中有接触过C#,了解到开发也比较简单(工具箱里有现成的组件),同时康宁大佬也给过建议,最后选择用C#的WinForm进行开发。
二、配置更新演变历程
1、手动替换
手动文本编辑器打开配置文件Ctrl + F查找替换;
2、脚本替换
shell脚本更新配置文件内容替换配置更新(不支持来回切换|windows默认无法执行);
sed-i"s#$origin#$target#g" 文件名.txt
3、小工具替换
3.1 驾驶舱小工具V1.0
支持环境自由切换/手动启动外部应用/配置应用地址(目录受限制)
3.1.1 配置更新
// 打开一个文本文件,将文件中的所有文本读取到一个字符串中,然后关闭此文件stringtext=File.ReadAllText(absolutePath); text=text.Replace(origin, target); // 创建一个新文件,向其中写入内容,然后关闭文件。 如果目标文件已存在,则覆盖该文件。File.WriteAllText(absolutePath, text);
3.1.2 启动EXE应用(ProcessStartInfo启动)
ProcessStartInfoinfo=newProcessStartInfo(); info.FileName=@"路径\exe的文件名"; info.Arguments=""; info.WindowStyle=ProcessWindowStyle.Minimized; Processpro=Process.Start(info); pro.WaitForExit();
3.2 驾驶舱小工具V1.1
工具目录不受限制/开启应用监控(守护进程)
3.2.1 启动外部应用(ShellExecute)
//class里面放入这段代码[DllImport("shell32.dll")] publicstaticexternintShellExecute(IntPtrhwnd, StringBuilderlpszOp, StringBuilderlpszFile, StringBuilderlpszParams, StringBuilderlpszDir, intFsShowCmd); //需要打开的地方插入此段代码ShellExecute(IntPtr.Zero, newStringBuilder("Open"), newStringBuilder("test.exe"), newStringBuilder(""), newStringBuilder(@"C:\文件夹名"), 1);
三、小工具开发遇到的问题
1、环境来回自由切换
问题原因:
驾驶舱目前UE与WEB是用socket消息进行通信,不同用户需要进行分组区分,否则消息混乱导致大屏交互出现类似"鬼触屏",和预期交互不一致.分组目前是固定前缀加上时间戳。
解决方案:
利用目前的配置文件App.config存储当前的生成的分组名,方便下次配置更新进行替换
<configuration><appSettings><!--应用程序位置配置--><addkey="yysp"value="C:\Users\admin\Desktop\x-screen-dist-diy\x-screen.exe"/><addkey="zyhc"value="C:\Users\admin\Desktop\nginx-1.18.0\nginx.exe"/><addkey="spbf"value="C:\Surveillance\WEBPlayer\WEBPlayer.exe"/><addkey="sphs"value="C:\Program Files (x86)\HW CloudLink\HW CloudLink.exe"/><addkey="zhdd"value="C:\Program Files (x86)\HW CloudLink\CloudLinkKitDaemon.exe"/><addkey="szjsc"value ="C:\Users\admin\Desktop\FSNH20211202\WindowsNoEditor\FoShan_CityofBrain2.exe"/><!--守护进程--><addkey="serviceProcess"value="yysp,zyhc,spbf,sphs,zhdd"/><addkey="logPath"value="D:\ProcessMonitorLog"/><!--文件替换配置--><addkey ="currentPath"value="TVLibraryProjectSettings.ini"/><addkey ="originPath"value="FoShan_CityofBrain2\Saved\Config\WindowsNoEditor\TVLibraryProjectSettings.ini"/><!--文件内容替换配置--><addkey ="ipconfig"value="FoShan_CityofBrain2/Config/TVConfig/IPconfig.json"/><addkey ="pointConfig"value="FoShan_CityofBrain2/Config/TVConfig/PointConfig.json"/><addkey ="shuBiaoconfig"value="FoShan_CityofBrain2/Config/TVConfig/ShuBiaoconfig.json"/><addkey ="tvLibraryProjectSettings"value="FoShan_CityofBrain2/Saved/Config/WindowsNoEditor/TVLibraryProjectSettings.ini"/><addkey ="proxToolConfig"value="FoShan_CityofBrain2/Plugins/TVDaemon/Extras/ProxyTool/config.js"/><!--socket配置--><!--前端配置--><!--后台配置--><!--分组配置--><addkey ="groupA"value="TheiaGroup"/><addkey ="groupB"value="wujiegroup"/><addkey ="currentGroup"value="USER20211112182241"/><addkey ="groupPrefix"value="USER"/></appSettings></configuration>
2、启动外部应用与手动双击效果不一致
问题原因:
X-Screen中有使用第三方软件或系统插件
解决方案:
尝试更换启动外部应用打开方式解决,经测试ShellExecute启动与手动启动效果一致
3、应用关闭进程依然保留任务管理器
问题原因:
开启了守护进程(非主线程),导致无法彻底关闭
解决方案:
重写应用关闭方法并使用 Process.GetCurrentProcess().Kill();
参考资料:
sed -i命令:https://blog.csdn.net/qq_33468857/article/details/84324609
System.IO.File API:https://docs.microsoft.com/zh-cn/dotnet/api/system.io.file.appendalllines?view=net-6.0
C# winform 启动外部程序:https://www.cnblogs.com/zhujiantao/p/6694446.html
ShellExecute 函数:https://baike.baidu.com/item/Shellexecute/5788449
C# 退出应用程序:https://www.cnblogs.com/mq0036/p/11074325.html