Обновить программу нажатием на кнопку - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Помогите сделать на Form1 кнопку этой функции
Листинг программы
  1. static void Main()
  2. {
  3. Application.EnableVisualStyles();
  4. Application.SetCompatibleTextRenderingDefault(false);
  5. Updater up = new Updater();
  6. if (up.download())
  7. Application.Run(up);
  8. if (up.skipped())
  9. Application.Run(new Form1());
  10. }
Форма Updater
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Net;
  9. using System.Text;
  10. using System.Threading;
  11. using System.Windows.Forms;
  12. namespace Online
  13. {
  14. public partial class Updater : Form
  15. {
  16. public static string my_version = "1.0.0.0"; // версия текущей программы
  17. public static string url_version = "http://mysite.ru/client/version.txt"; // версия программы
  18. private string url_program = "http://mysite.ru/client/myprogram.exe"; // новая версия программы
  19. private string url_foruser = "https://mysite.ru/index.html"; // ссылка, если обновление не удалось
  20. private string my_filename;
  21. private string up_filename;
  22. // Признак, что началось скачивание обновления, требуется ожидание завершения процесса
  23. private bool is_download; public bool download() { return is_download; }
  24. // Признак, что обновление не требуется или закончено, можно запускать программу.
  25. private bool is_skipped; public bool skipped() { return is_skipped; }
  26. public Updater()
  27. {
  28. my_filename = get_exec_filename(); // имя запущенной программы
  29. up_filename = "new." + my_filename; // имя временного файла для новой версии
  30. string[] keys = Environment.GetCommandLineArgs();
  31. if (keys.Length < 3)
  32. do_check_update();
  33. else
  34. {
  35. if (keys[1].ToLower() == "/u")
  36. do_copy_downloaded_program(keys[2]);
  37. if (keys[1].ToLower() == "/d")
  38. do_delete_old_program(keys[2]);
  39. }
  40. }
  41. private void do_check_update()
  42. {
  43. string new_version = get_server_version(); // Получаем номер последней версии
  44. if (my_version == new_version) // Если обновление не нужно
  45. {
  46. is_download = false;
  47. is_skipped = true; // Пропускаем модуль обновления
  48. }
  49. else
  50. do_download_update(); // Запускаем скачивание новой версии
  51. }
  52. private void do_download_update()
  53. {
  54. InitializeComponent();
  55. label_status.Text = "Обновление ForBloody...";
  56. download_file();
  57. is_download = true; // Будем ждать завершения процесса
  58. is_skipped = false; // Основную форму не нужно запускать
  59. }
  60. private void download_file()
  61. {
  62. try
  63. {
  64. WebClient webClient = new WebClient();
  65. webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
  66. webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
  67. webClient.DownloadFileAsync(new Uri(url_program), up_filename);
  68. }
  69. catch (Exception ex)
  70. {
  71. error(ex.Message + " " + up_filename);
  72. }
  73. }
  74. private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
  75. {
  76. progress_download.Value = e.ProgressPercentage;
  77. label1.Text = string.Format("Загрузка обновления " + progress_download.Value + "% " + "({0} KB's / {1} KB's)...", (e.BytesReceived / 1024d / 1024d).ToString("0.000"), (e.TotalBytesToReceive / 1024d / 1024d).ToString("0.000"));
  78. }
  79. private void Completed(object sender, AsyncCompletedEventArgs e)
  80. {
  81. // Запускаем второй этап обновления
  82. run_program(up_filename, "/u "" + my_filename + """);
  83. this.Close();
  84. }
  85. private void run_program(string filename, string keys)
  86. {
  87. try
  88. {
  89. System.Diagnostics.Process proc = new System.Diagnostics.Process();
  90. proc.StartInfo.WorkingDirectory = Application.StartupPath;
  91. proc.StartInfo.FileName = filename;
  92. proc.StartInfo.Arguments = keys; // Аргументы командной строки
  93. proc.Start(); // Запускаем!
  94. }
  95. catch (Exception ex)
  96. {
  97. error(ex.Message + " " + filename);
  98. }
  99. }
  100.  
  101. void do_copy_downloaded_program(string filename)
  102. {
  103. try_to_delete_file(filename);
  104. try
  105. {
  106. File.Copy(my_filename, filename);
  107. // Запускаем последний этап обновления
  108. run_program(filename, "/d "" + my_filename + """);
  109. is_download = false;
  110. is_skipped = false;
  111. }
  112. catch (Exception ex)
  113. {
  114. error(ex.Message + " " + filename);
  115. }
  116. }
  117. void do_delete_old_program(string filename)
  118. {
  119. try_to_delete_file(filename);
  120. is_download = false;
  121. is_skipped = true;
  122. }
  123. private void try_to_delete_file(string filename)
  124. {
  125. int loop = 10;
  126. while (--loop > 0 && File.Exists(filename))
  127. try
  128. {
  129. File.Delete(filename);
  130. }
  131. catch
  132. {
  133. Thread.Sleep(200);
  134. }
  135. }
  136. public static string get_server_version()
  137. {
  138. try
  139. {
  140. WebClient webClient = new WebClient();
  141. return webClient.DownloadString(url_version).Trim();
  142. }
  143. catch
  144. {
  145. // Если номер версии не можем получить,
  146. // то программу даже и не надо пытаться.
  147. return my_version;
  148. }
  149. }
  150. private void error(string message)
  151. {
  152. if (DialogResult.Yes == MessageBox.Show(
  153. "Ошибка обновления: что то пошло не так!" +
  154. "\nСкачать обновленную версию с сайта вручную?",
  155. "Ошибка", MessageBoxButtons.YesNo))
  156. OpenLink(url_foruser);
  157. is_download = false;
  158. is_skipped = false; // в случае ошибки ничего не запускаем
  159. }
  160. private void OpenLink(string sUrl)
  161. {
  162. try
  163. {
  164. System.Diagnostics.Process.Start(sUrl);
  165. }
  166. catch (Exception exc1)
  167. {
  168. if (exc1.GetType().ToString() != "System.ComponentModel.Win32Exception")
  169. try
  170. {
  171. System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("IExplore.exe", sUrl);
  172. System.Diagnostics.Process.Start(startInfo);
  173. startInfo = null;
  174. }
  175. catch (Exception)
  176. {
  177. MessageBox.Show("Запустить обозреватель, к сожалению, не удалось.\n\nОткройте страницу ручным способом:\n" + sUrl, "ОШИБКА");
  178. }
  179. }
  180. }
  181. private string get_exec_filename()
  182. {
  183. string fullname = Application.ExecutablePath;
  184. string[] split = { "" };
  185. string[] parts = fullname.Split(split, StringSplitOptions.None);
  186. if (parts.Length > 0)
  187. return parts[parts.Length - 1];
  188. return "";
  189. }
  190. }
  191. }
Вроде так:
Листинг программы
  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. Updater up = new Updater();
  4. up.download();
  5. }
Новая версия загружается, а вот функцию не выполняется, должна закрыться, удалиться, потом открыться уже новая версия. Но по крайне мере так делается если функция вызывается из Program

Решение задачи: «Обновить программу нажатием на кнопку»

textual
Листинг программы
  1.         static void Main()
  2.         {
  3.             Application.EnableVisualStyles();
  4.             Application.SetCompatibleTextRenderingDefault(false);
  5.             Updater up = new Updater();
  6.             if (up.download())
  7.                 Application.Run(up);
  8.  
  9.             if (up.skipped())
  10.                 Application.Run(new Form1());
  11.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы