Запись моего собственного Автоматического [закрытого] Updater

Выезд пирекс или Cython. Они - подобные Python языки для взаимодействия через интерфейс между C/C++ и Python.

28
задан mmcdole 30 October 2008 в 14:46
поделиться

3 ответа

Этот zip-архив содержит исходный код инструмента генератора поиска слов, который включает шаблонный код AppUpdater.
http://cid-842434ebe9688900.skydrive.live.com/self.aspx/Games/WordSearchGenerator-src-v1. 3.zip

Найдите 3 исходных модуля, в названии которых есть «AppUpdater».

Он очень упрощен и работает только для приложений с одной сборкой. Нет файла MSI. Просто EXE. Философия заключается в том, что проверка обновлений происходит автоматически, но обновления устанавливаются только после подтверждения пользователя.

Как работает программа обновления:

Она загружает XML-документ с URL-адреса, который содержит информацию о «последней версии», а также второй URL-адрес, по которому находится актуальная новая версия. Логика средства обновления проверяет подпись в XML-документе, но вас это может не волновать. Затем программа обновления сравнивает текущую версию с последней и может сообщить приложению, доступно ли обновление. Программа обновления также решает проблему замены на месте.

В этой модели существует три «стадии жизненного цикла» приложения во время обновления. В обычном режиме приложение проверяет наличие обновлений, а затем работает в обычном режиме. В какой-то момент пользователь может подтвердить, что он хочет установить доступное обновление, и Updater загружает приложение во временное место, а затем запускает процесс, используя этот недавно загруженный exe. Затем логика средства обновления завершает первый процесс. Второй процесс, основываясь на аргументах командной строки, переданных ему первым процессом, понимает, что это недавно загруженная копия, и ей необходимо реплицировать себя. Копирует себя в исходное место (указанное в командной строке), запускает , что exe, и завершает работу. Третий процесс запускается как обычно, видит, что было обновление, и удаляет временную копию exe. Затем он работает в обычном режиме, включая проверку обновлений. Он обнаружит, что обновлений нет, и будет работать в обычном режиме. Это касается работы логики обновления на месте.

Все это обрабатывается следующими строками в конструкторе Windows Form или WPF Window:

  _Updater = new AppUpdater.SimpleAppUpdater(_MyManifestUrl);
  _Updater.Startup(App.CommandLineArgs);

Проблема проверки наличия обновлений также решается несколькими строками кода в конструкторе, которые создают и запускают фон рабочий поток:

  _Worker = new System.ComponentModel.BackgroundWorker();
  _Worker.DoWork += CheckLatest;
  _Worker.RunWorkerCompleted += CheckCompleted;
  _Worker.RunWorkerAsync();

CheckLatest следующий:

    void CheckLatest(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        lock (_Updater)
        {
            if (_Updater.UpdateIsAvailable) // Checks for update
            {
                // can update a textbox (etc) here.  Be careful of InvokeRequired.
            }
        }
    }

Завершенное событие:

void CheckCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
    if (!e.Cancelled && e.Error == null)
    {
        lock (_Updater)
        {
            // only display the about box if there is an update available.
            if (_Updater.HaveCheckedForUpdate && _Updater.UpdateIsAvailable)
            {
                // do whatever you want here.  Eg, pop a dialog saying 
                // "an update is available"
                About about = new About();
                about.Message= "An update is available";
                about.ShowDialog();
            }
        }
    }
}

Он работает из приложений WinForms или WPF. Думаю, это будет работать и из консольных приложений, но я никогда не пробовал.

Создание (возможно, подписанного) файла манифеста - это отдельная задача, здесь не описанная.

Если подумать, лучше было бы упаковать его как базовый класс AutoUpdatingForm (для WinForms) или AutoUpdatingWindow (для WPF). Но я так и не пошел.

1
ответ дан 28 November 2019 в 03:30
поделиться

Написал собственное программное обеспечение для автоматического обновления. Так что вот мой совет ... Не делай этого !! Конечно, все зависит от вашего конкретного сценария, но вот проблемы, с которыми столкнулась моя компания:

  • Трудно поддерживать на постоянной основе, особенно если вы нацеливаетесь на Win2k и на Windows 7.
  • Проблемы с разрешениями. WinVista / 7 UAC может быть настоящей головной болью.
  • Гибкость - это требование, но вы не сможете предвидеть все проблемы. Например, запуск / остановка служб, запуск файлов и т. Д. - это все задачи, которые вы МОЖЕТЕ выполнить для своих автоматических обновлений, но не обязательно предвидеть.

Проблема с нашим программным обеспечением в том, что нам требовалась большая гибкость и поддержка на всех платформах Windows. Написанное нами решение работало нормально, но не масштабировалось и начинало давать сбой, когда версии Windows менялись или были не совсем такими, как в нашей лаборатории. В конце концов мы купили программное обеспечение, и я рекомендую вам поступить так же. Если вам интересно, мы купили продукт под названием AutoUpdate + ( текст ссылки ).

3
ответ дан 28 November 2019 в 03:30
поделиться

Вот решение с открытым исходным кодом, которое я написал для удовлетворения конкретных потребностей, которые у нас были для приложений WinForms и WPF. Общая идея состоит в том, чтобы иметь максимальную гибкость при минимально возможных накладных расходах.

Итак, интеграция очень проста, и библиотека делает почти все за вас, включая операции синхронизации.Он также очень гибкий и позволяет вам определять, какие задачи выполнять и на каких условиях - вы создаете правила (или используете те, которые уже есть). Не в последнюю очередь это поддержка любых источников обновлений (веб, BitTorrent и т.д.) и любых форматов каналов - все, что не реализовано, вы можете просто написать для себя.

Холодные обновления (требующие перезапуска приложения) также поддерживаются и выполняются автоматически, если для задачи не указана «горячая замена».

Это сводится к одной DLL размером менее 70 КБ.

Более подробная информация на http://www.code972.com/blog/2010/08/nappupdate-application-auto-update-framework-for-dotnet/

Код находится на http: //github.com/synhershko/NAppUpdate (Под лицензией Apache 2.0)

Я планирую расширить его, когда у меня будет больше времени, но, честно говоря, вы сможете быстро улучшить его самостоятельно для все, что он в настоящее время не поддерживает.

3
ответ дан 28 November 2019 в 03:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: