纠结很久的一个问题,经过漫长的排查终于得到了解决.详细情景是这样的:
用WPF做了2个程序A和B,其中A是主程序,B是升级程序.A首先运行,在窗口加载前会连接服务器判断是否有新版本,如果有新版本则先下载服务器端的B程序并覆盖掉本地的B,然后再运行B程序.这样的流程是为了实现升级程序的自更新,一直也运行正常,没什么好说的.
问题出现在有些用户将A程序设置成开机启动后,第一次运行总会出现应用程序崩溃,崩溃是出现在B运行的时候.我在本地尝试后也是出现此情况.如果A程序不需要更新,那么是无需运行B的,但是B每次都会运行.
幸好点击"调试程序"后,还能用VS进入调试,发现的问题是启动了B程序,而B程序报了异常"无法加载程序集XXXX",但是该程序集的确是在应用程序目录下.把该程序集扔到GAC就没问题了,此时可以断定应用程序路径一定出现了问题.
排查代码,发现从服务器下载B程序是直接用的相对路径WebClient.DownloadFile("http://.....", "B.exe");而这里下载的文件跑到windows/system32文件夹下面去了.下载完毕后启动B程序也是用的Process.Start("B.exe"),也跑去启动了windows/system32文件夹下的文件.知道问题所在就简单了,这里加上System.Enviroment.CurrentDirectory或者Process.GetCurrentProcess().MainModule.FileName作为当前文件夹限定,就解决了.
问题分析出来很简单,可是解决过程还是多坎坷的.问题只出现在刚开机的那一次启动,意味着我得频繁的注销登录用户(VS也是关了又开,开了又关);费了这么大功夫,就只解决这么一处小错误,就像一个武功高手,使完一套九阴真经,又来一套降龙十八掌,最后靠一通王八拳解决战斗,相当没劲.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构