/// /summary [STAThread] static void Main(){String path = A

时间:2022-06-05 03:30:38

  本地措施在实际项目使用过程中,因为可以操纵电脑本地的一些信息,并且对付串口、OPC、并口等数据可以便利的进行收发,虽然此刻软件行业看着动不动都是互联网啊啥的,大有Web处事就是高大上的觉得,但是作为本地的应用还是有着非常重要的位置,出格是在制造业工厂里,车间里相关的措施。

  抛开一切业务上的成果不谈,本地措施一直对照诟病的处所就是在于软件的更新上,由于措施都在客户端电脑上运行,当需要更新的时候,就不得不由专门的实施人员过去,部署更新,无形中增加项目本钱,SO,对付c/s措施的自动更新也是对照苦恼的问题,下面我就来稍微解析下,一个自动更新措施应该要怎么实现(PS:思路可能对照传统,欢迎大家拍砖供给更好的思路

二、自动更新的存眷点

  

/// /summary [STAThread] static void Main(){String path = A

  如图所示,对付一个自动更新措施,存眷点应该都是以上几个点

打点员权限,在win7以后,如果应用位置在C盘的话,每次操纵目录城市申请打点员权限,emmmm,所以这个必需要考虑

对付要实现一个较为通用的自动更新,应该要安置了.NetFrameWork的都要可以使用,并且便利使用

更新措施同时要只能启动一个,不然必定掉事儿,虽然很少有会有人去点2次,但是还是要考虑

界面要求上,更新说明以及进度条要显示

很多时候可能我们也是需要一个静默更新的操纵

运行更新的时候,记得要*运行的措施,不然必定更新掉败

对付更新掉败,得有完善的回滚以及备份机制

更新告成后,得可以启动对应的主措施

有些 时候措施部分信息是记录在注册内外,如果注册表要改削咋办呢,so,对付注册表也得要撑持

有些时候措施更新到后面,会呈现一些多余的DLL,这些DLL那也是要干失滴(虽然感受有点鸡肋)

  概略就是以上的一些点,这些是我本身思考的时候罗列出来的,可能对照乱,大家大白就好

三、设计说明

  

/// /summary [STAThread] static void Main(){String path = A

  更新措施主要流程如图所示,大的流程标的目的上是对照简单的,但是如果深入后,还是有部分会对照庞大

/// /summary [STAThread] static void Main(){String path = A

  措施类的一些简单说明

  config.update:注册表的增删法则以及文件的删除法则,如下法则所示

[regedit_del] //删除注册表 SOFTWARE\\XXX\\XXX,name [regedit_add]//新增注册表 SOFTWARE\\XXX\\XXXX,name=John Doe [file_del] //删除文件 hello.dll

  Server.xml&RemoteInfo.cs:处事真个版本配置文件信息

  Local.xml&LocalInfo.cs:客户真个版本配置文件信息

  UpdateWork.cs:核心的更新要领,为了便利后续有界面定制化的需求,将更新相关的全部放在UpdateWork中,使用UpdateWork.Do要领就可以进行更新

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  一些细节说明

  1、如何让措施尽量的便利集成?

  由于自动更新措施必需是要与主措施分隔的,所以我们要让主措施启动更新措施的时候,将主措施本身的信息带进去,这样才可以尽可能的做到通用

/// <summary> /// 应用措施的主入口点。
     /// <param>[0]措施名称,[1]静默更新 0:否 1:是</param> 
/// </summary> [STAThread] static void Main(string[] args) { if (f) { try { if (String.IsNullOrEmpty(args[0]) == false) { UpdateWork updateWork = new UpdateWork(args[0]); if (updateWork.UpdateVerList.Count > 0) { /* 当前用户是打点员的时候,直接启动应用措施 * 如果不是打点员,则使用启动东西启动措施,以确保使用打点员身份运行 */ //获恰当前登录的Windows用户标示 System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent(); //创建Windows用户主题 Application.EnableVisualStyles(); System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity); //判断当前登录用户是否为打点员 if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)) { if (args[1] == "1") { updateWork.Do(); } else { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm(updateWork)); } } else { String result = Environment.GetEnvironmentVariable("systemdrive"); if (AppDomain.CurrentDomain.BaseDirectory.Contains(result)) { //创建启动东西 ProcessStartInfo startInfo = new ProcessStartInfo { //设置运行文件 FileName = System.Windows.Forms.Application.ExecutablePath, //设置启动行动,确保以打点员身份运行 Verb = "runas", Arguments = " " + args[0] + " " + args[1] }; //如果不是打点员,则启动UAC System.Diagnostics.Process.Start(startInfo); } else { if (args[1] == "1") { updateWork.Do(); } else { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm(updateWork)); } } } } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } }