C#程序在局域网内自动更新

需要开发一个小软件供自己部门内的同事使用。需求提的比较多,部分功能又急着用,因此要在软件发布后能够在局域网里自动更新。

思路是参考网上的:

在局域网内找一台电脑(自己的电脑)打开文件共享,共享的文件夹就是局域网内发布新版软件的路径

在C#程序入口先检查文件更新,如有更新版本,利用一个bat脚本文件结束本软件进程,从发布地址复制新文件到本地,启动更新后的软件

 

主程序初始化前检查更新

其中 System.AppDomain.CurrentDomain.BaseDirectory 用于获得当前程序运行目录的完整路径

private const string updataPath = @"共享文件夹的网络路径";

        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            try
            {
                //程序更新
                File.Delete(AppDomain.CurrentDomain.BaseDirectory + @"updata.bat");//删除用于更新的脚本文件
                if (checkUpdateLoad())//此函数检查发布路径内的文件版本是否更新
                {
                    update();//调用脚本文件更新本程序
                    Application.Exit();
                    return;
                }

                //不需要更新,正常初始化程序
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new FormUI());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

 

通过比对发布端的文件版本来判断是否需要更新

 System.Diagnostics.FileVersionInfo.GetVersionInfo(string path) 可以获取一个指定文件的版本号;

 System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() 可以获得本程序集的版本号;

/// <summary>
        /// 检查版本
        /// </summary>
        /// <returns></returns>
        public static bool checkUpdateLoad()
        {
            bool result = false;
            try
            {
                //获取服务器上的程序集版本
                Version fv=System.Reflection.AssemblyName.GetAssemblyName(updataPath + @"\ExcelTools.exe").Version;
                //对比现版本
                if (fv.CompareTo(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()) == 1) 
                {
                    result = true;
                }
                else
                {
                    result = false;
                }
            }
            catch (Exception)
            {
                result = false;
            }
            return result;
        }

 

该方法从服务器段复制用于更新的批处理文件(updata.bat)到运行目录下

利用CreateNoWindow 和UseShellExecute 属性实现批处理文件静默执行。

//复制更新的批处理文件
        public static void update()
        {
            Process p = new Process();
            File.Copy(updataPath + @"\updata\updata.bat", AppDomain.CurrentDomain.BaseDirectory + @"updata.bat", true);
            p.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + @"updata.bat";
            p.StartInfo.CreateNoWindow = true;   //不创建该进程的窗口
            p.StartInfo.UseShellExecute = false;   //不使用shell壳运行
            p.Start();
        }

 

用于更新的批处理文件

cd /d %~dp0
taskkill /f /im "ExcelTools.vshost.exe"
taskkill /f /im "ExcelTools.exe"
copy 发布路径\*.* /y
start ExcelTools.exe
 cd /d %~dp0 //设置目录到本文件当前目录下。 taskkill /f /im "目标进程名" //退出目标程序,防占用。
 copy 发布路径\*.* /y //复制发布路径下的所有文件(不含文件夹)到当前目录下,/y不表示不经确认直接覆盖。 start 新执行文件名 重新启动更新后的程序

启动主程序后会此脚本会被 File.Delete(AppDomain.CurrentDomain.BaseDirectory + @"updata.bat"); 删除,用户基本感受不到更新过程的存在。





posted @ 2021-11-12 13:12  HVAC_Coder  阅读(68)  评论(0)    收藏  举报