Как реализовать обновление программы

Задался таким вопросом, как реализация автообновления программы. Принцип таков: пользователь запускает программу, далее работает наша программа — если версия данной программы, к примеру 1.0, а уже есть 1.1, то программа скачивает новую версию и перезапускает программу, в итоге программа свежая.

Как думаю я: На сервере лежит файл version.txt (я думаю, можно и XML, хотя будет сложнее обрабатывать). Наша программа при каждом её запуске проверяет версию. Читаем файл version.txt с помощью средств c++ (если это возможно, НЕ скачивая файл) и сравниваем его с текущей версией (обычная переменная). Если версии одинаковые, то продолжаем работу программы.

Иначе — а тут много вариантов, можем предлагать скачивать, можем заставить. Я выберу принудительную загрузку, т.е. обязательно, либо старая программа работать не будет. Скачиваем последнюю версию программы и перезапускаем её. Предложите свои варианты. Возможно в моем алгоритме есть и недостатки.

Скажите как лучше по вашему. P.S. Интересует только алгоритм, решение и средства предлагайте по желанию.

Уроки C# – Как обновлять свою программу на C#

Отслеживать
задан 5 мая 2015 в 20:33
745 2 2 золотых знака 17 17 серебряных знаков 30 30 бронзовых знаков

На самом деле, обновление исполняемых файлов — это лишь начало проблем. Вы должны смигрировать и конфигурационные файлы (настройки). Это раз. Затем, на windows есть такая штука, как roaming profiles, это означает, что не только новые версии должны корректно работать со старыми настройками, но и старые — с новыми! Welcome to compatibility hell.

5 мая 2015 в 23:03
Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа).
6 мая 2015 в 8:46

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Не претендую на правильность решения, просто расскажу, как это сделано у меня. При запуске программы раз в 4 дня (чаще нет смысла, я не выпускаю новые версии так часто) в фоновом потоке запускается проверка обновления (пользователь может и вручную запустить).

На сервере лежат такие файлики.

[f] Fixed uploading video files from Explorer’s context menu custom items

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

Если пользователь соглашается, программа перезапускает сама себя с правами админа, и скачивает файл по указанному DownloadUrl . Проверяет md5 хэш zip архива и распаковывает архив во временную папку. Внутри архива есть еще один xml файл, где указано, в какие папки нужно раскидывать файлы. Перед перезаписью exe и dll файлов они переименовываются в *.old . После чего программа запускает новую версию с особым ключом, чтобы можно было проделать еще какие нибудь действия (как правило, не требутся).

Читайте также:
Какой программой открыть файл дежавю

Как сделать обновление программы (Легко и Просто) на C#

Некоторые компоненты (не содержащие exe файлы) обновляются втихаря без ведома пользователя.

При моем подходе есть недостатки, при деинсталляции инсталлятором (InnoSetup), новые файлы, установленные с помощью авто-обновления, не удаляются.

Хотя наверно для обновления exe правильнее было бы скачивать инсталлятор и устанавливать его по-тихому, но мне лень переделывать. Мне нравится, как сделано обновление у браузеров ( гугл хром и т.д.), программа обновляется сама, а пользователь даже не замечает. Но ради этого программа установлена в папку пользователя, а не в Program Files. Причем, если не ошибаюсь, у гугла инкрементное обновление, т.е. вместо огромного бинарника на 100 мб скачивается небольшой diff.

Но отказываться от встроенной системы обновления я не вижу смысла, моя программа (Image Uploader) должна часто обновлять поддержку хостингов, которые часто меняются, это жизненная необходимость. Обновление хостингов весит грубо говоря 50 кб, а сама программа 5 МБ.

P.S. Запрещать пользователям пользоваться старыми версиями программы — глупо. Я стараюсь поддерживать обратную совместимость со старыми версиями до разумного предела.

Источник: ru.stackoverflow.com

Практическое руководство. Проверка обновлений для приложения программным способом с помощью развертывания API ClickOnce

Область применения:yesVisual StudionoVisual Studio для Mac noVisual Studio Code

ClickOnce предоставляет два способа обновления приложения после его развертывания. В первом методе можно настроить развертывание ClickOnce для автоматической проверки наличия обновлений через определенные промежутки времени. Во втором методе можно написать код, который использует ApplicationDeployment класс для проверки наличия обновлений на основе события, например запроса пользователя.

