C#利用批处理实现正在运行的程序自动更新

时间:2022-02-16 06:02:13

关于自动更新,在.NET下面已经是很普通的事情,无非就是在服务器端保存配置好要更新的程序,然后客户端再写一个小程序来检测,有更新的则复制过来。就这么个思路,这么个简单的问题还要占一篇首页?但你可别急,看看我的标题,再慢慢的看下去,或许哪一天,你可能还真的会用得着呢,就算用不着,相信对各位回头温习一下久违的Command也是不错呀!

利用ShareDevelopICSharpCode.Core实现了一个插件应用程序,这两天想要弄个自动更新,将更新功能作为插件包括在应用程序中,本来以为按照上面的思路是很容易实现的,也确实实现了部分,为什么说部分呢,因为主Exe文件没有更新成功啦!想想原因其实也很简单:主Exe本身就在运行,在运行阶段的ExeDLL是没法复盖的。这下子,这可怎么办?这时一个想法冒出,先将主Exe进程杀掉,然后再复制不成吗?咦,好象是道理哦,自杀了之后,自然可以复制过来呀,但是转念又想,如果主Exe自己都不存在,那后面的复制功能怎么才能执行呢?难不成因为不差钱,有钱能使鬼推磨,帮主Exe一把?

这世界当然是没有鬼的,即使有,它也不可能这么厉害的能帮到主Exe的,在座位上脑子里想的总是自杀再重生这个方案。Google,Baidu这些大神祭起半天也没有找到好的解决方案,只好退下来。看来只有靠自己自力更生,当然这个不一定行得通,但至少尝试过了……

不就是复制嘛?就是copy呀,百无头绪当中,我在cmd中(我一般是会开着cmd的), 无意识的敲着copy/?xcopy/?之类的查看,其中xcopy的帮助还真是提醒了我,请看下面:(繁体系统,粘贴过来的,所以没有转换成简体)

C#利用批处理实现正在运行的程序自动更新C#利用批处理实现正在运行的程序自动更新XCopyHelp

对哦,xcopy是可以复制更深层次的目录和文件的,那我如果建一个bat文件,执行的是复制功能,然后再用一个bat来调用他,并且用一个bat文件去杀掉某一个文件,然后再复制新的,再启动是没有什么问题的吧。试试:

首先,下载园子里jenry的那篇自动更新的源码(http://www.cnblogs.com/jenry/archive/2006/08/15/477302.html);

因为我觉得他这篇自动更新的文章写的简单但实用,再加上有网友在他的基础上添加了一个aulwriter工具,所以自动更新直接用这个也蛮方便的。

第二步,我添加了一个方法KillSelfThenRun()用于删除正在运行的主Exe,然后再重启新的主Exe。代码全部粘贴如下:

C#利用批处理实现正在运行的程序自动更新C#利用批处理实现正在运行的程序自动更新KillSelfThenRun

第三步调用时,原程序本身就有一个Try的做法,就在Catch里面判断一下,如果出现IOException,就调用这个方法。

C#利用批处理实现正在运行的程序自动更新C#利用批处理实现正在运行的程序自动更新点击完成复制更新文件到应用程序目录

最后测试,在xp下自身更新通过。

 

大概就是这样子,源码各位下载上面jenry的那个组件,然后再上KillSelfThenRun()方法就可以使用了。