up everyday,just a little.
第一次在cnblogs发文章,没的什么经验,说的不好请大家见谅.之前开发一套应用系统,采用了C/S模式,对客户端的应用程序自动升级提出了一些要求。我便利用WebClient做了一下这个自动升级系统,在应用中还算不错。今日特地贡献出来,希望给大家一些借鉴。系统分为3个部分:1.Update.dll:供主应用程序调用的检测升级模块。2.Update.exe:升级的主程序.3.升级文件的服务器端配置文件和更新文件.需要WEB服务器支持。
第一部分:服务器存放的配置文件。假设配置文件放在一个web服务器的某个目录下面。如:http://192.168.0.1/UpdateFiles目录结构如下:update.exeupdate.xmlupdate/目录存放需要更新的文件列表
update.xml文件为升级调用的配置文件,如下:<?xml version="1.0" encoding="utf-8" ?><Product> <Version>1.6.2.1</Version> <Description>2007.4.28升级版本</Description> <FileList> <Item Name="mis.exe" FileURL="http://192.168.0.1/UpdateFiles/Updatetmis.exe" Folder="" /> <Item Name="config.ini" FileURL="http://192.168.0.1/UpdateFiles/Update/config.ini" Folder="" /> <Item Name="update.dll" FileURL="http://192.168.0.1/UpdateFiles/Update/update.dll" Folder="" /> </FileList></Product>配置文件主要提供了当前服务器存放的系统版本号,已经相关的文件列表。相信大家都明白什么意思,不多说了。
第二部分:检测升级Update.dll升级模块为了方便程序调用,单独封装在一个dll中,主程序只需要直接引用调用即可。代码如下:
using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;
using System.IO;using System.Net;using System.Xml;/* 系统升级类 */namespace Update{ public class AutoUpdate { private WebClient client; private XmlDocument doc; public string Version = "";
public void LoadUpdateXML() { //获取服务器信息 client = new WebClient(); doc = new XmlDocument(); try { doc.Load(client.OpenRead(@"http://192.168.0.1/UpdateFiles/Update.xml")); client = null; //分析文件 XmlNode node; node = doc.SelectSingleNode("Product/Version"); if (node != null) { Version = node.InnerText.Trim(); } } catch { MessageBox.Show("无法取得更新文件!"); } }
/// <summary> /// 判断是否需要升级 /// </summary> /// <returns></returns> public bool NeedUpdate() { LoadUpdateXML(); //MessageBox.Show(Version + "||" + Application.ProductVersion); if (Version.Trim().CompareTo(Application.ProductVersion.Trim()) > 0) return true; return false; } /// <summary> /// 开始升级, /// </summary> public void Update() { if (NeedUpdate()) { MessageBox.Show("已经有更新的程序,点击确定马上启动升级程序。"); //下载服务器最新的升级程序,并且运行,退出本程序 client = new WebClient(); client.DownloadFile(@"http://192.168.0.1/UpdateFiles/update.exe", Application.StartupPath + "\\update.exe"); System.Diagnostics.Process.Start(Application.StartupPath + "\\update.exe"); Application.ExitThread(); Application.Exit(); } } }}
第三部分:更新程序update.exe程序加载的时候从服务器读取文件列表,并且下载到本地执行目录,完成升级后自动启动主程序。下载文件使用DownloadFile类,如下:DownloadFile df = new DownloadFile();// 文件的服务器地址df.DownloadUrl = serverFile;//下载本地的路径df.DownloadFileName = localFile;df.Download();
具体如何设计界面,因人而异,只是给出一个提示,请读者自己去完成。主应用程序的调用Update.dll后如何检测呢?Update.AutoUpdate up=new Update.AutoUpdate();if(up.NeedUpdate()){up.Update();}暂时就写到这里,有需要帮助的朋友请加我qq:38041762 或者email:gofixiao#126.com(请将#换成@)补上demo:/Files/gofixiao/Update_demo.rar
posted on 2007-06-14 08:59 肖高辉(MSCD) 阅读(4470) 评论(24) 编辑 收藏 网摘 所属分类: .Net Related
恩,不错。我也这样想过,但还要建一个web服务器。 我甚至有想法,直接把程序储存在sql数据库中,还未尝试,不知道可行性怎样。 回复 引用 查看
为什么不用 ClickOnce? 回复 引用 查看
@大豆男生 ClickOnce我也试过,可能是我经验不够,发现在实施起来还是不如自己架设升级服务器,自己写升级代码来的舒服. 回复 引用 查看
@MadGoat 你这种想法完全可行,当初我也是想需要一个单独的web服务器来实现,麻烦. 我以前也实施过将所有的文件以二进制流写入数据库中.但是这样还需要提供一个对文件的维护界面. 想想也算了.现在在.net下开发,一般可以将升级web服务器建立在数据库服务器上,无非就是安装一下iis而已.也算是方便,而且更加直观. 回复 引用 查看
能否把这所有代码打包提供下载 回复 引用 查看
@superstar 稍后我做个demo上传一下.呵呵,最近忙. 回复 引用 查看
呵呵,ClickOne还是比较方便的,只是最开始用的时候需要注意一些地方就OK 回复 引用 查看
enterprise library updater 就可以做到这个了,你可以参考参考,codeplex上有关于2.0的更新 回复 引用 查看
学习啦,好办法,准备用到我的项目中。 回复 引用 查看
很早以前用过codeproject.com 上面的 smartclient update 感觉不错 可以参考以下! 回复 引用
可以把文件存到数据库中 回复 引用 查看
支持原创,探讨一下: C/S的升级,需要去做一个WEB的东西,有这个必要吗? 客户端的升级做了,但怎么发布需要升级的程序呢?这个好象还没有哟! 回复 引用
还没有我写的那么好,自动比较服务器跟当前版本的差异,把差异部分打包,然后下载下来! 回复 引用
由于每个人设计的系统对应的客户不同,那么相应的升级系统的设计也是不同的. 由于我开发的系统是对用户定制的系统,对升级系统的实施不需要考虑安装程序, 所有可能不能完全适应大家的需要,这里只是提供一个设计思想供大家参考.希望对大家有所帮助. 回复 引用 查看
enterprise 里有个block 叫 updater block 已经完成楼主所做的工作了,看来这个block 用过的人比较少,我在推荐一下吧, 只是到1.0版本就不更新了。在codeplex上面有关于2.0的更新,需要升级部署的可以去看看!!! 回复 引用 查看
798彩信网现在已开通了福彩3D预测,排列3预测,双色球3预测,排列3字谜,福彩3D字谜等栏目,本网站资料全部免费提供. 回复 引用
798彩信网http:www.cp798.cn现在已开通了福彩3D预测,排列3预测,双色球3预测,排列3字谜,福彩3D字谜等栏目,本网站资料全部免费提供. 回复 引用
不错. 回复 引用 查看
纯顶。。 回复 引用
good......... 回复 引用
clickonce好是好,可有一点麻烦,就是当我发布后,客户端只更新我发布的这台服务器里的东东,有没有办法移植到另外的服务器上去?不知道大家有什么办法。 回复 引用
@feifox111 肯定可以“移植到另外的服务器上”的: “发布位置”下面的“安装URL”处输入真正的发布位置(例如:http://192.168.1.8/abc/)即可。 回复 引用 查看
请问:ClickOne 发布能不能更新 安装目录? 回复 引用
@大豆男生 这样是可以,可是需要在发布前配置,发布C/S程序时已经锁定,可不可以修改为可配置呢? 回复 引用
昵称: [登录] [注册]
主页:
邮箱:(仅博主可见)
验证码: 看不清,换一个
评论内容:
登录 注册
[使用Ctrl+Enter键快速提交评论]
Powered by: 博客园 Copyright © 肖高辉(MSCD)