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"); 删除,用户基本感受不到更新过程的存在。

浙公网安备 33010602011771号