• Winform(C#.NET)自动更新组件的使用及部分功能实现


    Winform(C#.NET)自动更新组件的使用及部分功能实现

     

    声明:核心功能的实现是由园子里圣殿骑士大哥写的,本人是基于他核心代码,按照自己需求进行修改的。

         而AutoUpdaterService.xml文件生成工具是基于评论#215楼 ptangbao的代码而改写的。

    由于这个组件是在10年写的,.net也有更新有的方法已提示过时,更改如下:

    //Added the function to support proxy
    //clientDownload.Proxy = System.Net.WebProxy.GetDefaultProxy();
    clientDownload.Proxy = WebRequest.GetSystemWebProxy();

    更改的主要功能如下:

      1》如果有更新将会直接更新,不再提供由用户点击确定后再更新。(强制更新)(这个暂时没有整理出来,后续会整理出来)

      2》更新前判断主程序进程是否开启:

      如果有更新,主程序开启,关闭主程序,更新完成后自动启动主程序。

      如果没有更新,直接启动主程序。

      3》不再根据版本号不同进行更新。

      圣殿骑士大哥的是根据版本号,当然这也是最正规的,可是我们的程序有点特殊,所以不再根据版本号控制,而是根据GUID。

      这样就是有一点好处不管版本号一不一样,只要GUID不一样就是要更新。

      比如文件夹如下:

      

      使用CreateXmlTools.exe工具生成xml文件,增加的节点属性有version,值时GUID

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <updateFiles>
      <file path="AutoUpdater.dll" url="http://172.30.100.55:8011/AutoUpdater.dll" lastver="5.0.0.0" size="26624" needRestart="false" version="1ef2b9dc-d14f-4fc4-a5ec-bdb07a6ba98c" />
      <file path="ReadMe.dll" url="http://172.30.100.55:8011/ReadMe.dll" lastver="" size="472" needRestart="false" version="3ddc1926-3088-468f-9088-92b07156c757" />
      <file path="aspnet_client/ReadMe.dll" url="http://172.30.100.55:8011/aspnet_client/ReadMe.dll" lastver="" size="472" needRestart="false" version="4aaa87e2-63bd-486a-9957-1c2df21607cb" />
    </updateFiles>
    复制代码

      version就是用来替代lastver的,只要不一样就更新

      4》客户端更新主程序更改autoupdater.config文件的更新方式

      config里不必包含所有文件的配置,只要求配置成如下:  

    复制代码
    <?xml version="1.0" encoding="utf-8" ?>
    <Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Enabled>true</Enabled>
      <ServerUrl>http://172.30.100.55:8011/AutoupdateService.xml</ServerUrl>
      <UpdateFileList>
        
      </UpdateFileList>
    </Config>
    复制代码

      ServerUrl就是web服务器的地址加上面生成xml文件的地址。

      更新完成后客户端会自动更新autoupdater.config文件,将本地的guid保持与服务端一致,再次点击guid一致的不再更新

    以上是大致改动的地方。

    下面来说说代码吧:

    由于增加了GUID这块,所以RemoteFile、LocalFile和DownloadFileInfo三个实体类都应该增加一个字段和一个属性

    LocalFile.cs

     View Code

    RemoteFile.cs

     View Code

    DownloadFileInfo.cs

     View Code

    ConstFile.cs

    一些常量配置文件

    CommonUnitity.cs

    复制代码
    //主要是更改获取多层目录文件夹路径
    public
    static string GetFolderUrl(DownloadFileInfo file) { string folderPathUrl = string.Empty; int folderPathPoint = file.DownloadUrl.IndexOf("/", 15) + 1; string filepathstring = file.DownloadUrl.Substring(folderPathPoint); //int folderPathPoint1 = filepathstring.IndexOf("/"); //string filepathstring1 = filepathstring.Substring(folderPathPoint1 + 1); //if(filepathstring1.IndexOf("/") != -1) if(filepathstring.IndexOf("/") != -1) { //string[] ExeGroup = filepathstring1.Split('/'); string[] ExeGroup = filepathstring.Split('/'); for (int i = 0; i < ExeGroup.Length - 1; i++) { folderPathUrl += "\" + ExeGroup[i]; } if (!Directory.Exists(SystemBinUrl + ConstFile.TEMPFOLDERNAME + folderPathUrl)) { Directory.CreateDirectory(SystemBinUrl + ConstFile.TEMPFOLDERNAME + folderPathUrl); } } return folderPathUrl; }
    复制代码

    autoupdater.cs

     View Code

    OperProcess.cs

     View Code

    DownloadProgress.cs

     View Code

    以上就是整体的自动更新程序核心代码。

    下面是创建xml的程序代码:

    代码是根据评论修改的如下:

     View Code

    由于我的主程序是被别人写死的(没有修改权限没有代码)所以我只能单独写更新程序,由用户打开我的更新程序调用exe的方式来处理

    所以多了一个程序专门用来更新的

     View Code

    1、服务器端
      1、CreateXmlTools.exe给发布dll人员使用,用来生成要升级文件的列表,放在更新文件中的。
      2、webServer地址是web服务器的地址。
      3、点击生成之后会生成一个文件名为AutoupdateService.xml文件。
      4、将生成的xml文件放置在web服务器的根目录里。
    2、客户端
      1、AutoUpdater.Config,该文件是保证客户端更新程序调用获取更新文件列表时使用的。
      2、KnightsWarrior.exe更新主程序,用户直接调用该文件
      3、AutoUpdater.dll更新程序的核心程序

    本程序是要结合web服务器使用的,所有要更新的文件需要放在搭建的web服务器上,按照对应的目录存放,点CreateXmlTools.exe会生成一个xml文件的。

    以上就是所有修改和增加部分的程序的代码及一些简要说明。建议先去看看组件源码,圣殿骑士大哥将其托管在托管地址。欢迎拍砖!

    快快乐乐敲代码,做一个专业的码农!
     
  • 相关阅读:
    基于JWT用户认证方式(前后端分离)
    git推送时报错:hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing
    (fields.E210) Cannot use ImageField because Pillow is not installed....解决方法
    python3.6报错:AttributeError: 'str' object has no attribute 'decode'
    于在Python3.6.7 +Ubuntu16.04下安装channels报错
    docsify 搭建优雅项目文档
    SQLSERVER 系统表查询
    数据立方建立-如何实现一对多,多对多
    从BI分析角度,数据立方的建立方法
    MYSQL库内所有表名及表结构获取
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3448605.html
Copyright © 2020-2023  润新知