Класс ApplicationDeployment и API в System.Deployment.Application пространстве имен не поддерживаются в .NET Core и .NET 5 и более поздних версиях. Однако .NET 7 поддерживает новый метод доступа к свойствам развертывания приложения. Дополнительные сведения см. в статье Доступ к свойствам развертывания ClickOnce в .NET.

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

Чтобы обновить приложение ClickOnce программным способом, необходимо указать расположение для обновлений. Иногда это называется поставщиком развертывания. Дополнительные сведения о настройке этого свойства см. в разделе Выбор стратегии обновления ClickOnce.

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

Проверка наличия обновлений программным способом

  1. Создайте новое приложение Windows Forms с помощью предпочитаемых средств командной строки или визуальных элементов.
  2. Создайте кнопку, пункт меню или другой элемент пользовательского интерфейса, который пользователи должны выбрать для проверки наличия обновлений. В обработчике событий этого элемента вызовите следующий метод для проверки и установки обновлений.

private void InstallUpdateSyncWithInfo() < UpdateCheckInfo info = null; if (ApplicationDeployment.IsNetworkDeployed) < ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; try < info = ad.CheckForDetailedUpdate(); >catch (DeploymentDownloadException dde) < MessageBox.Show(«The new version of the application cannot be downloaded at this time. nnPlease check your network connection, or try again later. Error: » + dde.Message); return; >catch (InvalidDeploymentException ide) < MessageBox.Show(«Cannot check for a new version of the application. The ClickOnce deployment is corrupt. Please redeploy the application and try again. Error: » + ide.Message); return; >catch (InvalidOperationException ioe) < MessageBox.Show(«This application cannot be updated. It is likely not a ClickOnce application. Error: » + ioe.Message); return; >if (info.UpdateAvailable) < Boolean doUpdate = true; if (!info.IsUpdateRequired) < DialogResult dr = MessageBox.Show(«An update is available. Would you like to update the application now?», «Update Available», MessageBoxButtons.OKCancel); if (!(DialogResult.OK == dr)) < doUpdate = false; >> else < // Display a message that the app MUST reboot. Display the minimum required version. MessageBox.Show(«This application has detected a mandatory update from your current » + «version to version » + info.MinimumRequiredVersion.ToString() + «. The application will now install the update and restart.», «Update Available», MessageBoxButtons.OK, MessageBoxIcon.Information); >if (doUpdate) < try < ad.Update(); MessageBox.Show(«The application has been upgraded, and will now restart.»); Application.Restart(); >catch (DeploymentDownloadException dde) < MessageBox.Show(«Cannot install the latest version of the application. nnPlease check your network connection, or try again later. Error: » + dde); return; >> > > >
Private Sub InstallUpdateSyncWithInfo() Dim info As UpdateCheckInfo = Nothing If (ApplicationDeployment.IsNetworkDeployed) Then Dim AD As ApplicationDeployment = ApplicationDeployment.CurrentDeployment Try info = AD.CheckForDetailedUpdate() Catch dde As DeploymentDownloadException MessageBox.Show(«The new version of the application cannot be downloaded at this time. » + ControlChars.Lf «Please check your network connection, or try again later. Error: » + dde.Message) Return Catch ioe As InvalidOperationException MessageBox.Show(«This application cannot be updated. It is likely not a ClickOnce application. Error: » An update is available. Would you like to update the application now?», «Update Available», MessageBoxButtons.OKCancel) If (Not System.Windows.Forms.DialogResult.OK = dr) Then doUpdate = False End If Else ‘ Display a message that the app MUST reboot. Display the minimum required version. MessageBox.Show(«This application has detected a mandatory update from your current » version to version » _ «. The application will now install the update and restart.», _ «Update Available», MessageBoxButtons.OK, _ MessageBoxIcon.Information) End If If (doUpdate) Then Try AD.Update() MessageBox.Show(«The application has been upgraded, and will now restart.») Application.Restart() Catch dde As DeploymentDownloadException MessageBox.Show(«Cannot install the latest version of the application. » ControlChars.Lf Please check your network connection, or try again later.») Return End Try End If End If End If End Sub
public: void InstallUpdateSync() < if (ApplicationDeployment::IsNetworkDeployed) < bool isUpdateAvailable = false; ApplicationDeployment^ appDeployment = ApplicationDeployment::CurrentDeployment; try < isUpdateAvailable = appDeployment->CheckForUpdate(); > catch (InvalidOperationException^ ex) < MessageBox::Show(«The update check failed. Error: «, ex->Message); return; > if (isUpdateAvailable) < try < appDeployment->Update(); MessageBox::Show( «The application has been upgraded, and will now » + «restart.»); Application::Restart(); > catch (Exception^ ex) < MessageBox::Show(«The update failed. Error: «, ex->Message); return; > > > >

