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

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

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

Здравствуйте! Помогите сделать на Form1 кнопку этой функции
        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());
        }
Форма Updater
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();
        }
Новая версия загружается, а вот функцию не выполняется, должна закрыться, удалиться, потом открыться уже новая версия. Но по крайне мере так делается если функция вызывается из Program

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

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());
        }

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


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

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

12   голосов , оценка 4 из 5
Похожие ответы