예제 #1
0
        public static void RunMainApp(LocalRunInfo localRunInfo, string msg = null)
        {
            try
            {
                var cmds = localRunInfo.AppRunCmd.Split(new char[] { ' ' },
                                                        StringSplitOptions.RemoveEmptyEntries);
                var exeDir   = Path.GetFullPath(Path.GetDirectoryName(cmds[0]));
                var exeName  = Path.GetFileName(cmds[0]);
                var fileName = Path.Combine(exeDir, exeName);

                if (!File.Exists(fileName))
                {
                    OnMainAppNotExists?.Invoke(localRunInfo); return;
                }

                var args = cmds.Skip(1).Concat(new string[] { "started_by_updater" })
                           .Aggregate(string.Empty, (_args, a) => _args += " " + a);

                RunFile(fileName, args);

                OnMainAppStarted?.Invoke(localRunInfo, msg);
            }
            catch (Exception ex)
            {
                LogHelper.LogErrorToServer($"程序启动失败({msg})", ex, localRunInfo);

                OnError?.Invoke(localRunInfo, ex);
            }
        }
예제 #2
0
        private static void UpdateInternal(string msg)
        {
            LocalRunInfo  localRunInfo  = null;
            UpdateUrlInfo updateUrlInfo = null;

            try
            {
                OnStatus?.Invoke("正在读取本地配置...");
                localRunInfo = GetLocalRunInfo();

                OnStatus?.Invoke("正在验证更新地址...");
                if (string.IsNullOrEmpty(localRunInfo.UpdateUrl))
                {
                    OnNotSpecifyUpdateUrl?.Invoke(localRunInfo); return;
                }

                if ((updateUrlInfo = UpdateUrlInfo.Parse(localRunInfo.UpdateUrl)) == null)
                {
                    OnInvalidUpdateUrl?.Invoke(localRunInfo); return;
                }

                OnStatus?.Invoke("正在读取服务器...");
                var host          = updateUrlInfo.Host;
                var systemId      = updateUrlInfo.SystemId;
                var remoteRunInfo = GetRemoteRunInfo(GetRemoteInfoUrl(host, systemId));

                OnStatus?.Invoke("正在检测差异...");
                var initStart       = (localRunInfo.RunFiles.Count == 0);
                var fileDiffResults = CalcDiff(localRunInfo, remoteRunInfo).ToList();
                var filesToUpdate   = fileDiffResults.Where(f => f.Status == UpdateRunFileStatus.Update || f.Status == UpdateRunFileStatus.Delete).ToList();
                var progress        = 0;
                var total           = filesToUpdate.Count;

                if (total > 0)
                {
                    OnStatus?.Invoke("正在检测运行程序...");
                    if (IsThisAppRunning() ||
                        (!string.IsNullOrEmpty(localRunInfo.AppRunCmd) && IsMainAppRunning(localRunInfo)))
                    {
                        OnMainAppAlreadyRunning?.Invoke(localRunInfo);

                        return;
                    }
                }

                OnStatus?.Invoke("开始更新程序...");
                OnBeginUpdate?.Invoke(localRunInfo);

                var runDir            = Path.GetDirectoryName(Application.ExecutablePath);
                var thisExeName       = Path.GetFileName(Application.ExecutablePath);
                var runBat            = false;
                var runFileResults    = new DicIgnoreCase <string>();
                var failedUpdateFiles = new List <string>();
                var failedDeleteFiles = new List <string>();

                foreach (var file in filesToUpdate)
                {
                    if (Constants.BatFile.Equals(file.Path, StringComparison.OrdinalIgnoreCase))
                    {
                        runBat = true;
                    }

                    if (file.Status == UpdateRunFileStatus.Update)
                    {
                        var url        = GetRunFileUrl(host, systemId, file.Path);
                        var localPath  = Path.Combine(runDir, file.Path);
                        var updateSelf = file.Path.Equals(thisExeName, StringComparison.OrdinalIgnoreCase); // 自更新

                        OnProcessFile?.Invoke("正在安装文件:" + localPath);
                        var success = DownloadRunFile(url, localPath, possibllyInUse: updateSelf);

                        if (!success)
                        {
                            failedUpdateFiles.Add(file.Path);

                            // 对于更新失败的文件(非新增),新的配置文件应该仍包含更新前的文件标识
                            if (!string.IsNullOrEmpty(file.OldTag))
                            {
                                runFileResults.Add(file.Path, file.OldTag);
                            }
                        }
                        else
                        {
                            runFileResults.Add(file.Path, file.NewTag);
                        }
                    }
                    else if (file.Status == UpdateRunFileStatus.Delete)
                    { // 删除文件
                        var localPath = Path.Combine(runDir, file.Path);

                        OnProcessFile?.Invoke("正在删除文件:" + localPath);
                        if (!DeleteRunFile(localPath))
                        {
                            failedDeleteFiles.Add(file.Path);

                            // 对于删除失败的文件,新的配置文件应该仍包含旧的文件标识
                            runFileResults.Add(file.Path, file.OldTag);
                        }
                    }

                    OnProgress?.Invoke((++progress) * 1.0 / total);
                }

                foreach (var f in fileDiffResults.Where(f => f.Status == UpdateRunFileStatus.NotModified))
                {
                    runFileResults.Add(f.Path, f.OldTag);
                }

                localRunInfo.Ver      = remoteRunInfo.Ver;
                localRunInfo.RunFiles = runFileResults;

                OnComplete?.Invoke(localRunInfo, fileDiffResults, failedUpdateFiles, failedDeleteFiles, initStart, runBat, msg);
            }
            catch (Exception ex)
            {
                if (localRunInfo != null)
                {
                    LogHelper.LogErrorToServer($"客户端更新失败({msg})", ex, localRunInfo);
                }

                OnError?.Invoke(localRunInfo, ex);
            }
        }