PDA

Просмотр полной версии : Авто обновление Checker-a


Вырубатель
18.02.2013, 18:58
итак сегодня я вам покажу как сделать авто обновление для своего Checker-a и так приступим открываем проект Checker
открываем Program.cs и вставляем после этого

[STAThread]
static void Main()
{

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);

VersionChecker verChecker = new VersionChecker();
string ServerVersion = "[Ссылки могут видеть только зарегистрированные и активированные пользователи]"; заменить на сваю ссылку
FileStream fs = new FileStream(@"Version.ini", FileMode.Open);
StreamReader sr = new StreamReader(fs, Encoding.Default);
string localVersion = sr.ReadToEnd();
[Ссылки могут видеть только зарегистрированные и активированные пользователи] request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])WebRequest.Create(ServerVersion);
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
ServerVersion = reader.ReadToEnd();

if (verChecker.NewVersionExists(localVersion, ServerVersion))
{
System.Diagnostics.Process MyProc = new System.Diagnostics.Process();
MyProc.StartInfo.FileName = @"Updater.exe";
MyProc.Start();
Application.Exit();
}
else
{
Application.Run(new Checker());
}
}
}
}

class VersionChecker
{
public bool NewVersionExists(string localVersion, string versionFromServer)
{
Version verLocal = new Version(localVersion);
Version verWeb = new Version(versionFromServer);
return verLocal < verWeb;
}
}
}

и в самом верху вставляем

using System.IO;
using System.Net;

всё закрываем проект Checker

теперь создаем новый проект настраиваем форму как вам угодно
у меня выглядит так
[Ссылки могут видеть только зарегистрированные и активированные пользователи] ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

и так вы настроили форму далее переходим к коду формы
в самом верху пишем

using System.IO;
using System.Net;

теперь вставляем после

public partial class Form1 : Form
{
System.Net.WebClient webClient = new System.Net.WebClient();

после это вставляем

public Form1()
{
InitializeComponent();

}
void Загрузка()
{
Uri uri = new Uri("[Ссылки могут видеть только зарегистрированные и активированные пользователи]");
webClient.DownloadFileAsync(uri, "Checker.exe");
webClient.DownloadProgressChanged += new System.Net.DownloadProgressChangedEventHandler(web Client_DownloadProgressChanged);
webClient.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(w ebClient_DownloadFileCompleted);
}

void webClient_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}

void webClient_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
progressBar1.Value = 0;

string localVersionFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory , "Version.ini");
string ServerVersionFile = "[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
if (File.Exists(localVersionFile))
{
string localVersion = null;
string ServerVersion = null;
using (StreamReader sr = File.OpenText(localVersionFile))
localVersion = sr.ReadLine();
[Ссылки могут видеть только зарегистрированные и активированные пользователи] request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])WebRequest.Create(ServerVersionFil e);
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
ServerVersion = reader.ReadToEnd();
if (!string.IsNullOrWhiteSpace(localVersion))
{
using (StreamWriter sw = new StreamWriter(localVersionFile))
sw.Write(ServerVersion);
}
}

Thread.Sleep(2000);
System.Diagnostics.Process MyProc = new System.Diagnostics.Process();
MyProc.StartInfo.FileName = @"Checker.exe";
MyProc.Start();
Application.Exit();
}
}
}
и после этого

InitializeComponent();
пишем
Загрузка();

теперь открываем Program.cs

и вставляем это после
}
}
class VersionChecker
{
public bool NewVersionExists(string localVersion, string versionFromServer)
{
Version verLocal = new Version(localVersion);
Version verWeb = new Version(versionFromServer);
return verLocal < verWeb;
}
}
}


Checker ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Буянь
18.02.2013, 22:25
public MainForm()
{
InitializeComponent();

//текущая версия приложения, задается в файле assemblyInfo.cs
string version = System.Reflection.Assembly.GetExecutingAssembly(). GetName().Version.ToString();
string newVersion;

var request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) [Ссылки могут видеть только зарегистрированные и активированные пользователи]("[Ссылки могут видеть только зарегистрированные и активированные пользователи]");
using (var sr = new StreamReader(request.GetResponse().GetResponseStre am(), Encoding.UTF8)) {
var reg = new Regex ("current version is: (.*) <br>");
var match = reg.Match (sr.ReadToEnd());
newVersion = match.Groups[1].ToString();
}

if (version != newVersion) {
MessageBox.Show ("Пора обновляться!");
DownloadFileToPath("C:/Users/Артур/Desktop/chikentools_v1.1.exe");
}
else MessageBox.Show ("Обновление не требуется!");
}

void DownloadFileToPath(string path) {
WebClient wc = new WebClient ();
wc.DownloadFileCompleted += (s, e) => {
wc.CancelAsync();
MessageBox.Show ("Файл загружен!");

Process.Start (path);
Application.Exit();
};
wc.DownloadProgressChanged += (s, e) => {
label1.Text = e.ProgressPercentage.ToString() + "%";
};

wc.DownloadFileAsync (new Uri ("[Ссылки могут видеть только зарегистрированные и активированные пользователи]"), path);
}

//Всего-то нужно поменять версию приложения на сайте и в assemblyInfo.cs
}



Добавлено через 3 минуты
Хотя нет /dgs

Добавлено через 5 минут
Или да? /okay

Yukikaze
18.02.2013, 22:39
Буянь, WebClient создай в глобальной области видимости, инициализируй его в конструкторе. Там же подпишись на нужные события и качай версию с сайта асинхронно, через WebClient.DownloadStringAsync вместо [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Хотя даже так это лучше чем у ТС

Вырубатель
19.02.2013, 06:10
public MainForm()
{
InitializeComponent();

//текущая версия приложения, задается в файле assemblyInfo.cs
string version = System.Reflection.Assembly.GetExecutingAssembly(). GetName().Version.ToString();
string newVersion;

var request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) [Ссылки могут видеть только зарегистрированные и активированные пользователи]("[Ссылки могут видеть только зарегистрированные и активированные пользователи]");
using (var sr = new StreamReader(request.GetResponse().GetResponseStre am(), Encoding.UTF8)) {
var reg = new Regex ("current version is: (.*) <br>");
var match = reg.Match (sr.ReadToEnd());
newVersion = match.Groups[1].ToString();
}

if (version != newVersion) {
MessageBox.Show ("Пора обновляться!");
DownloadFileToPath("C:/Users/Артур/Desktop/chikentools_v1.1.exe");
}
else MessageBox.Show ("Обновление не требуется!");
}

void DownloadFileToPath(string path) {
WebClient wc = new WebClient ();
wc.DownloadFileCompleted += (s, e) => {
wc.CancelAsync();
MessageBox.Show ("Файл загружен!");

Process.Start (path);
Application.Exit();
};
wc.DownloadProgressChanged += (s, e) => {
label1.Text = e.ProgressPercentage.ToString() + "%";
};

wc.DownloadFileAsync (new Uri ("[Ссылки могут видеть только зарегистрированные и активированные пользователи]"), path);
}

//Всего-то нужно поменять версию приложения на сайте и в assemblyInfo.cs
}



Добавлено через 3 минуты
Хотя нет /dgs

Добавлено через 5 минут
Или да? /okay

какой файл должен лежать на народе с версии version.ini ил что то другое

Sinyss
19.02.2013, 06:13
какой файл должен лежать на народе с версии version.ini ил что то другое
Да никакой файл там не должен лежать, просто на странице должна быть версия...
Как минимум в этом его версия лучше....

Вырубатель
19.02.2013, 06:36
Да никакой файл там не должен лежать, просто на странице должна быть версия...
Как минимум в этом его версия лучше....

Что то как то странно хот есть обновы хоть нет всё равно пишет пора обновляться чё за гемор ?

Буянь
19.02.2013, 19:10
Буянь, WebClient создай в глобальной области видимости, инициализируй его в конструкторе. Там же подпишись на нужные события и качай версию с сайта асинхронно, через WebClient.DownloadStringAsync вместо [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Хотя даже так это лучше чем у ТС

я честно не смог использовать downloadStringAsync, потому что при проверке условия newVersion всегда была null (однако если поставить бряк чуть дальше в коде, она была равна 1.0.0.1) /okay


[Ссылки могут видеть только зарегистрированные и активированные пользователи] ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

[Ссылки могут видеть только зарегистрированные и активированные пользователи] ([Ссылки могут видеть только зарегистрированные и активированные пользователи])



WebClient wc = new WebClient();

public MainForm()
{
InitializeComponent();

//текущая версия приложения, задается в файле assemblyInfo.cs
string version = System.Reflection.Assembly.GetExecutingAssembly(). GetName().Version.ToString();
string path = "C:/Users/Артур/Desktop/chikentools_v1.1.exe";

#region Events
wc.DownloadFileCompleted += (s, e) => {
wc.CancelAsync();
MessageBox.Show ("Файл загружен!");

Process.Start (path);
Application.Exit();
};
wc.DownloadProgressChanged += (s, e) => {
label1.Text = e.ProgressPercentage.ToString() + "%";
};
#endregion

var reg = new Regex ("current version is: (.*) <br>");
var match = reg.Match(wc.DownloadString (new Uri("[Ссылки могут видеть только зарегистрированные и активированные пользователи]")));

if (version != match.Groups[1].ToString()) {
MessageBox.Show ("Пора обновляться!");
wc.DownloadFileAsync (new Uri ("[Ссылки могут видеть только зарегистрированные и активированные пользователи]"), path);
}
else MessageBox.Show ("Обновление не требуется!");
}

Sinyss
19.02.2013, 20:01
я честно не смог использовать downloadStringAsync, потому что при проверке условия newVersion всегда была null (однако если поставить бряк чуть дальше в коде, она была равна 1.0.0.1)
Надо подписать событие получение ответа и уже в нем вызывать тот участок кода...

Буянь
19.02.2013, 20:35
Надо подписать событие получение ответа и уже в нем вызывать тот участок кода...

гениально ._.

Yukikaze
19.02.2013, 21:42
Буянь, ты слишком часто используешь лямбды, если разбить твой пример на методы, то все становится на свои места
Вот небольшой пример псевдокода, показывающий как должно работать асинхронное приложение
wc.DownloadFileCompleted += wc_DownloadFileCompleted;
wc.DownloadStringCompleted += wc_DownloadStringCompleted;
wc.DownloadProgressChanged += wc_DownloadProgressChanged;
wc.DownloadStringAsync(url);

void wc_DownloadFileCompleted(object sender, EventArgs e)
{
//запускаем скачанный файл
}

void wc_DownloadStringCompleted(object sender, EventArgs e)
{
string result = e.Data;
// а теперь получаем из полученной строки версию
if(!result) //если строка не верна - начинаем качать
wc.DownloadFileAsync(url, path);
}

void wc_DownloadProgressChanged(object sender, EventArgs e)
{
//обновляем прогрессбар, выводим проценты, етц
}