zoukankan      html  css  js  c++  java
  • 【开源】检查更新程序 CheckUpdate.Net 的实现

    访问最新源代码及更新历史:http://git.oschina.net/xcong/CheckUpdate.Net

    DownLoad

    更新历史

    version 1.2

    • [新增]添加UpdateFileClient.exe.config文件,修改UpdateFileClient.exe依赖的.Net Framwork 2.0版本与主程序兼容问题
    • [修改]修改更新程序,下载文件不存在时提示文件出错。

    version 1.1

    • 【修改】修改窗体文件丢失
    • 【新增】新增服务端配置项添加安装包位置和版本
    • 【新增】新增UpdateCommon中VersionHelper下载安装包方法GetNewVersionToDownloadSetup。如果需要下载,弹窗提醒,并调用浏览器下载,同时返回True。

    介绍

    CheckUpdate.Net是.Net C/S下一个检查更新程序。现有的检查更新方式多种多样,更新程序也大不相同。有个比较出名的OSAU(参考了他的界面),但是有10个链接限制。微软也有比较方便的ClickOnce。自己也尝试了其他的,发现没有合适的就决定自己写一个。
    考虑到复用,在.Net Framework2.0下开发。主要就是利用WebClient下载服务器网站目录下的文件,安全性暂没有考虑,比较适用于小型项目。

    UpdateFileClient.exe/UpdateFile.xml/UpdateFileCommon.dll/UpdateFileClient.exe.config[可选] 为客户端需要用到的文件

    UpdateFileServer.exe/UpdateServer.xml/UpdateFileCommon.dll 为服务端需要用到的文件

    注意事项:

    1.UpdateFileClient.exe依赖于.Net Framwork 2.0,如果主程序的.Net Framwork版本高于2.0,需要添加UpdateFileClient.exe.config文件(默认是兼容4.0)。
    如果主程序的.Net Framwork版本为2.0,请删除UpdateFileClient.exe.config文件。

    .Net Framwork 4.0是新的CLR,无法兼容旧版CLR。该方案主要兼容在Windows Xp下单独安装了.Net Framework 4.0 版本。
    Windows Vista/Win7 已经分别安装.Net Framework 2.0与3.5,具有CLR 2.0特性,需要删除App.config。

    主要功能

    • 支持单个或多个文件更新
      读取服务端XML配置文件,获取需要修改或新增的文件,然后进行下载,下载完成之后,更新本地版本。
    • 支持更新更新程序本身
      通过配置本地的XML文件,放置更新程序的目录。主程序启动时,进行检查,处理。
    • 服务端支持程序更改配置文件,无需手动更改XML

    使用方式

    • 配置服务端,需要能够通过正常访问XML和文件。一般采用新建一个web站点,发布到IIS的方式。

      将UpdateFileServer.exe/UpdateServer.xml/UpdateFileCommon.dll 拷贝到服务端,通过UpdateFileServer.exe配置XML。

    • 将主程序运行需要的文件通过XML配置起来

      将Update.xml、UpdateFileClient.exe、UpdateFileCommon.dll添加到启动程序相同目录,主程序需要引用UpdateFileCommon.dll。
      将启动程序需要更新的文件通过XML进行配置,放在File节点下,初始版本为1。
      配置服务端XML所在路径,当前版本、版本对应的值、临时文件夹、更新程序名称可以采用默认值。

    • 实现更新程序的更新

      需要在主程序中添加一行代码,进行检查临时文件夹是否包含更新程序,如果有,进行剪切操作。

    using UpdateFileCommon;
    //发现新的更新程序,进行剪切到根目录
    VersionHelper.CutNewUpdateEXE();
    
    • 按需添加检查更新代码

      可以在程序启动时或者点击按钮进行检查更新操作。
      检查更新是弹窗进行提醒,需要传两个参数,一个更新描述,一个是否强制更新。对应XML节点是服务端XML的ReleaseNote和IsMustUpdate。
      NextShowEvent 事件是点击按钮下次提醒需要执行的操作。

      Winform

        //默认的LoginView为登陆窗体
        ApplicationContext context = new ApplicationContext(new LoginView());
        //发现设定的目录存在新的更新程序,进行剪切到根目录
        VersionHelper.CutNewUpdateEXE();
    
        //检查是否需要下载安装包,不需要下载返回False
        if (!VersionHelper.GetNewVersionToDownloadSetup())
        {
            //检查版本更新
            if (VersionHelper.IsRequiredUpdate())
            {
                string xmlPath = System.AppDomain.CurrentDomain.BaseDirectory + "UpdateFile.xml";
                if (File.Exists(xmlPath))
                {
                    //加载XML路径
                    XmlDocument doc = new XmlDocument();
                    doc.Load(VersionHelper.GetLoaclServerConfigURL(xmlPath));
                    //获取值
                    var releaseNote = VersionHelper.GetServiceReleaseNote(doc);
                    var isMustUpdate = VersionHelper.GetServiceIsMustUpdate(doc);
                    PromptingForm form = new PromptingForm(releaseNote, isMustUpdate);
                    //赋值委托,点击下次提醒的按钮执行的操作
                    form.NextShowEvent += delegate
                    {
                        //执行xxx
                    };
                    context = new ApplicationContext(form);
                }
            }
        }
        
        //do something
         Application.Run(context);
    

    WPF

    WPF中需要特殊处理,在WPF项目中添加Program.cs文件,添加Main方法,项目右键属性,设置Program为启动对象。

    [STAThread]
    static void Main()
    {
        //发现设定的目录存在新的更新程序,进行剪切到根目录
        VersionHelper.CutNewUpdateEXE();
    
        //检查是否需要下载安装包,不需要下载返回False
        if (!VersionHelper.GetNewVersionToDownloadSetup())
        {
            //检查版本更新
            if (VersionHelper.IsRequiredUpdate())
            {
                string xmlPath = System.AppDomain.CurrentDomain.BaseDirectory + "UpdateFile.xml";
                if (File.Exists(xmlPath))
                {
                    //加载XML路径
                    XmlDocument doc = new XmlDocument();
                    doc.Load(VersionHelper.GetLoaclServerConfigURL(xmlPath));
                    //获取值
                    var releaseNote = VersionHelper.GetServiceReleaseNote(doc);
                    var isMustUpdate = VersionHelper.GetServiceIsMustUpdate(doc);
                    PromptingForm form = new PromptingForm(releaseNote, isMustUpdate);
                    //赋值委托,点击下次提醒的按钮执行的操作
                    form.NextShowEvent += delegate
                    {
                        //执行xxx
                    };
                    //这里启动PromptingForm窗体
                    form.ShowDialog();
                }
            }
        }
        //不需要更新时,默认启动登陆窗体
        else
        {
            LoginView view = new LoginView();
            view.ShowDialog();
        }
    }
    

    联系我们

    CheckUpdate.Net交流群 137867517 [点击加群]

  • 相关阅读:
    Struts2(一)
    MVC初识
    Ajax简述
    策略模式(Strategy)简介
    代理(Proxy)模式简介
    简单工厂模式--工厂方法模式(简介)
    设计模式简介
    面象对象设计原则简介
    Java从零开始学四十一(反射简述二)
    Hibernate(十五)注解
  • 原文地址:https://www.cnblogs.com/xcong/p/3969912.html
Copyright © 2011-2022 走看看