C# WinForm 开发配置文件更新/EXE应用启动及监控检测工具

简介: 使用C# WinForm 开发快速更新配置文件切换环境以及启动外部EXE应用并进行监控的windows桌面EXE应用

一、背景

数字驾驶舱大屏采用UE4(Unreal Engine 4)作为基座(C/S架构),负责渲染三维城市模型以及数据指标,以及对接其他业务系统应用。

目前打包后的文件大小压缩后1.2GB,解压后默认8GB,在部署时碰到的问题如下:

  1. 无法同时打包不同环境的包,所以需要更新配置信息来切换不同环境。
  2. 其次启动驾驶舱目前依赖的外部应用比较多,本地NGINX(开启本地缓存较大的静态文件),宇视WebPlayer.exe(摄像头视频播放插件),HW CloudLink桌面端(视频会商),华为视频会商js sdk(指挥调度-单兵连线),X-Screen.exe(搭配UE,实现应用上屏)。
  3. 最后就是部分程序会中途退出。

基于以上几点问题,有了小工具的诞生,主要希望解决的痛点是能有个快速更新配置文件切换环境以及启动外部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存储当前的生成的分组名,方便下次配置更新进行替换

<?xmlversion="1.0" encoding="utf-8" ?><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





相关文章
|
1月前
|
物联网 数据处理 C#
C#实现上位机开发,串口通信,读写串口数据并处理16进制数据
C#实现上位机开发,串口通信,读写串口数据并处理16进制数据。在自动化、物联网以及工业控制行业中,上位机开发是一项重要的技能。本教程主要介绍使用C#进行上位机开发,重点在于串口通信和数据处理。
321 82
|
15天前
|
存储 监控 算法
员工电脑监控系统中的 C# 链表算法剖析-如何监控员工的电脑
当代企业管理体系中,员工电脑监控已成为一个具有重要研究价值与实践意义的关键议题。随着数字化办公模式的广泛普及,企业亟需确保员工对公司资源的合理利用,维护网络安全环境,并提升整体工作效率。有效的电脑监控手段对于企业实现这些目标具有不可忽视的作用,而这一过程离不开精妙的数据结构与算法作为技术支撑。本文旨在深入探究链表(Linked List)这一经典数据结构在员工电脑监控场景中的具体应用,并通过 C# 编程语言给出详尽的代码实现与解析。
36 5
|
3月前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
118 12
|
3月前
|
Linux C# iOS开发
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
81 12
|
4月前
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
173 51
|
3月前
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
4月前
|
存储 安全 物联网
C# 在物联网 (IoT) 应用中的应用
本文介绍了C#在物联网(IoT)应用中的应用,涵盖基础概念、优势、常见问题及其解决方法。重点讨论了网络通信、数据处理和安全问题,并提供了相应的代码示例,旨在帮助开发者更好地利用C#进行IoT开发。
206 3
|
4月前
|
缓存 C# 开发者
C# 一分钟浅谈:Blazor Server 端开发
本文介绍了 Blazor Server,一种基于 .NET 的 Web 开发模型,允许使用 C# 和 Razor 语法构建交互式 Web 应用。文章从基础概念、创建应用、常见问题及解决方案、易错点及避免方法等方面详细讲解,帮助开发者快速上手并提高开发效率。
118 2
|
4月前
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
239 1
|
4月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
75 3

相关课程

更多