Обновить программу нажатием на кнопку - 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());
}