C# Winform自动升级(一)版本号校验

2020年11月29日 Jerry 4793 2021年1月13日

基本所有的软件都会有自动更新功能,方便解决其中的bug或增添新功能,那自动更新是如何实现的呢?这篇文章开始记录下自己实现的自动更新器。

升级的流程图思路大概如下:

流程图很清楚,接下来搞定具体的实现。

为了直观地实现其中的每一步,我搞了个界面和多个按钮,模拟其中的一步步操作。

升级前先准备好升级XML文件以及升级压缩包:

1、准备好升级的文件,压缩打包并计算出MD5供下载后的校验,随后上传到服务器。我这里压缩包(newfile.zip)就只有一个txt文档,升级的服务器用了网站的CDN服务器。

2、新建了一个XML文件testupdate.xml,内容如下:

<?xml version="1.0" encoding="utf-8" ?>  
<Update> 
   <Soft Name="update"> 
     <Verson>1.0.0.3</Verson>  
     <DownLoad>https://cdn2.jerrycoding.com/newfile.zip</DownLoad>
     <Md5>9c12161031c2ec9b3c010d945c495ad7</Md5>
  </Soft> 
</Update> 

组成部分一目了然:1)version(字母写错了 已经上传了就懒得改了);2)升级包文件下载地址;3)升级包MD5校验。

当然你可以根据需要随意修改你的XML文件,这里我就以这个简单示例。

3、下载升级XML文件

/// <summary>
/// 下载xml文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
    string url = textBox1.Text;
    WebClient client = new WebClient();

    richTextBox1.AppendText("开始下载XML...");

    try
    {
        g_upxmlname = System.IO.Path.GetFileName(url);
        client.DownloadFile(url, System.Environment.CurrentDirectory + "\\" + g_upxmlname);
        richTextBox1.AppendText("\n下载XML完成!");
    }
    catch (Exception ex)
    {
        richTextBox1.AppendText("\n下载失败,错误" + ex.Message);
    }

}

实现效果:

4、解析下载后的升级文件

/// <summary>
/// XML 解析
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{

    //解析 下载 XML

    XmlDocument doc = new XmlDocument();
    doc.Load(System.Environment.CurrentDirectory + "\\" + g_upxmlname);

    XmlElement root = null;
    root = doc.DocumentElement;


    XmlNodeList nodeList = null;
    nodeList = root.SelectNodes("/Update/Soft");

    foreach (XmlElement el in nodeList)//读元素值 
    {
        List<String> strlist = new List<String>();
        richTextBox1.AppendText("\n下载的xml内容:");
        foreach (XmlNode node in el.ChildNodes)
        {
            richTextBox1.AppendText("\n" + node.Name + ":" + node.InnerText);
            strlist.Add(node.InnerText);
        }
        g_upxml.version = strlist[0];
        g_upxml.url = strlist[1];
        g_upxml.md5 = strlist[2];
    }

    //解析 本地XML

    doc.Load(System.Environment.CurrentDirectory + "\\" + g_localxmlname);

    root = doc.DocumentElement;
    nodeList = root.SelectNodes("/Local/Soft");

    foreach (XmlElement el in nodeList)//读元素值 
    {
        List<String> strlist = new List<String>();
        foreach (XmlNode node in el.ChildNodes)
        {
            richTextBox1.AppendText("\n本地xml内容:\n" + node.Name + ":" + node.InnerText);
            strlist.Add(node.InnerText);
        }
        g_loxml.version = strlist[0];
    }

}

/// <summary>
/// 版本号比较
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button5_Click(object sender, EventArgs e)
{
    richTextBox1.AppendText("\n本地版本号:" + g_loxml.version);
    richTextBox1.AppendText("\n待升级版本号:" + g_upxml.version);
    if (g_loxml.version == g_upxml.version)
    {
        richTextBox1.AppendText("\n版本号一致,无需升级!");
        return;
    }
    else
    {
        richTextBox1.AppendText("\n版本号校验完成,需要升级!");
        return;
    }

}

其中定义了个结构体,保存下解析出的版本号、下载路径及Md5

private struct MyXml_S
{
    public string version;
    public string url;
    public string md5;
};

MyXml_S g_upxml;
MyXml_S g_loxml;

实现效果:

到这就基本完成了XML文件的解析与版本号的校验。

 

实现代码 GITHUB: https://github.com/DreamerLS1994/autoupdater


原创文章,转载请注明出处: https://jerrycoding.com/article/csharp-autoupdate1

微信
jerry微信赞助
支付宝
jerry支付宝赞助

您尚未登录,暂时无法评论。请先 登录 或者 注册

0 人参与 | 0 条评论