C# WinForm实现自动更新程序之客户端的示例代码

目录
  • 前言
  • 开发环境
  • 开发工具
  • 实现代码
  • 实现效果

前言

第二步理论上我们该写客户端了,但是,在此之前,需要先介绍下一些必要的方法以及操作。

写代码还是要尽量的保证通用性,以便以后需要的时候可以拿来稍微改改甚至直接使用。所以在这里我们将自动更新的程序抽象出来,即对于客户端来说,它只包含三个文件(AutoUpdate.dll、AutoUpdate.exe、UpdateList.xml,如果是.NET Framework的话,其实是没有AutoUpdate.dll文件的,就一个exe就足够了。这也是我为什么一直不用NET Core来写Winform程序的原因之一);然后将这三个文件放到主程序的目录中即可。

然后就是传参调用,在Program文件中做了以下代码操作。所以调用的时候需要将主程序的执行目录以及进程名传过来,作用分别是再更新完后自动启动以及更新之前把相关的进程杀掉以便完成更新。

同时可以看到在更新的时候,有一个图片旋转的动作,也一并放到此篇文章中。

开发环境

.NET Core 3.1

开发工具

Visual Studio 2019

实现代码

//更新程序
namespace AutoUpdate {
    static class Program {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args) {
            if(args.Length != 1) {
                return;
            }
            var arg = args[0].Split("|*|");
            if(arg.Length == 0) {
                return;
            }
            string runPath = arg[0];
            string procesName = arg[1];
            Process[] processes = Process.GetProcesses();
            foreach(Process process in processes) {
                if(process.ProcessName == procesName) {
                    process.Kill(true);
                }
            }
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form_update(runPath));
        }
    }
}
//主程序
namespace AutoUpdate.Test {
    static class Program {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() {

            Update();

            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        readonly static string updateXml = Application.StartupPath + "UpdateList.xml";
        /// <summary>
        /// 获取本地更新地址
        /// </summary>
        /// <returns></returns>
        static string GetUpdateUrl() {
            XElement xele = XElement.Load(updateXml);
            string url = xele.Element("url").Value;
            return url;
        }

        /// <summary>
        /// 获取本地更新文件
        /// </summary>
        /// <returns></returns>
        static string GetUpdateFiles() {
            XDocument xdoc = XDocument.Load(updateXml);
            var files = from f in xdoc.Root.Element("files").Elements() select new { name = f.Attribute("name").Value, version = f.Attribute("version").Value };
            return JsonConvert.SerializeObject(files);
        }

        /// <summary>
        /// 检查是否需要更新
        /// </summary>
        /// <returns></returns>
        static bool CheckUpdate() {
            string url = GetUpdateUrl();
            HttpResult httpResult = HttpUtil.HttpRequest(new HttpItem(url + "GetUpdateFiles", requestData: GetUpdateFiles()));
            if(httpResult.Status) {
                UpdateModel_Out output = JsonConvert.DeserializeObject<UpdateModel_Out>(httpResult.HttpStringData);

                if(output.updateList.Count > 0)
                    return true;
            }
            return false;
        }

        static void Update() {
            if(CheckUpdate()) {
                string processName = Assembly.GetExecutingAssembly().GetName().Name;

                ProcessStartInfo info = new ProcessStartInfo(Application.StartupPath + "AutoUpdate.exe", Process.GetCurrentProcess().MainModule.FileName + "|*|" + processName);
                Process.Start(info);
                Environment.Exit(0);
            }
        }
    }
}
public static class ImageEx {
        /// <summary>
        /// 旋转图片
        /// </summary>
        /// <param name="image"></param>
        /// <param name="angle"></param>
        /// <returns></returns>
        public static Image RotateImage(this Image image, float angle) {
            if(image == null)
                throw new ArgumentNullException("image");
            float dx = image.Width / 2.0f;
            float dy = image.Height / 2.0f;

            Bitmap rotatedBmp = new Bitmap(image.Width, image.Height);
            rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);

            Graphics g = Graphics.FromImage(rotatedBmp);
            g.TranslateTransform(dx, dy);
            g.RotateTransform(angle);
            g.TranslateTransform(-dx, -dy);
            g.DrawImage(image, new PointF(0, 0));

            g.Dispose();
            return rotatedBmp;
        }
    }

实现效果

代码解析

这里可以关注下在主程序中的获取更新地址以及文件等方法,其实我这里是有重复判断的,即在主程序中判断了一遍,还会在更新程序中判断一遍,如果觉得不需要,可以执行选择去掉,全部交给更新程序去做。但是也就需要统一放在更新程序的入口中做处理了,相对而言,我觉得写两遍还是很方便。

到此这篇关于C# WinForm实现自动更新程序之客户端的示例代码的文章就介绍到这了,更多相关C# WinForm更新程序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C# WinForm如何实现自动更新程序

    目录 前言 开发环境 开发工具 实现代码 实现效果 前言 在C/S这种模式中,自动更新程序就显得尤为重要,它不像B/S模式,直接发布到服务器上,浏览器点个刷新就可以了.由于涉及到客户端文件,所以必然需要把相应的文件下载下来.这个其实比较常见,我们常用的微信.QQ等,也都是这个操作. 自动更新程序也分为客户端和服务端两部分,客户端就是用来下载的一个小程序,服务端就是供客户端调用下载接口等操作. 这里第一步先将服务端代码写出来,逻辑比较简单,使用xml文件分别存储各个文件的名称以及版本号(每次需要更

  • c# 如何实现自动更新程序

    主要功能介绍 实现文件的自动更新.主要功能: 支持整包完全更新,即客户端只需输入一个服务器地址,即可下载所有文件. 支持增量更新,即只更新指定的某几个文件. 支持自动更新程序的更新 更新界面如图: 客户端 main方法入口 /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { //在主程序中 更新替换自动升级程序 //ReplaceAutoUpgrade(); bool isEnte

  • C# Winform 自动更新程序实例详解

    本文实例为大家分享了C# Winform 自动更新程序,供大家参考,具体内容如下 第一步:检查更新 检查更新其实无非就是去比较更新包的版本和本地软件版本,如果高则更新.低则不更新.怎么获取版本号方法很多,本案例是获取软件的配置文件. private bool CheckUpdate() { bool result = false; try { string Cfg = TxtRead(exePath "\\Config.txt"); ConfigLocal = JsonConvert.

  • 用c# 自动更新程序

    作者:冰封一夏 出处:http://www.cnblogs.com/bfyx/ HZHControls官网:http://www.hzhcontrols.com 首先看获取和更新的接口 更新程序Program.cs using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Threading.Tasks; us

  • c# Winform 程序自动更新实现方法

    Winform程序自动更新我也是第一次做,网上找了自动更新的源码,后来又根据在网上看到的一些方法,自己试了很久,最终还是有写错误,所以花了钱让别人帮忙调试成功的,下面是我自己捣腾出来的,方便大家借鉴,如果有什么错误的地方欢迎指正. 1.由于我是通过服务器的IIS发布自动更新的,更新之前先手动把程序复制到IIS服务器的目录下面,做一些更改,客户端才能正常自动更新.所以第一步是不熟IIS服务器(本人系统windows8): 按照上面的方式,选了之后点确定,系统会自动添加这些内容,然后: 网站建立好了

  • C# WinForm实现自动更新程序之客户端的示例代码

    目录 前言 开发环境 开发工具 实现代码 实现效果 前言 第二步理论上我们该写客户端了,但是,在此之前,需要先介绍下一些必要的方法以及操作. 写代码还是要尽量的保证通用性,以便以后需要的时候可以拿来稍微改改甚至直接使用.所以在这里我们将自动更新的程序抽象出来,即对于客户端来说,它只包含三个文件(AutoUpdate.dll.AutoUpdate.exe.UpdateList.xml,如果是.NET Framework的话,其实是没有AutoUpdate.dll文件的,就一个exe就足够了.这也是

  • Android App实现应用内部自动更新的最基本方法示例

    这只是初步的实现,并没有加入自动编译等功能.需要手动更改更新的xml文件和最新的apk.    共涉及到四个文件! 一.客户端 AndroidUpdateTestActivity:程序首页 main.xml:首页布局 Update:更新类 softupdate_progress:更新等待界面 Updage package majier.test; import java.io.File; import java.io.FileOutputStream; import java.io.IOExce

  • 小程序使用分包的示例代码

    本文介绍了小程序使用分包的示例代码,分享给大家,具体如下: 官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages.html 某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载. 总结就是小程序内所有代码图片资源大小超过2M,此时就可以考虑创建分包,扩大小程序容量 目前小程序分包大小有以下限制: 整个小程序所有分包大小不超过 12M 单个分包/主包大小不

  • SpringBoot如何实现一个实时更新的进度条的示例代码

    前言 博主近期接到一个任务,大概内容是:导入excel表格批量修改状态,期间如果发生错误则所有数据不成功,为了防止重复提交,做一个类似进度条的东东. 那么下面我会结合实际业务对这个功能进行分析和记录. 正文 思路 前端使用bootstrap,后端使用SpringBoot分布式到注册中心,原先的想法是导入表格后异步调用修改数据状态的方法,然后每次计算修改的进度然后存放在session中,前台jquery写定时任务访问获取session中的进度,更新进度条进度和百分比.但是这存在session在服务

  • C++编写的WebSocket服务端客户端实现示例代码

    目录 使用过标准的libwebsockets服务端库测试过,主要是短小精悍,相对于libwebsockets不需要依赖zlib和openssl 以及其他库,直接make就可以使用了,linux跟windows都可以使用. 测试用例: #include "easywsclient.hpp" #include <assert.h> #include <stdio.h> #include <string> using easywsclient::WebSo

  • uniapp 实现微信小程序全局分享的示例代码

    目录 创建全局分享内容文件 引入并全局注册该文件 自定义页面分享内容  uniapp 实现微信小程序的全局转发给好友/分享到朋友圈的功能.主要使用 Vue.js 的 全局混入 概念. 下面直接上 实现步骤和代码: 创建全局分享内容文件 1.创建一个全局分享的 js 文件.示例文件路径为:@/common/share.js ,在该文件中定义全局分享的内容: export default { data() { return { // 默认的全局分享内容 share: { title: '全局分享的标

随机推荐