自动更新程序源码下载(C#.Net)

       由于微软提供的更新程序使用不方便,所以又写了此程序。此程序是本人一年前所写的一段程序,当时在开发一个CS版本报价系统,当时由于开发过程仓促,代码可能有点不是太规范此程序编译后只有一下AutoUpdate.exe文件与一个配置文件UpdateList.xml,主要通过本地程序与服务端程序文件的版本号来升级与更新本地程序文件。
UpdateList.xml文件内容如下:

<?xml version="1.0" encoding="gb2312"?>
<AutoUpdater>
  <description>Application autoUpdate</description>
  <Updater>
 <Url>http://10.0.5.98/SoftUpdate/</Url>
 <LastUpdateTime>2005-09-05</LastUpdateTime>
  </Updater>
  <Application applicationId="ItemSoft">
    <EntryPoint>ItemSoft.exe</EntryPoint>
    <Location>.</Location>
 <Version>1.0.0.0</Version>
  </Application>
  <Files>
    <File Ver="1.0.0.0" Name="ItemSoft.exe" />
    <File Ver="1.0.0.0" Name="Reports\test.txt"/>
    <File Ver="1.0.0.0" Name="Interop.grproLib.dll"/>
    <File Ver="1.0.0.0" Name="Reports\test.grf"/>
  </Files>
</AutoUpdater>

说明:
<description></description>     程序的描述;
<Url></Url>                            更新服务器地址,为一个虚拟目录或站点路径;
<EntryPoint></EntryPoint>      需要更新主程序文件,为exe;
 <Location>.</Location>         需要更新主程序文件所在路径;
<Version>1.0.0.0</Version>   主程序版本号;
  <Files> </Files>                     需要更新的文件列表;Ver:文件版本号,Name:文件名,包括路径(相对);

使用时,在更新服务器上新建Web虚拟目录或站点,然后将需要更新的文件与UpdateList.xml放在上面;
本地将AutoUpdate.exe与UpdateList.xml放在主程序的根目录下。本地UpdateList.xml中的版本号如果小于服务端,自动程序会自动下载所需要更新的文件。
本人的完整.Net打包程序下载中所带的项目中,就使用了此更新程序。
源码下载:/Files/jenry/AutoUpdate.rar
二进制文件下载:/Files/jenry/bin.rar
生成配置文件UpdateList.xml工具/Files/jenry/AULWriter1.0.rar (由whatisgood 提供,感谢!!)New
posted @ 2006-08-15 12:49 jenry(云飞扬) 阅读(17706) 评论(46) 编辑 收藏

 回复 引用 查看   
#1楼 2006-08-15 13:49 aspnetx      
格式可以自己定
另在update前建议先测试网络连接
我发现不少共享软件都有这个问题

 回复 引用 查看   
#2楼[楼主] 2006-08-23 08:33 jenry      
回aspnetx:
是的,程序不是太完整
大家可以自由修改
你的意见很是不错,谢谢!!!

真的很不错,比dotnetupdater那个组件好用多了.
学习改善ing....谢谢!

 回复 引用   
#4楼 2006-12-29 17:22 hyt123123[未注册用户]
不错。我现在正需要实现这样的功能,正好可以好好研究!谢谢!
 回复 引用 查看   
#5楼[楼主] 2007-01-08 08:12 jenry      
此程序已不做任何修改与升级了
如果大家认为不错可以下载使用
并也可以自己另加修改做为已用

 回复 引用   
#6楼 2007-01-22 16:17 LEE[未注册用户]
谢谢,我也在程序中使用了这个更新程序

 回复 引用   
#7楼 2007-04-27 14:27 hancat[未注册用户]
非常感谢啊.正需要这样的功能哟.
 回复 引用   
#8楼 2007-06-22 16:57 surf[未注册用户]
正在看……,还不知道主程序如何知道需要更新了,然后启动AutoUpdate.exe
 回复 引用   
#9楼 2007-06-26 09:26 bluewater[未注册用户]
十分感谢你的大方,能在网络共享.解了我的急.太高兴了.
 回复 引用   
#10楼 2007-07-14 16:19 whatisgood[未注册用户]
thanks jenry,榜样

jenry提供的这个组件很实用地哦,不过要想把它真正地用起来还需要加工一下,尤其是UpdateList.xml这个文件如果单纯地靠手工编写,对于做一个大的项目来将就很烦啦,为此me写了一个小程序AULWriter来自动生成这个List;
不知道怎么上传到jenry的blog上,留下mail谁想要发邮件给我:

sh_liuhuashan@163.com

请注明AULWriter.
另外提示一下AutoUpdate.exe遇到两个bug:
1.URL解析不了.INI文件路径,费解:可能是与IIS配置有关;
2.偶尔会出现线程切换错误,在构造函数处加个声明就ok咯: Control.CheckForIllegalCrossThreadCalls = false;

 回复 引用 查看   
#11楼[楼主] 2007-07-15 11:37 jenry-云飞扬      
@whatisgood
很感谢你能够对这个组件的支持,当时也只是在开发过程中,时间很短写了这个小工具,没有继续的优化与改善.很感谢你能够改善,多谢你的支持!如果可以,AULWriter可以发到我的邮件yxm886@163.com里,我放到这里吧,Are you ok?


对于其它文件,如.ini,还有其它的未知扩展名文件,URL解析不了,这个问题在开发中遇到过些问题,没有把它写出来.

在iis文件中,网站->属性->HTTP头--MIME类型
添加扩展名:ini (或者*,*通配符没有试过,估计可以)
MIME类型:application/octet-stream
其它扩展名文件也是如此,添加上去,URL就可以解析了

针对MIME介绍,可以参考:
http://www.ycjan.com/thread-2610-1-1.html
http://www.cnblogs.com/wenanry/archive/2006/08/25/486052.html

 回复 引用   
#12楼 2007-09-09 13:17 king2003[未注册用户]
人才
 回复 引用   
#13楼 2007-09-12 10:55 oxsoft.cn[未注册用户]
流个MARK
 回复 引用   
#14楼 2007-10-10 17:19 wzq6511[未注册用户]
不错,基本功能都实现了,我决定拿来改下转成C#2005,加点功能,比如子文件夹下的文件更新等等,改完后放到csdn上供大家下载。
 回复 引用   
#15楼 2007-10-30 16:51 dwj[未注册用户]
WebRequest webReq = WebRequest.Create("http://192.168.1.19/SoftUpdate/WindowsApplication1.exe");

WebRequest webReq = WebRequest.Create
webReq.Timeout = 50000;
WebResponse webRes = webReq.GetResponse();
fileLength = webRes.ContentLength;

到了这里为什么fileLength 值总为-1啊?我的WindowsApplication1.exe有1m呢,能告诉我吗?谢谢

 回复 引用   
#16楼 2008-04-12 16:26 feiyvefanli[未注册用户]
很好 我正需要这样一个功能的程序 很好 稍加修改就能用到我的项目里了 谢谢你
 回复 引用   
#17楼 2008-04-24 20:06 mlstars[未注册用户]
楼主,不知为什么会 出现假死状态呀?
 回复 引用   
#18楼 2008-05-17 17:07 阿信(路过)[未注册用户]
正好需要,给了很大帮助,谢谢
 回复 引用   
#19楼 2008-09-26 18:55 huche[未注册用户]
受益了,谢谢
 回复 引用   
#20楼 2008-10-01 22:23 雷松[未注册用户]
--引用--------------------------------------------------
aspnetx: 格式可以自己定
<br>另在update前建议先测试网络连接
<br>我发现不少共享软件都有这个问题
--------------------------------------------------------

 回复 引用 查看   
#21楼 2008-10-13 11:22 Peter Joke      
mark 正在研究这方面问题~
 回复 引用   
#22楼 2008-11-16 11:25 wsq[未注册用户]
xiexie a
正需要呢,谢谢啦
 回复 引用   
#24楼 2008-12-01 01:10 chenryan[未注册用户]
DownUpdateFile
到这个方法的时候总是提示线程不对,能告诉我原因吗?最好告诉我怎么调整,有急用呢,谢谢!

 回复 引用   
#25楼 2008-12-25 09:17 黄秀明[未注册用户]
会火!
 回复 引用   
#26楼 2009-01-06 08:51 soney[未注册用户]
代码相当丑陋
 回复 引用 查看   
#27楼 2009-02-26 13:47 chzhcpu      
--引用--------------------------------------------------
soney: 代码相当丑陋
--------------------------------------------------------
I don't think so.

 回复 引用 查看   
#28楼 2009-02-26 13:47 chzhcpu      
正需要这个功能。
刚刚读完了代码,楼主真的做的不错。
谢谢。

 回复 引用 查看   
#29楼 2009-02-26 14:04 凯锐      
我在
http://www.cnblogs.com/jinliangliu/archive/2009/02/26/1398754.html
有引用你的這個組件。

 回复 引用   
#30楼 2009-03-21 20:32 kage
不理解程序运行原理,怎么样才能让程序打开时能检测到新版本呢?还有更新的是什么文件?请楼主赐教!
 回复 引用   
#31楼 2009-03-26 13:52 wuhh
嗯嗯,看一下,感谢楼主的无私,有问题再请教你。
 回复 引用   
#32楼 2009-08-08 20:24 xunfei_xunfei[未注册用户]
正急着要这样的功能,已经在我的程序中使用,只能说声谢谢了!
 回复 引用   
#33楼 2009-09-21 10:07 exc.eption[未注册用户]
谢谢楼主,很好的东西,
正需要呢,研究哈

 回复 引用   
#34楼 2009-09-21 12:17 exc.eption[未注册用户]
好像程序本身还有一定问题,
比如说自动更新程序中下载文件使用的是线程异步下载,
但在线程中调用了主线程的一些控件对象,使得程序抛出异常,
终止执行

 回复 引用 查看   
#35楼 2009-10-23 15:24 影子刺客      
WebRequest webReq = WebRequest.Create("http://192.168.1.19/SoftUpdate/WindowsApplication1.exe");

WebRequest webReq = WebRequest.Create
webReq.Timeout = 50000;
WebResponse webRes = webReq.GetResponse();
fileLength = webRes.ContentLength;

到了这里为什么fileLength 值总为-1啊?我的WindowsApplication1.exe有1m呢,能告诉我吗?谢谢

 回复 引用 查看   
#36楼 2009-11-03 08:49 JohnSunny      
谢谢分享,如果服务器上没有IIS,只想用一个共享目录来存放需要需要更新的文件,这样做可以吗?
 回复 引用 查看   
#37楼 2009-11-07 10:43 土豆      
我用了。很好。不错。
 回复 引用 查看   
#38楼 2009-11-07 10:46 土豆      
发现一点问题,如果iis不存在要更新的文件(或者文件名错误),autoupdate会直接死掉,发送错误报告。
更新程序不能更新本身自己。而且更新程序 没有错误处理等等。希望大家能完善一下。

 回复 引用 查看   
#39楼 2009-11-07 18:14 土豆      
@JohnSunny
当然不可以。因为下载更新内容是根据WebRequest与WebResponse来实现的。

 回复 引用 查看   
#40楼 2009-11-07 18:16 土豆      
@kage
你需要在你的程序里添加AppUpdater.cs这个引用,然后调用里面的方法,先下载服务器的xml文件到本地temp目录,然后对比本地xml,用availableUpdate = appUpdater.CheckForUpdate(serverXmlFile, localXmlFile, out htUpdateFile);如果返回值大于0就提示更新,调用autoupdate程序。

 回复 引用 查看   
#41楼 2010-06-08 17:20 lauer      
还不错,能满足基本功能。
代码升级到VS2005,调试环境提示几个错误,主要是线程内调用其他线程的控件,这是不允许的,将多线程改为异步委托方式即可。
MethodInvoker mi = new MethodInvoker(DownUpdateFile);
BeginInvoke(mi);

 回复 引用 查看   
#42楼 2010-07-09 16:15 龙来则去      
我试用了,但是不行,原因将临时文件里的.exe File.Copy()时候出出问题,从临时文件拷贝到当前运行的目录下,但是有一个问题,因为主程序还在选择着呢?所以不让覆盖,并且会提示有一个线另正占用着,文件无法访问,如何解决此问题?
 回复 引用 查看   
#43楼 2010-12-07 15:03 junkyan      
谢谢分享,学习学习!
 回复 引用 查看   
#44楼 2011-04-18 09:43 udbfhvkxa      
谢谢,我也在程序中使用了这个更新程序
 回复 引用 查看   
#45楼 2011-07-21 03:09 phcis      
就你了,看着不错.
 回复 引用 查看   
#46楼 2011-07-26 10:52 wowoo      
有没有mobile下的c#自动更新的例子谢谢