纠结很久的一个问题,经过漫长的排查终于得到了解决.详细情景是这样的:
用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也是关了又开,开了又关);费了这么大功夫,就只解决这么一处小错误,就像一个武功高手,使完一套九阴真经,又来一套降龙十八掌,最后靠一通王八拳解决战斗,相当没劲.