Читайте также:
Какие программы нужны ландшафтному дизайнеру

Использование Mage.exe для развертывания приложения, которое проверяет наличие обновлений программным способом

  • Следуйте инструкциям по развертыванию приложения с помощью Mage.exe, как описано в разделе Пошаговое руководство. Развертывание приложения ClickOnce вручную. При вызове Mage.exe для создания манифеста развертывания обязательно используйте параметр providerUrl командной строки и укажите URL-адрес, по которому ClickOnce должен проверять наличие обновлений. Например, если приложение будет обновляться с http://www.adatum.com/MyApp , вызов для создания манифеста развертывания может выглядеть следующим образом:

mage -New Deployment -ToFile WindowsFormsApp1.application -Name «My App 1.0» -Version 1.0.0.0 -AppManifest 1.0.0.0MyApp.manifest -providerUrl http://www.adatum.com/MyApp/MyApp.application

Использование MageUI.exe для развертывания приложения, которое проверяет наличие обновлений программным способом

  • Следуйте инструкциям по развертыванию приложения с помощью Mage.exe, как описано в разделе Пошаговое руководство. Развертывание приложения ClickOnce вручную. На вкладке Параметры развертывания задайте в поле Расположение запуска манифест приложения ClickOnce должен проверять наличие обновлений. На вкладке Параметры обновления снимите флажок Это приложение должно проверять наличие обновлений .

Безопасность .NET Framework

Приложение должно иметь разрешения с полным доверием для использования программного обновления.

См. также раздел

  • Практическое руководство. Указание альтернативного расположения для обновлений развертывания
  • Выбор стратегии обновления ClickOnce
  • Публикация приложений ClickOnce

Источник: learn.microsoft.com

Статья Обновление программы или лоадера [C++]

В данной статье я вам расскажу как сделать простенькую проверку на обновление вашей программы или лоадера на языке программирования C++
Если вы хотите что бы пользователи скачали последнию версию вашей программы то мы реализуем функцию которая будет проверять на веб части версию клиента и сравнивать ее с клиенской части и если они не схожи то обновлять либо же открыть ссылку на скачивание обновленного лоадера или программы

Для начало мы подклюим директивы для работы с интернетом
#include
#pragma comment(lib, «WinInet.lib»)

Читайте также:
Программа развития общества это

Давайте добавим в коде переменную версий текущей для нашей программы и будем ее проверять через метод DownloadString который будет ниже
string version = «1.0»;

Теперь давайте реализуем функцию скачивание строки и замену строк

string replaceAll(string subject, const string replace) < size_t pos = 0; while ((pos = subject.find(search, pos)) != string::npos) < subject.replace(pos, search.length(), replace); pos += replace.length(); >return subject; >
string DownloadString(string URL) < HINTERNET interwebs = InternetOpenA(«Mozilla/5.0», INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL); HINTERNET urlFile; string rtn; if (interwebs) < urlFile = InternetOpenUrlA(interwebs, URL.c_str(), NULL, NULL, NULL, NULL); if (urlFile) < char buffer[2000]; DWORD bytesRead; do < InternetReadFile(urlFile, buffer, 2000, rtn.append(buffer, bytesRead); memset(buffer, 0, 2000); >while (bytesRead); InternetCloseHandle(interwebs); InternetCloseHandle(urlFile); string p = replaceAll(rtn, «|n», «rn»); return p; > > InternetCloseHandle(interwebs); string p = replaceAll(rtn, «|n», «rn»); return p; >

Давайте сделаем проверку в начале точки входа нашей программы:
if(version != DownloadString(«Ссылка для чтения текста версий»)) < // Если версия не равняется с клиентской части, обновляем printf(«Programm is outdated, please download a new version»); Sleep(3000); // Добавляем ожидание 3 секунды что бы пользователь смог прочитать system(«start https://google.com») // вместо google.com укажите версию откуда скачать новую версию exit(0); // Делаем выход из программы >

Источник: anonymcheats.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru