Подтвердить что ты не робот

Написание собственного автозапуска

При написании моего собственного автоматического обновления есть ли общая структура, которой я должен следовать?

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

Итак, какие-нибудь советы/рекомендации для этого?

4b9b3361

Ответ 1

Вам, вероятно, придется писать свои собственные. Как упоминалось выше, основная идея состоит в том, чтобы поставить последнюю версию вашей программы (я предполагаю EXE) на сервере, а затем проверить приложение с сервером при его запуске и загрузить EXE с сервера, если это более новая версия.

Я обычно использовал это как веб-службу, которую приложение вызывает при запуске. Несколько предупреждений об этом подходе:

  • Метод веб-службы должен получить номер версии EXE на сервере и сравнить его с номером версии вызывающего. Если вы используете класс Assembly для чтения номера версии сервера EXE, это заблокирует файл до тех пор, пока выполняется экземпляр веб-службы (не менее 20 минут). В результате иногда может возникнуть проблема с заменой EXE на сервере более новой версией. Вместо этого используйте класс AssemblyName - это позволяет вам читать информацию о сборке без загрузки сборки (и ее блокировки).

  • Приложение-получатель не может заменить свой собственный файл новой версией - вы не можете удалить или обновить исполняемый файл приложения. Однако он может переименовать свой собственный файл во время работы. Таким образом, трюк в автоматическом обновлении заключается в том, что приложение может переименовать себя (например, "MyApplication.exe" в "MyApplication_OLD.exe" ), загрузите новую версию в папку приложения (с именем "MyApplication.exe" ), уведомите пользователя что произошло обновление, требующее перезагрузки приложения, а затем завершение. Когда пользователь перезапустит приложение, будет запущена более новая версия - эта версия проверяет и удаляет старую версию.

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

Ответ 2

Хорошо, прежде всего, если один из продуктов установки/обновления на рынке соответствует вашим потребностям, вы, вероятно, должны использовать их. Это, как говорится, я получил удовольствие от создания такой системы, как это было недавно. Да, наша программа установки/обновления включала две части на стороне клиента, чтобы:

~ Часть A будет подключаться к серверам, на которых хранится и публикуется последняя версия; если бы появилась более новая версия части B, она загрузила бы ее и отпустила.

~ Часть B сосредоточится на установке/обновлении реального приложения (и может загружать и устанавливать обновления для части A).

Кроме того, я бы рекомендовал всегда учитывать следующие 4 операции в программе установки/обновления:

  • Установка и удаление

  • Обновление и откат (т.е. отмена последнего обновления)

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

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

Ответ 3

Я закодировал программу обновления для приложения, над которым я работал в С++, но общая структура была бы одинаковой.

  • Приложение проверяет URL-адрес для номера версии или другого изменения идентификатора
  • Приложение отключает приложение new updater из сети
  • Приложение запускает приложение new updater (которое может включать код для непредвиденных изменений в процессе обновления), а затем выходы приложения
  • Новый updater ждет приложения для выхода, затем загружает и устанавливает новый "материал" и т.д.

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

Ответ 4

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

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

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

Ответ 5

Вот решение с открытым исходным кодом, которое я написал для удовлетворения конкретных потребностей, которые у нас были для 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)

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

Ответ 6

К сожалению, нет Sparkle или update-engine для .NET. Существует Application Application Block for.NET, выпущенный Microsoft, что лучше всего, если вы не хотите полностью откатывать свое собственное решение ( есть еще куча кода, который вам нужно написать, хотя).

Ответ 7

ClickOnce не работает для нас. Мы устанавливаем базу данных на нашем клиентском сервере. База данных на их конце должна быть обновлена ​​до того, как мы сделаем обновление. У нас гораздо больше, чем просто 2 или 3 клиента, поэтому ClickOnce для нашего приложения на самом деле не самая лучшая идея, если только мне не хватает чего-то важного для ClickOnce.

Что я сделал, было добавлено поле в базу данных для номера версии. На нашем ftp-сайте у меня есть папка версий, в которой есть папка для каждого номера версии нашего приложения. Внутри этой папки с конкретной версией мы помещаем zip файл с setup.exe и файл msi, который запускает setup.exe. Все предварительные требования загружаются с сайта поставщиков, чтобы гарантировать, что наш FTP-сайт не получает больших загрузок (.Net 3.5, когда мы переходим к нему). Когда наше приложение запускается, оно проверяет поле в базе данных на номер версии, и если оно отличается от версии сборки текущей версии, оно будет подключаться к ftp-сайту, загружать zip файл из этой папки новой версии, разархивировать его и выполните настройку. Это установит более новые версии .NET или любые другие требования, которые мы, возможно, добавили, а затем запустите MSI для установки нашего приложения, и все, что нужно сделать пользователю, - это нажать несколько раз несколько раз.

Ответ 8

В статье CodeProject есть статья об этом: "Автоматическое обновление приложения в VB.NET" в https://secure.codeproject.com/KB/vb/autoupdate.aspx и https://secure.codeproject.com/KB/vb/Auto_Update_Revisited.aspx

И еще один хороший здесь: Автоматическое обновление пользовательского приложения ": https://secure.codeproject.com/KB/vb/CustomAppAutoUpdate.aspx

Ответ 9

Если вы используете .Net, почему бы просто не использовать ClickOnce? Он будет делать все, о чем вы говорите, и требует почти нулевой настройки.

Ответ 10

Этот 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 и завершает работу. Третий процесс начинается как обычно, видит, что было обновление, и удаляет копию temp exe. Затем он работает как обычно, включая проверку обновлений. Он обнаружит, что обновлений нет, и он будет запускаться в обычном режиме. Это касается работы логики обновления на месте.

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

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

Проблема check-for-update также обрабатывается несколькими строками кода в конструкторе, которые создают и запускают поток рабочего потока:

  _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). Но я никогда не делал этого.

Ответ 11

Десять лет назад я написал автообновление (не в .NET), но суть заключалась в том, что у приложения был идентификатор версии, который был проверен при запуске. В этом случае приложение запросило таблицу базы данных, имеющую текущую версию, и если работающая версия была меньше текущей версии, пользователю было предложено загрузить последнюю версию. То же самое можно сделать, проверив URL-адрес.

Ответ 12

Одним из решений, которое я еще должен попробовать, является установка установщика, который может работать в бесшумном режиме.

Приложение вызывается сервером, и если он нуждается в обновлении, он загружает последний установщик, затем запускает его с тихим или обновляемым флагом.

У этого есть много преимуществ:

  • гибкость: вы можете делать все, что вы сделали бы для нормальной установки
  • нет дополнительного пакета: установщик и обновление - это одно и то же.
  • Если вы удалите и переустановите, вы можете обрабатывать откаты
  • обновление представляет собой отдельный процесс, поэтому он может запускать приложение, когда установка завершена.
  • У вас есть инструменты для управления Vista UAC