文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-11-13 18:23

关注

前言

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

写代码还是要尽量的保证通用性,以便以后需要的时候可以拿来稍微改改甚至直接使用。所以在这里我们将自动更新的程序抽象出来,即对于客户端来说,它只包含三个文件(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更新程序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