Написание собственного автозапуска
При написании моего собственного автоматического обновления есть ли общая структура, которой я должен следовать?
Некоторое время назад я читал, как нужно создать "загрузочную ленту", которая будет загружаться сначала перед основным приложением (поскольку запущенная аппликация не может быть обновлена из-за блокировок файлов и т.д.).
Итак, какие-нибудь советы/рекомендации для этого?
Ответы
Ответ 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