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

Механическое обновление программ на C#

Anna | 17.06.2014 | нет комментариев

Несколько лет назад, программируя еще на Delphi, лично для себя соорудил некоторый код механического обновления, тот, что в последствии стал необходимым при разработке всякий программы, где есть обновление. В подлинный момент данный код всецело переписан на c# и я хочу с Вами им поделиться.

image

Сначала определим цели этой реализации:

 

  1. При выявлении новой версии обновление должно протекать механически;
  2. Позже обновления программа должна механически перезапускаться;
  3. Позже обновления имя программы должно остаться бывшим.

Задача состоит в том, что программа не может саму себя удалить, заменить и опять запустить. И, казалось бы, как решить данный вопрос? Тут нам поможет 2-й файл, отвечающий за переименование и перезапуск программы, так как мы не гонимся за целью беречь все коды в 1 файле.

Этапы

 

Этап 1: Проверка версии

В силу своей лени искать наилучший вариант, на сайте было выложено 2 файла:

  • myprogram.exe
  • version.xml

Да, именно XML-формат использую. Забегая вне темы скажу, что в файле version.xml у меня находится список нескольких версий файлов, но мы разглядим только одну.

Идем дальше. Конструкция файла версий выглядит дальнейшим образом:

<version>
     <myprogram>1.0.2.37</myprogram>
</version>

На форму добавлен компонент backgroundWorker (для реализации фоновой загрузки файла) со дальнейшим кодом внутри обработчика DoWork:

try
	{
		double versionRemote = Convert.ToDouble(doc.GetElementsByTagName("myprogram")[0].InnerText.Replace(".", "")),
				thisVersion = Convert.ToDouble(Application.ProductVersion.Replace(".", ""));

		if (thisVersion < versionRemote)
		{
			MessageBox.Show(this, "Найдена новая версия ("   doc.GetElementsByTagName("myprogram")[0].InnerText   ")"   Environment.NewLine  
				"Приложение будет механически обновлено и перезапущено.", Application.ProductName   " v"   Application.ProductVersion, MessageBoxButtons.OK, MessageBoxIcon.Information);

			var client = new WebClient();
			client.DownloadProgressChanged  = new DownloadProgressChangedEventHandler(download_ProgressChanged);
			client.DownloadFileCompleted  = new AsyncCompletedEventHandler(download_Completed);
			client.DownloadFileAsync(new Uri(@"http://mysite/myprogram.exe"), "temp_myprogram");
		}
	}
catch (Exception) { }

Что мы видим в коде выше:
Так как версия у нас может иметь огромное число, используем тип переменной double. Для сопоставления версий мы удаляем все точки и конвертируем версию из строки в число (в примере получится число 10237).
Верно также мы поступим и с версией самого файла, присвоенной переменной thisVersion.

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

Для отслеживания ранга загрузки на форму был добавлен компонент progressBar, и в код добавлена функция:

private void download_ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
	try
		{
			progressBar1.Value = e.ProgressPercentage;
		}
	catch (Exception) { }
}

Функция отображает в прогрессбаре ранг загрузки файла. Это необходимо лишь для наглядного отображения.
Выходит, мы загрузили наш файл и что делать дальше? А дальше вступает в бой функцияdownload_Completed, содержащая код:

private void download_Completed(object sender, AsyncCompletedEventArgs e)
{
	try
	{
		Process.Start("updater.exe", "temp_myprogram myprogram.exe");
		Process.GetCurrentProcess().Kill();
	}
	catch (Exception) { }
}

Тут все легко: запускаем файл updater.exe с параметрами, о которых расскажу в дальнейшем этапе.

 

 

Источник: programmingmaster.ru

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