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#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
1月前
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
116 51
|
19小时前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
|
19小时前
|
Linux C# iOS开发
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
26 10
|
1月前
|
存储 安全 物联网
C# 在物联网 (IoT) 应用中的应用
本文介绍了C#在物联网(IoT)应用中的应用,涵盖基础概念、优势、常见问题及其解决方法。重点讨论了网络通信、数据处理和安全问题,并提供了相应的代码示例,旨在帮助开发者更好地利用C#进行IoT开发。
58 3
|
1月前
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
46 1
|
1月前
|
缓存 C# 开发者
C# 一分钟浅谈:Blazor Server 端开发
本文介绍了 Blazor Server,一种基于 .NET 的 Web 开发模型,允许使用 C# 和 Razor 语法构建交互式 Web 应用。文章从基础概念、创建应用、常见问题及解决方案、易错点及避免方法等方面详细讲解,帮助开发者快速上手并提高开发效率。
62 2
|
1月前
|
测试技术 Go C#
C#一分钟浅谈:ReSharper 插件增强开发效率
【10月更文挑战第25天】ReSharper 是 JetBrains 开发的一款 Visual Studio 插件,旨在提高 .NET 开发者的生产力。它通过代码分析、重构、导航等功能,帮助开发者避免常见错误,提升代码质量和开发效率。本文将通过具体代码案例,详细介绍 ReSharper 的常见功能及其应用。
46 1
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
39 3
|
7天前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
43 12