随笔-42  评论-132  文章-0  trackbacks-6

VS2008、C#

一. 基本思路
    一直做Web Form开发,最近开始尝试了一下Win Form,做了一个小系统,在发布了第一个可用版本之后,顺便实现了自动更新功能。之前没有这方面的经验,也没有翻阅相关资料,自己想了一个简单的思路,如有笑话之处,恳请批评指正。
    基本上就是这样的:
    客户端有两个子程序,简单的讲就是两个EXE,一个主的应用程序,一个自动Live Update程序,而在服务端,是一个WCF,提供程序版本更新信息和更新文件。
    每当程序启动(或手动点“检测更新”),主程序会调用服务端的WCF检测更新,若检测到新版本,则启动Live Update程序,同时关闭自身。
    Live Update启动后,调用服务端WCF,获取文件列表,然后直接下载更新文件并覆盖本地文件。完毕后启动主程序,同时关闭自身,这样,一次自动更新就完了。
二. 系统架构
    
三. 序列图
    

四. 其它
1. 检测新版本
    在WCF中会有一个XML配置文件,用于客户检测版本和更新文件。
    
2. 下载文件以及覆盖旧文件
    Live Update下载文件后先保存在临时文件夹,下载完毕后再从临时文件夹覆盖主应用程序的旧文件。防止自动更新中途失败导致主应用程序不可用。

3. WCF Contract(仅供参考)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace WendyFinance.UpdateCenter.Contract {

    [ServiceContract]
    
public interface IAutoUpdate {

        [OperationContract]
        
bool CheckUpdate(string clientVersion);

        [OperationContract]
        
string GetCurrentVersion();

        [OperationContract]
        
string GetUpdateDescription();

        [OperationContract]
        List
<string> GetFileList();

        [OperationContract]
        
string GetFile(string fileName);
    }

}
posted on 2008-01-25 11:33 Tristan(GuoZhijian) 阅读(2534) 评论(36)  编辑 收藏 网摘 所属分类: Windows Forms App

评论:
#1楼 2008-01-25 12:11 | silent x[未注册用户]
是的

当时瑞星就是这样的~

  回复  引用    
#2楼 2008-01-25 12:19 | 超晨      
用MS自己的CLICKONCE不好么?
  回复  引用  查看    
#3楼 2008-01-25 12:22 | Anders Liu      
再详细点?

高手肯定知道这些大面上的流程,低手了解了这些流程反而对如何实现感兴趣~

  回复  引用  查看    
#4楼 2008-01-25 12:43 | 无意      
很不错
  回复  引用  查看    
#5楼 2008-01-25 13:00 | 李华星      
请问与SmartClient有什么区别
  回复  引用  查看    
#6楼 2008-01-25 13:07 | Ariel Y.      
对于大规模部署,还有更深入的问题,比如:如果没有分散和延时的设计,新版本发布时,服务器会造成极大的压力。

文件下载推荐用BITS

  回复  引用  查看    
#7楼[楼主] 2008-01-25 13:10 | Tristan(Guozhijian)      
呵呵,没有用过CLICKONCE,SmartClient。有时间可以研究一下:)
  回复  引用  查看    
#8楼[楼主] 2008-01-25 13:12 | Tristan(Guozhijian)      
@Anders Liu
本来想做个Demo,发现涉及的工程还是挺大的。
其实我觉得在这个思路下,实现起来应该比较容易了。

  回复  引用  查看    
#9楼 2008-01-25 13:17 | jillzhang      
最主要的是要对原来的文件进行备份,当更新失败之后,能有系统还原的功能,服务端还要有升级验证,不是每个人都可以从你那拉文件的
  回复  引用  查看    
#10楼[楼主] 2008-01-25 13:17 | Tristan(Guozhijian)      
@Ariel Y.
对的,确实还有很多要考虑的问题,如较为广泛的网络应用,服务器压力确实会比较大:)

  回复  引用  查看    
#11楼[楼主] 2008-01-25 13:22 | Tristan(Guozhijian)      
@jillzhang
嗯,如果实现了基本功能,就要考虑功能扩展了,正如你提到的。后一个比较好实现,WCF加验证功能。
关于系统还原,我还没有想到一个比较完善的解决方案。。

  回复  引用  查看    
#12楼 2008-01-25 13:37 | Leepy      
不错,只是能否再详细一些:)
  回复  引用  查看    
#13楼 2008-01-25 13:47 | A.Z      
在web开发时通用的大量堆砌代码在windows app上是很难行得通的。
win app用至多一半的代码就可以做web很多实际的功能。
lz尝试的心态是好的,不过做出来是没有价值的...

  回复  引用  查看    
#14楼 2008-01-25 13:55 | 布鲁斯南      
请问一下主程序调LIVE UPDATE后,自身如何关闭?
这个问题让我郁闷了很久...


  回复  引用  查看    
#15楼 2008-01-25 13:57 | jillzhang      
@A.Z
不要给人泼冷水,怎么没价值呢,价值大的很呢~
什么是没价值,没有遇到这种情况而已
windows开发和web开发哪个难,哪个易也不是随便说说就能定的 ,编程模型不太一样罢了,浅尝则止都不难,要做成像样的东西都不容易
支持楼主,继续完善,web自动升级也可以的,有先例。

  回复  引用  查看    
#16楼 2008-01-25 13:59 | jillzhang      
@布鲁斯南
做一个自动重启的功能就可以了,用进程来启动exe就可以了

  回复  引用  查看    
