private static void Main() { Logger.Trace("Запуск стартера"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var installationFolder = AppDomain.CurrentDomain.BaseDirectory; UpdatesChecker.PlaceInstalledUpdates = Path.Combine(installationFolder, ConfigurationManager.AppSettings["InstalledUpdatesFolderName"]); UpdatesChecker.PlaceTempUpdates = Path.Combine(installationFolder, ConfigurationManager.AppSettings["TempPacketUpdatesFolderName"]); UpdatesChecker.PlaceUpdates = Path.Combine(installationFolder, ConfigurationManager.AppSettings["UpdatesFolder"]); var tempUnpackUpdatesFolder = Path.Combine(installationFolder, ConfigurationManager.AppSettings["TempUnpackedUpdatesFolderName"]); var startExe = ConfigurationManager.AppSettings["StartExe"]; var checkUpdateIntervalStr = ConfigurationManager.AppSettings["WaitUpdateIntervalMs"]; int checkUpdateInterval; if (!int.TryParse(checkUpdateIntervalStr, out checkUpdateInterval)) checkUpdateInterval = 1000; ClearTempFiles(); while (!_exitFromApp) { if (IsCupRunning()) { if (!_exitFromApp) RunVersion(startExe); return; } if (UpdatesChecker.IsAvailablePacketsUpdate()) { if (!IsUppyRunning()) { OpenFormWait(); } Logger.Trace("Обнаружены обновления"); var listUpdates = UpdatesChecker.DownloadUpdates(); Logger.Trace("Обновления загружены"); foreach (var filePacketUpdate in listUpdates) { Logger.Trace("Очистка временной папки"); ClearTempUpdateDirectory(tempUnpackUpdatesFolder); Logger.Trace("Распаковка файла-пакета обновления: " + Path.GetFileName(filePacketUpdate)); var updater = new Updater.Updater(tempUnpackUpdatesFolder); Logger.Trace("Загрузка определения пакета."); updater.UnpackPacket(filePacketUpdate, tempUnpackUpdatesFolder); updater.LoadPacketDefiniton(); updater.InstallationFolder = installationFolder; if (updater.IsUpdateApplied()) { var updateApplied = false; while (!updateApplied) { if (IsUppyRunning()) { Logger.Trace("ЦУП запущен. Запрос пользователю на закрытие ЦУП"); var result = ResultAskUser.Update; if (!_exitFromApp) { var form = new AlertForUpdateForm(updater.Definition.UpdateMessage); form.ShowDialog(); result = form.Result; Logger.Trace( "ЦУП был запущен. Ответ на запрос выполнения обновления: " + result); } switch (result) { case ResultAskUser.Update: updater.ProgramRunning = true; OpenFormWait(); Logger.Trace("Завершаем процессы ЦУП"); KillUppyProcesses(); _exitFromApp = false; Logger.Trace("Выполнение действий перед обновлением"); updater.ExecActionsBefore(); Logger.Trace("Обновление файлов"); updater.UpdateFiles(); Logger.Trace("Выполнение действий после установки обновления"); updater.ExecActionsAfter(); Logger.Trace("Очистка временной папки"); ClearTempUpdateDirectory(tempUnpackUpdatesFolder); Logger.Trace("Пометка обновления как установленное"); UpdatesChecker.MarkUpdateApplied(filePacketUpdate); _exitFromApp = false; updateApplied = true; break; case ResultAskUser.Ignore: case ResultAskUser.Delay: Logger.Trace("Откладываем обновление на 1 минуту."); int countDelay = 60; while (!_exitFromApp && (countDelay-- > 0)) { Thread.Sleep(1000); } break; default: throw new ArgumentOutOfRangeException(); } } else { updater.ProgramRunning = false; Logger.Trace("Выполнение действий перед обновлением"); updater.ExecActionsBefore(); Logger.Trace("Обновление файлов"); updater.UpdateFiles(); Logger.Trace("Выполнение действий после установки обновления"); updater.ExecActionsAfter(); Logger.Trace("Пометка обновления как установленное"); UpdatesChecker.MarkUpdateApplied(filePacketUpdate); Logger.Trace("Очистка временной папки"); ClearTempUpdateDirectory(tempUnpackUpdatesFolder); updateApplied = true; } } } else { Logger.Trace("Обновление не применяется к текущей версии."); UpdatesChecker.MarkUpdateApplied(filePacketUpdate); ClearTempUpdateDirectory(tempUnpackUpdatesFolder); } } if (!_exitFromApp && !IsUppyRunning()) RunVersion(startExe); } else { if (!_exitFromApp && !IsUppyRunning()) RunVersion(startExe); } Thread.Sleep(checkUpdateInterval); // wait update } Logger.Trace("Конец работы"); }