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





相关文章
|
27天前
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
93 51
|
24天前
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
36 1
|
25天前
|
缓存 C# 开发者
C# 一分钟浅谈:Blazor Server 端开发
本文介绍了 Blazor Server,一种基于 .NET 的 Web 开发模型,允许使用 C# 和 Razor 语法构建交互式 Web 应用。文章从基础概念、创建应用、常见问题及解决方案、易错点及避免方法等方面详细讲解,帮助开发者快速上手并提高开发效率。
46 2
|
1月前
|
测试技术 Go C#
C#一分钟浅谈:ReSharper 插件增强开发效率
【10月更文挑战第25天】ReSharper 是 JetBrains 开发的一款 Visual Studio 插件,旨在提高 .NET 开发者的生产力。它通过代码分析、重构、导航等功能,帮助开发者避免常见错误,提升代码质量和开发效率。本文将通过具体代码案例,详细介绍 ReSharper 的常见功能及其应用。
41 1
|
1月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
34 3
|
1月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
46 1
|
1月前
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
|
1月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
15 0
|
2月前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
168 0
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
32 3