#17楼 2008-01-25 14:02 | A.Z      
--引用--------------------------------------------------
jillzhang: @A.Z
不要给人泼冷水,怎么没价值呢,价值大的很呢~
什么是没价值,没有遇到这种情况而已
windows开发和web开发哪个难,哪个易也不是随便说说就能定的 ,编程模型不太一样罢了,浅尝则止都不难,要做成像样的东西都不容易
支持楼主,继续完善,web自动升级也可以的,有先例。

--------------------------------------------------------


算了,不打算打扰lz的积极性,毕竟人家还画了很多图...

  回复  引用  查看    
#18楼[楼主] 2008-01-25 14:07 | Tristan(Guozhijian)      
@A.Z
在web开发时通用的大量堆砌代码在windows app上是很难行得通的。
win app用至多一半的代码就可以做web很多实际的功能。
lz尝试的心态是好的,不过做出来是没有价值的...
--------------------------------------------------------------

跟Web开发有什么关系?大量堆砌代码?
为什么要跟Web比较?
不理解...

  回复  引用  查看    
#19楼[楼主] 2008-01-25 14:08 | Tristan(Guozhijian)      
@jillzhang
谢谢。

  回复  引用  查看    
#20楼 2008-01-25 14:09 | Sapphire[未注册用户]
Clickonce那東西,單一執行文件的小程序還可以,頭一斷時間,公司里有個項目的離線部份,就要求用clickonce那東西,好几個人忙了個焦頭爛額...效果也不好.....
  回复  引用    
#21楼 2008-01-25 14:35 | jisen      
方法不错,我们目前是把dll(usercontrol)嵌在IE中,这样系统更新就交给IE了,后来发现IE这方面不是很稳定(不知道why),就采用和楼主差不多的方法,我们的Live Update程序是一个activeX,这个activeX来控制dll的更新,还可以,可惜我们还没有上wcf。
对了,支持博主!

  回复  引用  查看    
#22楼 2008-01-25 14:36 | jisen      
不知道web自动升级是采用的什么?
  回复  引用  查看    
#23楼 2008-01-25 15:27 | zbh[未注册用户]
差不多,就是这样的流程,很多防火墙这些,都有一个更新程序
  回复  引用    
#24楼 2008-01-25 16:12 | Mainz      
楼主,你这个程序在Vista下运行会不会有权限的问题
另:能自己更新自己吗?

  回复  引用  查看    
#25楼 2008-01-25 16:42 | xiao_p      
图是用什么画的?蛮pp的!!!
  回复  引用  查看    
#26楼[楼主] 2008-01-25 16:56 | Tristan(Guozhijian)      
@jisen
谢谢。

  回复  引用  查看    
#27楼[楼主] 2008-01-25 16:57 | Tristan(Guozhijian)      
楼主,你这个程序在Vista下运行会不会有权限的问题
另:能自己更新自己吗?
@Mainz

VISTA下有什么特别吗?WCF连接是http,Live Update直接是覆盖本地文件,应该都允许的吧。

自己更新自己是什么意思?

  回复  引用  查看    
#28楼[楼主] 2008-01-25 16:57 | Tristan(Guozhijian)      
@xiao_p
呵呵,画图我也不在行,Visio画的

  回复  引用  查看    
#29楼 2008-01-25 17:41 | 妖居      
LZ有没有想到,如果Online Update程序需要更新怎么办?
  回复  引用  查看    
#30楼 2008-01-25 22:41 | 阿牛 - 专注OOP      
差不多都这样啦,杀毒软件都是这样搞的.
  回复  引用  查看    
#31楼 2008-01-26 13:02 | i.Posei      
我曾经也做过一个这样的东西,当时做的是一个通用的更新组件,遇到了一个比较麻烦的问题。
描述起来比较啰嗦,我举个例子,比如有些winform程序会把上次程序关闭时的一些信息保存下来(如窗口的位置等),假如这些信息存在config.xml里的,现在更新的时候,新的程序里也有一个config.xml,那么这个老的config.xml是否应该替换呢。
实际情况比这个例子复杂得多,如果老版本里的文件对用户来说极其重要,不能被替换,而新版本的程序又必须要替换这个文件,怎么处理呢?这种情况就比较棘手了。当然如果只是针对特定的程序开发更新组件,这些问题就可以事先协调。

  回复  引用  查看    
#32楼[楼主] 2008-01-26 13:41 | Tristan(Guozhijian)      
@i.Posei
我个人认为,给用户配置的东西,如果要扩展,也是采用插入式的方式扩展,而不修改原来的东西
这样,将来的更新永远不要影响既有的用户配置信息,只是新增,比如新增配置文件。

如果象app.config这样的配置,需要更改,那么可能要制定更新规则了。

  回复  引用  查看    
#33楼 2008-01-26 20:31 | i.Posei      
@Tristan(Guozhijian)
我仅是举例子。比如如果用户在程序目录下建立了一个file.txt,对用户来说很重要,而现在新版本又有一个同名文件,这对新版本也是必须的,那就麻烦了。

  回复  引用  查看    
#34楼[楼主] 2008-01-28 09:30 | Tristan(Guozhijian)      
@i.Posei
所以,有时候人为加一点限制还是必要的。

  回复  引用  查看    
#35楼 2008-07-20 16:58 | 饥饿的狼      
HI,你好,能否给一个实例呀,谢谢!
Longsea168@163.com

  回复  引用  查看    
#36楼 2008-07-24 12:25 | 傲然林      
不错滴说,之前好像我们的实现方式也是借助于MS的ClinicOnce.
  回复  引用  查看    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1052802




相关文章:

相关链接: