Обновить программу нажатием на кнопку - C#
Формулировка задачи:
Здравствуйте!
Помогите сделать на Form1 кнопку этой функции
Форма Updater
Новая версия загружается, а вот функцию не выполняется, должна закрыться, удалиться, потом открыться уже новая версия. Но по крайне мере так делается если функция вызывается из Program
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Updater up = new Updater(); if (up.download()) Application.Run(up); if (up.skipped()) Application.Run(new Form1()); }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Windows.Forms; namespace Online { public partial class Updater : Form { public static string my_version = "1.0.0.0"; // версия текущей программы public static string url_version = "http://mysite.ru/client/version.txt"; // версия программы private string url_program = "http://mysite.ru/client/myprogram.exe"; // новая версия программы private string url_foruser = "https://mysite.ru/index.html"; // ссылка, если обновление не удалось private string my_filename; private string up_filename; // Признак, что началось скачивание обновления, требуется ожидание завершения процесса private bool is_download; public bool download() { return is_download; } // Признак, что обновление не требуется или закончено, можно запускать программу. private bool is_skipped; public bool skipped() { return is_skipped; } public Updater() { my_filename = get_exec_filename(); // имя запущенной программы up_filename = "new." + my_filename; // имя временного файла для новой версии string[] keys = Environment.GetCommandLineArgs(); if (keys.Length < 3) do_check_update(); else { if (keys[1].ToLower() == "/u") do_copy_downloaded_program(keys[2]); if (keys[1].ToLower() == "/d") do_delete_old_program(keys[2]); } } private void do_check_update() { string new_version = get_server_version(); // Получаем номер последней версии if (my_version == new_version) // Если обновление не нужно { is_download = false; is_skipped = true; // Пропускаем модуль обновления } else do_download_update(); // Запускаем скачивание новой версии } private void do_download_update() { InitializeComponent(); label_status.Text = "Обновление ForBloody..."; download_file(); is_download = true; // Будем ждать завершения процесса is_skipped = false; // Основную форму не нужно запускать } private void download_file() { try { WebClient webClient = new WebClient(); webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); webClient.DownloadFileAsync(new Uri(url_program), up_filename); } catch (Exception ex) { error(ex.Message + " " + up_filename); } } private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) { progress_download.Value = e.ProgressPercentage; 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")); } private void Completed(object sender, AsyncCompletedEventArgs e) { // Запускаем второй этап обновления run_program(up_filename, "/u "" + my_filename + """); this.Close(); } private void run_program(string filename, string keys) { try { System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.WorkingDirectory = Application.StartupPath; proc.StartInfo.FileName = filename; proc.StartInfo.Arguments = keys; // Аргументы командной строки proc.Start(); // Запускаем! } catch (Exception ex) { error(ex.Message + " " + filename); } } void do_copy_downloaded_program(string filename) { try_to_delete_file(filename); try { File.Copy(my_filename, filename); // Запускаем последний этап обновления run_program(filename, "/d "" + my_filename + """); is_download = false; is_skipped = false; } catch (Exception ex) { error(ex.Message + " " + filename); } } void do_delete_old_program(string filename) { try_to_delete_file(filename); is_download = false; is_skipped = true; } private void try_to_delete_file(string filename) { int loop = 10; while (--loop > 0 && File.Exists(filename)) try { File.Delete(filename); } catch { Thread.Sleep(200); } } public static string get_server_version() { try { WebClient webClient = new WebClient(); return webClient.DownloadString(url_version).Trim(); } catch { // Если номер версии не можем получить, // то программу даже и не надо пытаться. return my_version; } } private void error(string message) { if (DialogResult.Yes == MessageBox.Show( "Ошибка обновления: что то пошло не так!" + "\nСкачать обновленную версию с сайта вручную?", "Ошибка", MessageBoxButtons.YesNo)) OpenLink(url_foruser); is_download = false; is_skipped = false; // в случае ошибки ничего не запускаем } private void OpenLink(string sUrl) { try { System.Diagnostics.Process.Start(sUrl); } catch (Exception exc1) { if (exc1.GetType().ToString() != "System.ComponentModel.Win32Exception") try { System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("IExplore.exe", sUrl); System.Diagnostics.Process.Start(startInfo); startInfo = null; } catch (Exception) { MessageBox.Show("Запустить обозреватель, к сожалению, не удалось.\n\nОткройте страницу ручным способом:\n" + sUrl, "ОШИБКА"); } } } private string get_exec_filename() { string fullname = Application.ExecutablePath; string[] split = { "" }; string[] parts = fullname.Split(split, StringSplitOptions.None); if (parts.Length > 0) return parts[parts.Length - 1]; return ""; } } }
Вроде так:
private void button1_Click(object sender, EventArgs e) { Updater up = new Updater(); up.download(); }
Решение задачи: «Обновить программу нажатием на кнопку»
textual
Листинг программы
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Updater up = new Updater(); if (up.download()) Application.Run(up); if (up.skipped()) Application.Run(new Form1()); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д