C # рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрджреНрдпрддрди

рдХрдИ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдбреЗрд▓реНрдлреА рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдкрдбреЗрдЯ рдХреЛрдб рдмрдирд╛рдпрд╛ рдерд╛, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реЛ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рдЕрдкрдбреЗрдЯ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрд╣ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ c # рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЫрд╡рд┐

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

  1. рдЬрдм рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдкрдбреЗрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП;
  2. рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП;
  3. рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдирд╛рдо рд╕рдорд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реНрд╡рдпрдВ рдХреЛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП? рдпрд╣рд╛рдВ рд╣рдореЗрдВ рджреВрд╕рд░реА рдлрд╝рд╛рдЗрд▓ рджреНрд╡рд╛рд░рд╛ рдорджрдж рдХреА рдЬрд╛рдПрдЧреА, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдФрд░ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо 1 рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдХреЛрдб рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рдХреНрд╖реНрдп рдХрд╛ рдкреАрдЫрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред


рдЪрд░рдгреЛрдВ


рд╕реНрдЯреЗрдЬ 1: рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдБрдЪ

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЖрд▓рд╕реНрдп рдХреЗ рдХрд╛рд░рдг, 2 рдлрд╛рдЗрд▓реЗрдВ рд╕рд╛рдЗрдЯ рдкрд░ рдкреЛрд╕реНрдЯ рдХреА рдЧрдИрдВ:

рд╣рд╛рдВ, рдореИрдВ XML рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рд╡рд┐рд╖рдп рдХреЗ рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ version.xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдХрдИ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рд╕реВрдЪреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЖрдЧреЗ рдмрдврд╝реЛред рд╕рдВрд╕реНрдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

<version> <myprogram>1.0.2.37</myprogram> </version> 

DoWork рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде BackgroundWorker рдШрдЯрдХ рдХреЛ рдлреЙрд░реНрдо (рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:
 try { double versionRemote = Convert.ToDouble(doc.GetElementsByTagName("myprogram")[0].InnerText.Replace(".", "")), thisVersion = Convert.ToDouble(Application.ProductVersion.Replace(".", "")); if (thisVersion < versionRemote) { MessageBox.Show(this, "   (" + doc.GetElementsByTagName("myprogram")[0].InnerText + ")" + Environment.NewLine + "     .", Application.ProductName + " v" + Application.ProductVersion, MessageBoxButtons.OK, MessageBoxIcon.Information); var client = new WebClient(); client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(download_ProgressChanged); client.DownloadFileCompleted += new AsyncCompletedEventHandler(download_Completed); client.DownloadFileAsync(new Uri(@"http://mysite/myprogram.exe"), "temp_myprogram"); } } catch (Exception) { } 

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ рд╣рдо рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ:
рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд╣рдо рджреЛрд╣рд░реЗ рдЪрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирдВрдмрд░ 10237 рдорд┐рд▓рддрд╛ рд╣реИ)ред
рд╣рдо рдлрд╛рдЗрд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╣реА рдЗрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВрдЧреЗред

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рджреВрд░рд╕реНрде рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рдорд╛рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рджреВрд░рд╕реНрде рдПрдХ рд╕реЗ рдЫреЛрдЯрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рдПрдХ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдФрд░ рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо temp_myprogram рд╣реИ ред

рдбрд╛рдЙрдирд▓реЛрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рдЧрддрд┐рдмрд╛рд░ рдШрдЯрдХ рдХреЛ рдлреЙрд░реНрдо рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛:

 private void download_ProgressChanged(object sender, DownloadProgressChangedEventArgs e) { try { progressBar1.Value = e.ProgressPercentage; } catch (Exception) { } } 

рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдЧрддрд┐ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рд╕реНрдерд┐рддрд┐ рдмрд╛рд░ред рдпрд╣ рдХреЗрд╡рд▓ рджреГрд╢реНрдп рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╣реИред
рддреЛ, рд╣рдордиреЗ рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХреА рдФрд░ рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдФрд░ рдлрд┐рд░ download_Completed function рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ:

 private void download_Completed(object sender, AsyncCompletedEventArgs e) { try { Process.Start("updater.exe", "temp_myprogram myprogram.exe"); Process.GetCurrentProcess().Kill(); } catch (Exception) { } } 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде updater.exe рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛ред
рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЬрдмрд░рди рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИред

рд╕реНрдЯреЗрдЬ 2: рдЕрдкрдбреЗрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ

рдЗрд╕рдХреЗ рдмрд╛рдж, updater.exe рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╢рдЯрдбрд╛рдЙрди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣реА рд╣реИ рдФрд░ рдЕрдкрдбреЗрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд░рд╣реА рд╣реИред
рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдкрд╛рда рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реАрдзреЗ рдХреЛрдб рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.IO; using System.Threading; namespace Updater { class Program { static void Main(string[] args) { try { string process = args[1].Replace(".exe", ""); Console.WriteLine("Terminate process!"); while (Process.GetProcessesByName(process).Length > 0) { Process[] myProcesses2 = Process.GetProcessesByName(process); for (int i = 1; i < myProcesses2.Length; i++) { myProcesses2[i].Kill(); } Thread.Sleep(300); } if(File.Exits(args[1])){ File.Delete(args[1]); } File.Move(args[1], args[0]); Console.WriteLine("Starting "+args[1]); Process.Start(args[1]); } catch (Exception) { } } } } 

рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рд░реВрдкреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░реНрдп рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИрдВред
рд╣рдо рдПрдХ рд▓реВрдк рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ 2 рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓ рд░рд╣реА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ рдХрд┐рд▓ () рдХрдорд╛рдВрдб рдХреЛ рдЬрдмрд░рди рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо 300 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рддрдХ рд▓реВрдк рдЪрд▓реЗрдЧрд╛ред

рдЗрд╕рдХреЗ рдмрд╛рдж рдкреБрд░рд╛рдиреА рдлрд╛рдЗрд▓ рдХреЛ рдбрд┐рд▓реАрдЯ рдХрд░реЗрдВред рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ (рдмрд▓реНрдХрд┐ рдорд╕реНрддрд┐рд╖реНрдХ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ) рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж, 1 рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо 2 рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рдкрд░ рд░рдЦреЗрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, temp_myprogram рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ myprogram.exe рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ , рдЬрд┐рд╕рдХреЗ рдмрд╛рдж myprogram.exe рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓реЙрдиреНрдЪ рдХреА рдЬрд╛рдПрдЧреА рдФрд░ рдЗрд╕ updater рдХреА рд╡рд┐рдВрдбреЛ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреАред
рдореИрдВ рдпрд╣ рднреА рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдЕрдкрдбреЗрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

рдФрд░ рдЕрдЧрд▓реЗ рдХрджрдо рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВ:

рдЪрд░рдг 3: рдкреВрд░реНрдгрддрд╛


рдФрд░ рдЕрдм рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрджреНрдпрддрди рд╕рдВрд╕реНрдХрд░рдг рдлрд╝рд╛рдЗрд▓ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╢реБрд░реВ рд╣реБрдИ, рдФрд░ "рдЕрдкрдбреЗрдЯрд░" рд╡рд┐рдВрдбреЛ рдмрдВрдж рд╣реЛ рдЧрдИред рд▓рд╛рдн!

рдЖрд╡реЗрджрди рдХреЗ рдореВрд▓ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рд╕рд╛рде рдЯреИрдВрдХ рдХреА рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛ рдЯреИрдВрдХ рдореЛрдбрдХ рдХреЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ "рдпрд╣ рдХрд╛рд░реНрдпрд╢реАрд▓рддрд╛ рдирд╣реАрдВ рд╣реИ" рдореИрдВ рддреБрд░рдВрдд рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд▓рд╛рдВрдЪрд░ рдмреАрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╣реИ рдФрд░ рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рднреА updater.exe рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдореЗрд░реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ рдкрд░ рдЗрд╕рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг 1.0.0.2 рд╣реИ ред

рдФрд░ рдЗрд╕ рд▓рд╛рдЗрди рдкрд░, рд╣рдорд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдкрдбреЗрдЯ рдХреЛрдб рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдпреБрдкреАрдбреАред рдореИрдВрдиреЗ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рд╡рд╛рд▓рд╛ рдПрдХ рджреВрд╕рд░рд╛ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рд╣реИред
рд╣рдо рд╡рд┐рдирдореНрд░рддрд╛рдкреВрд░реНрд╡рдХ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА "рдХреБрдЯрд┐рд▓ рд╣рд╛рде", "рдХреБрдЯрд┐рд▓ рдХреЛрдб" рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рдХрдо рд╕реЗ рдХрдо рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред рдЖрдкрдХреА рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдмреЗрд╣рддрд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕реАрдЦреВрдВред
рдЕрдЧреНрд░рд┐рдо рдзрдиреНрдпрд╡рд╛рдж!

рд╕рд╛рджрд░, рдПрдВрдбреНрд░рдпреВ рд╣реЗрд▓рдбрд░!

Source: https://habr.com/ru/post/In217325/


All Articles