我的更新数据操作(兼容两种模式,一种是updatesoftware,一种是UpdateSoftAPI)

1,在静态类下面写入更新文件的地址:

 /// 
        /// 当前更新执行文件夹(执行更新)
        /// 
        public static string UpdateEXEPath= Application.StartupPath + "\\Tools\\UpdateSoftAPI\\UpdateSoftAPI.exe";

        /// 
        /// 上一次更新执行文件所在文件夹(删除)
        /// 
        public static string UpdateEXELastPath = Application.StartupPath + "\\Tools\\UpdateSoft\\UpdateSoft.exe";

2.在软件的program启动程序开始时写入:

 static void Main(string[] Arg)//如果是使用有参数则是源文件登录,如果没有带参数先进入更新程序,查询完了再登录
        {
            #region 全局异常注册
            if (Arg == null || Arg.Length ==0 )//如果是有参数就直接跳过检测
            {
                if (File.Exists(GModel.UpdateEXELastPath))//删除之前更新文件夹
                {
                    string DirPath = GModel.UpdateEXELastPath.Substring(GModel.UpdateEXELastPath.LastIndexOf("\\")) ;
                    OPCommon.FileOP.DeleteDirectory(DirPath);
                }
                string UpdateSoftAt = GModel.UpdateEXEPath;//当前执行文件地址
                if (File.Exists(UpdateSoftAt))//如果存在就直接更新
                {
                    string GuidStr = "";
                    Assembly assem = Assembly.GetExecutingAssembly();
                    Type type = typeof(System.Runtime.InteropServices.GuidAttribute);
                    foreach (GuidAttribute guid in assem.GetCustomAttributes(type, false))
                    {
                        GuidStr = guid.Value;//本地软件Guid
                    }
                    string SoftVal = Assembly.GetExecutingAssembly().GetName().Version.ToString();//本地软件版本
                    string LocalPath = assem.Location; //本地软件地址
                    string CanshuOut = $"{GuidStr} {SoftVal} {LocalPath}";//软件GUID,版本号,软件启动地址
                    System.Diagnostics.Process.Start(UpdateSoftAt, CanshuOut);
                    //关闭当前实例    
                    System.Diagnostics.Process.GetCurrentProcess().Kill();
                    Application.Exit();//退出当前项目,如果是子项目,则不会停止主项目
                    //System.Environment.Exit(0);//停止所有项目
                }
            }  
            Application.ThreadException += Application_ThreadException; //UI线程异常
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; //多线程异常
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            #endregion
            bool ret;
            Mutex mutex = new Mutex(true, Application.ProductName, out ret);//重复启动检测
            if (ret)
            {
                //ResultMsg thisMsgChli =  new OpCommons().CreateMainUpdates();
                //if (thisMsgChli.Success)
                //{
                    FrmLogin frm = new FrmLogin();
                    if (frm.ShowDialog() == DialogResult.OK)
                    {
                        //Application.Run(new Frm检测结果上传());
                        Application.Run(new FormShowMain());
                    }
                //}
                
            }
            else
            {
                MessageBox.Show("该程序已经启动", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

        }

3.原理:点击本地执行文件后,则自动采集本软件的信息包含:软件GUID,版本号,软件启动地址,传给指定的更新执行文件操作,再激活更新执行文件后自行关闭,不影响后续更新替换动作。
然后更新执行文件通过传过来的参数来确认当前软件guid获取版本号,对比最新的版本号,然后来先进性数据比对,比对完成后,确认是否升级,如果升级就把升级软件的地址传过来,下载到本地解压缩后,替换对应的位置的文件,执行完成操作后,自行关闭,然后传参重新打开最新版的软件执行文件。

你可能感兴趣的:(c#)