C# winform实现自动更新

 更新时间:2024年10月29日 08:38:04   作者:刘向荣  
这篇文章主要为大家详细介绍了C# winform实现自动更新的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

1.检查当前的程序和服务器的最新程序的版本,如果低于服务端的那么才能升级

2.服务端的文件打包.zip文件

3.把压缩包文件解压缩并替换客户端的debug下所有文件。

4.创建另外的程序为了解压缩覆盖掉原始的低版本的客户程序。

有个项目Update 负责在应该关闭之后复制解压文件夹 完成更新

这里选择winform项目,项目名Update

以下是 Update/Program.cs 文件的内容:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Threading;
using System.Windows.Forms;

namespace Update
{
    internal static class Program
    {
        private static readonly HashSet<string> selfFiles = new HashSet<string> { "Update.pdb", "Update.exe", "Update.exe.config" };

        [STAThread]
        static void Main()
        {
            string delay = ConfigurationManager.AppSettings["delay"];

            Thread.Sleep(int.Parse(delay));

            string exePath = null;
            string path = AppDomain.CurrentDomain.BaseDirectory;
            string zipfile = Path.Combine(path, "Update.zip");

            try
            {
                using (ZipArchive archive = ZipFile.OpenRead(zipfile))
                {
                    foreach (ZipArchiveEntry entry in archive.Entries)
                    {
                        if (selfFiles.Contains(entry.FullName))
                        {
                            continue;
                        }

                        string filepath = Path.Combine(path, entry.FullName);

                        if (filepath.EndsWith(".exe"))
                        {
                            exePath = filepath;
                        }
                        entry.ExtractToFile(filepath, true);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("升级失败" + ex.Message);
                throw;
            }

            if (File.Exists(zipfile))
                File.Delete(zipfile);

            if (exePath == null)
            {
                MessageBox.Show("找不到可执行文件!");
                return;
            }

            Process process = new Process();
            process.StartInfo = new ProcessStartInfo(exePath);
            process.Start();
        }

    }
}

以下是 App.config 文件的内容:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
	<appSettings>
		<add key="delay" value="3000"/>
	</appSettings>
</configuration>

winform应用

软件版本

[assembly: AssemblyFileVersion("1.0.0.0")]

if (JudgeUpdate())
{
    UpdateApp();
}

检查更新

private bool JudgeUpdate()
{
    string url = "http://localhost:8275/api/GetVersion";

    string latestVersion = null;
    try
    {
        using (HttpClient client = new HttpClient())
        {
            Task<HttpResponseMessage> httpResponseMessage = client.GetAsync(url);
            httpResponseMessage.Wait();

            HttpResponseMessage response = httpResponseMessage.Result;
            if (response.IsSuccessStatusCode)
            {
                Task<string> strings = response.Content.ReadAsStringAsync();
                strings.Wait();

                JObject jObject = JObject.Parse(strings.Result);
                latestVersion = jObject["version"].ToString();

            }
        }

        if (latestVersion != null)
        {
            var versioninfo = FileVersionInfo.GetVersionInfo(Application.ExecutablePath);
            if (Version.Parse(latestVersion) > Version.Parse(versioninfo.FileVersion))
            {
                return true;
            }
        }
    }
    catch (Exception)
    {
        throw;
    }
    return false;
}

执行更新

public void UpdateApp()
{
    string url = "http://localhost:8275/api/GetZips";
    string zipName = "Update.zip";
    string updateExeName = "Update.exe";

    using (HttpClient client = new HttpClient())
    {
        Task<HttpResponseMessage> httpResponseMessage = client.GetAsync(url);
        httpResponseMessage.Wait();

        HttpResponseMessage response = httpResponseMessage.Result;
        if (response.IsSuccessStatusCode)
        {
            Task<byte[]> bytes = response.Content.ReadAsByteArrayAsync();
            bytes.Wait();

            string path = AppDomain.CurrentDomain.BaseDirectory + "/" + zipName;

            using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                fs.Write(bytes.Result, 0, bytes.Result.Length);
            }
        }

        Process process = new Process() { StartInfo = new ProcessStartInfo(updateExeName) };
        process.Start();
        Environment.Exit(0);
    }
}

服务端

using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using System.IO.Compression;

namespace WebApplication1.Controllers
{
    [ApiController]
    [Route("api")]
    public class ClientUpdateController : ControllerBase
    {

        private readonly ILogger<ClientUpdateController> _logger;

        public ClientUpdateController(ILogger<ClientUpdateController> logger)
        {
            _logger = logger;
        }

        /// <summary>
        /// 获取版本号
        /// </summary>
        /// <returns>更新版本号</returns>
        [HttpGet]
        [Route("GetVersion")]
        public IActionResult GetVersion()
        {
            string? res = null;
            string zipfile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "UpdateZip", "Update.zip");
            string exeName = null;

            using (ZipArchive archive = ZipFile.OpenRead(zipfile))
            {
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    //string filepath = Path.Combine(path, entry.FullName);

                    if (entry.FullName.EndsWith(".exe") && !entry.FullName.Equals("Update.exe"))
                    {
                        entry.ExtractToFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "UpdateZip", entry.FullName), true);
                        exeName = entry.FullName;
                    }
                }
            }

            FileVersionInfo versioninfo = FileVersionInfo.GetVersionInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "UpdateZip", exeName));
            res = versioninfo.FileVersion;

            return Ok(new { version = res?.ToString() });
        }

        /// <summary>
        /// 获取下载地址
        /// </summary>
        /// <returns>下载地址</returns>
        [HttpGet]
        [Route("GetUrl")]
        public IActionResult GetUrl()
        {
            // var $"10.28.75.159:{PublicConfig.ServicePort}"
            return Ok();
        }


        /// <summary>
        /// 获取下载的Zip压缩包
        /// </summary>
        /// <returns>下载的Zip压缩包</returns>
        [HttpGet]
        [Route("GetZips")]
        public async Task<IActionResult> GetZips()
        {
            // 创建一个内存流来存储压缩文件
            using (var memoryStream = new MemoryStream())
            {
                // 构建 ZIP 文件的完整路径
                var zipFilePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "UpdateZip", "Update.zip");
                // 检查文件是否存在
                if (!System.IO.File.Exists(zipFilePath))
                {
                    return NotFound("The requested ZIP file does not exist.");
                }
                // 读取文件内容
                var fileBytes = System.IO.File.ReadAllBytes(zipFilePath);
                // 返回文件
                return File(fileBytes, "application/zip", "Update.zip");
            }
        }

    }
}

到此这篇关于C# winform实现自动更新的文章就介绍到这了,更多相关winform自动更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#双缓冲实现方法(可防止闪屏)

    C#双缓冲实现方法(可防止闪屏)

    这篇文章主要介绍了C#双缓冲实现方法,结合实例形式分析了C#双缓冲的具体步骤与相关技巧,可实现防止闪屏的功能,需要的朋友可以参考下
    2016-02-02
  • c# 网络编程之http

    c# 网络编程之http

    这篇文章主要介绍了c# 提供一个HTTP服务的实现示例,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • c#数据绑定之向查询中添加参数(.Net连接外部数据库)

    c#数据绑定之向查询中添加参数(.Net连接外部数据库)

    本实例主要练习了ADO.Net连接到外部数据库的基础上,向查询中添加参数。使用的是ACCESS数据库
    2014-04-04
  • Winform使用DataGridView实现下拉筛选

    Winform使用DataGridView实现下拉筛选

    这篇文章主要为大家详细介绍了Winform如何使用原生DataGridView实现下拉筛选功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-09-09
  • C#使用System.Net.Mail类实现邮件发送

    C#使用System.Net.Mail类实现邮件发送

    这篇文章介绍了C#使用System.Net.Mail类实现邮件发送的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Asp.Net中MVC缓存详解

    Asp.Net中MVC缓存详解

    这篇文章主要介绍了Asp.Net中MVC缓存的种类区别等内容,一下来学习下。
    2017-12-12
  • C# List集合中获取重复值及集合运算详解

    C# List集合中获取重复值及集合运算详解

    这篇文章主要介绍了C# List集合中获取重复值及集合运算详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C#编程实现动态改变配置文件信息的方法

    C#编程实现动态改变配置文件信息的方法

    这篇文章主要介绍了C#编程实现动态改变配置文件信息的方法,涉及C#针对xml格式文件的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C# Dictionary和SortedDictionary的简介

    C# Dictionary和SortedDictionary的简介

    今天小编就为大家分享一篇关于C# Dictionary和SortedDictionary的简介,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • WinForm中变Enter键为Tab键实现焦点转移的方法

    WinForm中变Enter键为Tab键实现焦点转移的方法

    这篇文章主要介绍了WinForm中变Enter键为Tab键实现焦点转移的方法,主要通过一个ControlTools类来实现该功能,需要的朋友可以参考下
    2014-08-08

最新评论