一、背景
數字駕駛艙大屏采用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 配置更新
// 打開一個文本檔案,将檔案中的所有文本讀取到一個字元串中,然後關閉此檔案
string text = File.ReadAllText(absolutePath);
text = text.Replace(origin, target);
// 建立一個新檔案,向其中寫入内容,然後關閉檔案。 如果目标檔案已存在,則覆寫該檔案。
File.WriteAllText(absolutePath, text);
3.1.2 啟動EXE應用(ProcessStartInfo啟動)
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = @"路徑\exe的檔案名";
info.Arguments = "";
info.WindowStyle = ProcessWindowStyle.Minimized;
Process pro = Process.Start(info);
pro.WaitForExit();
3.2 駕駛艙小工具V1.1
工具目錄不受限制/開啟應用監控(守護程序)
3.2.1 啟動外部應用(ShellExecute)
//class裡面放入這段代碼
[DllImport("shell32.dll")]
public static extern int ShellExecute(IntPtr hwnd, StringBuilder lpszOp, StringBuilder lpszFile, StringBuilder lpszParams, StringBuilder lpszDir, int FsShowCmd);
//需要打開的地方插入此段代碼
ShellExecute(IntPtr.Zero, new StringBuilder("Open"), new StringBuilder("test.exe"), new StringBuilder(""), new StringBuilder(@"C:\檔案夾名"), 1);
三、小工具開發遇到的問題
1、環境來回自由切換
問題原因:
駕駛艙目前UE與WEB是用socket消息進行通信,不同使用者需要進行分組區分,否則消息混亂導緻大屏互動出現類似"鬼觸屏",和預期互動不一緻.分組目前是固定字首加上時間戳。
解決方案:
利用目前的配置檔案App.config存儲目前的生成的分組名,友善下次配置更新進行替換
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!--應用程式位置配置-->
<add key="yysp" value="C:\Users\admin\Desktop\x-screen-dist-diy\x-screen.exe"/>
<add key="zyhc" value="C:\Users\admin\Desktop\nginx-1.18.0\nginx.exe"/>
<add key="spbf" value="C:\Surveillance\WEBPlayer\WEBPlayer.exe"/>
<add key="sphs" value="C:\Program Files (x86)\HW CloudLink\HW CloudLink.exe"/>
<add key="zhdd" value="C:\Program Files (x86)\HW CloudLink\CloudLinkKitDaemon.exe"/>
<add key="szjsc" value ="C:\Users\admin\Desktop\FSNH20211202\WindowsNoEditor\FoShan_CityofBrain2.exe"/>
<!--守護程序-->
<add key="serviceProcess" value="yysp,zyhc,spbf,sphs,zhdd"/>
<add key="logPath" value="D:\ProcessMonitorLog"/>
<!--檔案替換配置-->
<add key ="currentPath" value="TVLibraryProjectSettings.ini"/>
<add key ="originPath" value="FoShan_CityofBrain2\Saved\Config\WindowsNoEditor\TVLibraryProjectSettings.ini"/>
<!--檔案内容替換配置-->
<add key ="ipconfig" value="FoShan_CityofBrain2/Config/TVConfig/IPconfig.json"/>
<add key ="pointConfig" value="FoShan_CityofBrain2/Config/TVConfig/PointConfig.json"/>
<add key ="shuBiaoconfig" value="FoShan_CityofBrain2/Config/TVConfig/ShuBiaoconfig.json"/>
<add key ="tvLibraryProjectSettings" value="FoShan_CityofBrain2/Saved/Config/WindowsNoEditor/TVLibraryProjectSettings.ini"/>
<add key ="proxToolConfig" value="FoShan_CityofBrain2/Plugins/TVDaemon/Extras/ProxyTool/config.js"/>
<!--socket配置-->
<!--前端配置-->
<!--背景配置-->
<!--分組配置-->
<add key ="groupA" value="TheiaGroup"/>
<add key ="groupB" value="wujiegroup"/>
<add key ="currentGroup" value="USER20211112182241"/>
<add key ="groupPrefix" value="USER"/>
</appSettings>
</configuration>
2、啟動外部應用與手動輕按兩下效果不一緻
X-Screen中有使用第三方軟體或系統插件
嘗試更換啟動外部應用打開方式解決,經測試ShellExecute啟動與手動啟動效果一緻
3、應用關閉程序依然保留任務管理器
開啟了守護程序(非主線程),導緻無法徹底關閉
重寫應用關閉方法并使用 Process.GetCurrentProcess().Kill();
參考資料:
sed -i指令:
https://blog.csdn.net/qq_33468857/article/details/84324609System.IO.File API:
https://docs.microsoft.com/zh-cn/dotnet/api/system.io.file.appendalllines?view=net-6.0C# winform 啟動外部程式:
https://www.cnblogs.com/zhujiantao/p/6694446.htmlShellExecute 函數:
https://baike.baidu.com/item/Shellexecute/5788449C# 退出應用程式:
https://www.cnblogs.com/mq0036/p/11074325.html