Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Механическое обновление программ на C#. Часть 2

Anna | 17.06.2014 | нет комментариев
Несколько дней назад мною была написана статья о реализации механического обновления программного обеспечения на языке C#.

Приняв во внимание конструктивную критику комментаторов, было принято решение усовершенствовать тот код, добавив несколько новых вероятностей, включая совершенствование «ветхих»:

  • Механическая проверка, скачивание и установка обновлений;
  • Предоставление пользователю вероятности выбора момента обновления (новое);
  • Усовершенствован механизм проверки версии файла;
  • Проверка целостности файла обновления (новое)

чтобы не перепечатывать текст прошлой статьи, в этой акцентирую внимание лишь на переработанных частях кода.

Основные примечания

Комментаторами предыдущей статьи были выявлены следующие недостатки кода (указываю только те, на которые опирался):

  • Только отменнее вначале скачать новейший файл, Дабы не получилась обстановка, когда посередине загрузки, по каким-либо причинам, приложение завершается и пользователь остаётся с .bak файлов и неполным .exe, т.е. без рабочего приложения. (DarkByte);
  • Только не увидел проверки на контрольную сумму. (naum);
  • Показывать пользователю модальное (скорее каждого) информационное окно с исключительной кнопкой «Ok», не оставляя выбора — не самая отличная практика. Необходимо делать всё тихо и неприметно, либо ненавязчиво предложить обновиться с вероятностью сделать это как-нибудь потом, когда пользователю будет комфортнее. (iroln);
  • Сопоставление версий у вас неправильное. Задачи будут, скажем, при обновлении с 9.12.2 до 10.0.0. (eyeless_watcher)
  • А что мешает сопоставлять непринужденно типы Version? (teleavtomatika).

Были, безусловно, и другие комментарии аналогичные с этими, но не стал их все приводить и предлагаю приступить к рассмотрению задач.

Внесение поправок

Так как при скачивании файла может появиться какая-либо оплошность, в следствие чего файл будет поврежден, в код были внесены следующие поправки:

public void checkUpdates(){
	try
	{
		if (File.Exists("launcher.update") && new Version(FileVersionInfo.GetVersionInfo("launcher.update").FileVersion) > new Version(Application.ProductVersion))
		{
			Process.Start("updater.exe", "launcher.update ""   Process.GetCurrentProcess().ProcessName   """);
			Process.GetCurrentProcess().CloseMainWindow();
		}
		else
		{
			if (File.Exists("launcher.update")) { File.Delete("launcher.update"); }
			Download();
		}
	}
	catch (Exception)
	{
		if (File.Exists("launcher.update")) { File.Delete("launcher.update"); }
		Download();
	}
}

Сначала мы проверяем существует ли файл обновлений launcher.update, а также проверяем версию файла, так как нам не значимо его растяжение. В случае, если файл поврежден, сработает обработчик исключенийtry catch, исполнив код по удалению поврежденного файла с дальнейшим запуском функции проверки и скачивания (если обнаружены) обновлений на сайте.
Если же файл окажется целым и его версия будет выше нынешней, то запускается добавочная утилитаupdater.exe для проведения операций по замене основного файла программы. Расписывать подробнее не стану, так как это теснее было раннее.

Таким образом, мы удостоверимся в целостности файла обновления.

private void Download()
{
	try
	{
		XmlDocument doc = new XmlDocument();
		doc.Load(@"http://mysite/version.xml");

		remoteVersion = new Version(doc.GetElementsByTagName("version")[0].InnerText);
		localVersion = new Version(Application.ProductVersion);

		if (localVersion < remoteVersion)
		{
			if (File.Exists("launcher.update")) { File.Delete("launcher.update"); }

			WebClient client = new WebClient();
			client.DownloadProgressChanged  = new DownloadProgressChangedEventHandler(ProgressChanged);
			client.DownloadFileCompleted  = new AsyncCompletedEventHandler(Completed);
			client.DownloadFileAsync(new Uri(@"http://mysite/launcher.exe"), "launcher.update");
		}
	}
	catch (Exception) { }
}

Дальше претерпела метаморфозы функция процесса проверки версии файла, ключевым моментом которого является реализация сопоставления версий файла при помощи встроенных средств System.Version, в следствие чего была устранена задача правильной сверки версий, скажем, «9.12.2» и «10.0.0».
В случае, когда найдена больше новая версия, действия происходят по дальнейшему сценарию: программа механически в фоновом режиме скачивает файл обновления, после этого выдает пользователю сообщение о доступности этого обновления и предлагает на выбор 2 варианта становления событий:

  1. Соглашаясь на обновление, программа мгновенно перезапускается, произведя все нужные действия;
  2. Отказываясь от обновления программа хранит файл рядом с исполняемым файлом, куда и было скачано. В данном варианте процесс обновления произойдет при дальнейшем запуске программы не выводя никаких уведомлений.

Завершение

Переписанный код получился больше идеальным по сопоставлении с предыдущим вариантом, а также исключает вероятность использования обновления на «битом» файле, а также неимение реализации функции проверки контрольной суммы скачанного файла с версией на сервере.

И отдельное спасибо хотелось бы сказать дальнейшим людям за их конструктивную критику: DarkBytenaum,irolneyeless_watcherteleavtomatikawire.

С уважением, Андрей Helldar!

P.S.: люди добродушные из числа минусующих — будьте добросердечны в комментариях пишите отчего Вы так решили. Увлекательно же знать где я не прав.

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB