Автоматическое обновление приложения Windows

Как мне разработать приложение для Windows, чтобы оно автоматически обновлялось на клиентском компьютере, таком как Firefox, Skype и т. Д.?

Есть ли какой-нибудь простой подход или какая-либо библиотека с открытым исходным кодом, которая помогает мне сделать это, просто выполнив несколько шагов или несколько строк кода?

9 ответов

Решение

ClickOnce - это то, что вы ищете.

Вы также можете найти эти вопросы SO интересными (которые предлагают несколько разных решений):

Самые популярные фреймворки:

  • Google Omaha - это то, что использует Chrome. Очень могущественный.
  • Белка - используется в приложениях Electron. Проста в использовании, но не может обновлять установки на уровне машины. Также нет графических уведомлений об обновлениях.
  • WinSparkle - дает вам графические уведомления об обновлениях. Но менее зрелый, чем Белка.
  • AutoUpdater.NET - Графические и автоматические обновления. Похож на Squirrel и WinSparkle.

Я взял эти ссылки из этой статьи. В нем более подробно рассказывается о плюсах и минусах каждой из фреймворков.

Попробуйте технологию Microsoft Clickonce

MSDN)

Используйте MD5-Update, просто нужно добавить 5 строк в ваше приложение, не нужно настраивать ваше приложение, только добавьте библиотеку и опубликуйте файлы.

1. Вам нужен веб-сервер с PHP для публикации файлов, включите updt.exe.

2. Добавьте index.php для создания списка файлов обновлений. доступно в репозитории github создания нового приложения с этим кодом.

      <?php
$_dat = array();
$_dir=new RecursiveDirectoryIterator(".");
foreach (new RecursiveIteratorIterator($_dir) as $_itm) {
    $_fil = str_replace(".".DIRECTORY_SEPARATOR, "", $_itm);
    if(!is_dir($_fil) && $_fil != "index.php"){     
        $_dat[]=array('StrFil' => "$_fil", 'StrMd5' => strtoupper(md5_file($_fil)), 'lonSiz' => filesize($_fil));
    }
}
echo json_encode($_dat, JSON_UNESCAPED_UNICODE);
?>

3. Добавьте репозиторий nuget в свой проект.

      PM> Install-Package MD5.Update

4. Вызовите библиотеку, когда ваше приложение станет звездой, с URL-адресом вашей папки обновлений, обновите все файлы и загрузите новое приложение в папку обновления, для замены вашего приложения потребуется updt.exe.

      string strUrl = "http://yourdomain.com/app/";
if (MD5Update.MD5Update.Check(strUrl, true))
{
    Process.Start(AppDomain.CurrentDomain.BaseDirectory + @"updt.exe", AppDomain.CurrentDomain.FriendlyName + " " + Process.GetCurrentProcess().ProcessName);
    Application.Exit();
}

5. updt.exe для замены текущего приложения новой папкой обновления приложения в app. доступно в репозитории githubhttps://github.com/jrz-soft-mx/MD5-Update/blob/main/Tools/Tools.zip дляhttps://github.com/jrz-soft-mx/MD5-Update/blob/main/Tools/Tools.zip для создания нового приложения с этим кодом.

      try
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    List<string> lisArg = Environment.GetCommandLineArgs().ToList();
    if (lisArg.Count < 2)
    {
        MessageBox.Show("Please provide App Excutable Name and Procees name");
        Application.Exit();
        return;
    }
    string strAppName = lisArg[1];
    string strAppProcees = lisArg[2];
    Process[] lisPro = Process.GetProcessesByName(strAppProcees);
    foreach (Process Pro in lisPro)
    {
        if (Pro.Id != Process.GetCurrentProcess().Id)
        {
            Pro.Kill();
            Thread.Sleep(1000);
        }
    }
    string strAppMain = AppDomain.CurrentDomain.BaseDirectory + strAppName;
    string strAppUpdate = AppDomain.CurrentDomain.BaseDirectory + @"updt\" + strAppName;
    if (!File.Exists(strAppMain))
    {
        MessageBox.Show("App Excutable dosent exists");
        Application.Exit();
        return;
    }
    if (!File.Exists(strAppUpdate))
    {
        MessageBox.Show("App Excutable Updated dosent exists");
        Application.Exit();
        return;
    }
    File.Copy(strAppUpdate, strAppMain, true);
    long fileSize = 0;
    FileInfo currentFile = new FileInfo(strAppMain);
    while (fileSize < currentFile.Length)
    {
        fileSize = currentFile.Length;
        Thread.Sleep(1000);
        currentFile.Refresh();
    }
    Process.Start(strAppMain);
}
catch (Exception Ex)
{
    MessageBox.Show("An error ocurred");
    File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + @"updt_" + DateTime.Now.ToString("yyyyMMddTHHmmss")  + " .txt", Ex.ToString());
    Application.Exit();
}

Вы можете использовать wyUpdate или .NET Application Updater Component

В Ent Lib также есть блок обновления по msft.

Хотя ClickOnce прост и возродился для .NET 5, он все еще имеет множество ограничений, поэтому я обнаружил, что в настоящее время существует лучший вариант: вы можете использовать включенный в Windows 10 механизм доставки приложений под названием AppInstaller, упаковав свое приложение в пакет MSIX. или пакет.

В этом я рассказал о своих выводах, связанных с этой темой. ответе

Как насчет System Center 2012 Configuration Manager?

Другие вопросы по тегам