Я не понимаю, как программа может обновлять себя. Как я могу сделать свое обновление программного обеспечения? - PullRequest
23 голосов
/ 17 ноября 2009

Скажите, что я делаю .exe файл, и все персиковое. Замечательно, что это работает.

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

Я не могу обернуться вокруг этой проблемы.

Спасибо.

EDIT: Извините за путаницу, но я имел в виду более мудрый кодовый ответ. В моем коде есть что-то особенное, что мне нужно разрешить обновление?

Например, если я хочу добавить новую функцию, как я могу добавить «метод» в уже упакованный .exe? : S Это меня вертит.

Ответы [ 9 ]

17 голосов
/ 17 ноября 2009

Популярное решение состоит в том, чтобы на самом деле отдельный процесс заменил необходимые файлы.

Вы когда-нибудь замечали, что Firefox должен перезагружаться при каждом обновлении? Это происходит потому, что отдельный процесс (updater.exe) загружает файлы, закрывает Firefox, заменяет файлы, а затем снова запускает Firefox.

edit конечно, это предполагает, что вы размещаете в Интернете список обновлений, которые программа проверки может проверить (RSS-канал или даже простой текстовый файл).

15 голосов
/ 17 ноября 2009

Вам нужно взглянуть на Нажмите один раз при развертывании .

ClickOnce - это технология развертывания, которая позволяет создавать самообновляющиеся приложения для Windows, которые можно устанавливать и запускать с минимальным взаимодействием с пользователем. Visual Studio обеспечивает полную поддержку публикации и обновления приложений, развернутых с помощью технологии ClickOnce, если вы разрабатывали свои проекты с помощью Visual Basic и Visual C #.

Это создает загружаемый установочный файл, который вы загружаете в Интернет. Пользователь либо запускает это на месте, либо загружает и запускает его. Это оборачивает ваш исполняемый файл в код, который будет проверять наличие обновлений на веб-сайте (с выбранной вами частотой). Если он найдет его, он установит его для пользователя.

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

Следует отметить, что ClickOnce не поддерживает установку приложений, требующих административного доступа:

Развертывание ClickOnce позволяет пользователям без прав администратора устанавливать и предоставлять только те разрешения Code Access Security, которые необходимы для приложения.

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

14 голосов
/ 17 ноября 2009

Обычно процесс выглядит следующим образом:

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

Конечно, у вас может быть много вариантов, но это основной способ сделать это.

В Windows, по крайней мере, некоторые программы устанавливают модуль обновления, который всегда включен, и проверяет наличие новых обновлений программного обеспечения (например, GoogleUpdater).

6 голосов
/ 17 ноября 2009

Одна идея - у вас может быть приложение-загрузчик, которое проверяет вас, а затем при необходимости обновляет exe-файл основного приложения перед его запуском?

1 голос
/ 17 ноября 2009

Вы не изменяете свой текущий .exe.

Вы запускаете отдельный процесс, который загружает новую версию файла. Новая версия заменяет старую версию. Модификация не требуется.

1 голос
/ 17 ноября 2009

Делайте ваше приложение время от времени отправляйте запрос через Интернет на ваш веб-сервер. Попросите, чтобы этот запрос возвратил файл, который содержит номер версии и ссылку на самую новую версию вашего установщика. Если этот номер версии больше номера версии, которая, по мнению текущей запущенной программы, должна быть загружена, загрузите новый установочный файл и запустите его.

1 голос
/ 17 ноября 2009

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

Там вы можете просто поместить, например, текстовый файл, содержащий номер текущей версии. Если это будет более новая версия установленного приложения, вы можете загрузить программу обновления (не забудьте подписать и проверить подписи) и установить новую версию.

1 голос
/ 17 ноября 2009

Для Windows (как правило, из-за Windows, блокирующей файл .exe во время его выполнения)

  • Программное обеспечение определяет необходимость обновления
  • Программное обеспечение запускает упакованный исполняемый файл обновления (в этот момент программное обеспечение завершается)
  • Обновление загружает необходимые файлы в некоторую временную папку
  • Обновление применяет патчи
  • Обновление перезапускает программное обеспечение
0 голосов
/ 17 ноября 2009

С точки зрения кода мне нравится иметь подход, который состоит из простого интерфейса, называемого IRun, и другого, называемого IUpdated:

public interface IRun()
{
  public void Run();
}

public interface IUpdated()
{
  public void Update();
}

Теперь мое основное приложение просто загрузит и «запустит» библиотеку, используя отражение, которое, в свою очередь, запустит реальное приложение.

Основной исполняемый файл приложения выполнит следующие действия:

  1. Считайте файл Updater.cfg, подключитесь к указанному местоположению и проверьте наличие обновлений для средства обновления .
  2. Если есть обновления, загрузите обновленные dll и updater.cfg
  3. Используя отражение, загрузите updater.dll и запустите метод Update ().

Метод обновления выполняет те же действия для обновления фактического приложения.

Наконец

  1. Загрузите "core.dll" и запустите метод Run ().

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

...