Каков наилучший способ для приложения .NET winforms обновить себя без использования ClickOnce?

StackOverflow https://stackoverflow.com/questions/150994

Вопрос

По техническим причинам я не могу использовать ClickOnce для автоматического обновления моего .NET-приложения и его сборок.Каков наилучший способ обработки автоматического обновления в .NET?

Это было полезно?

Решение

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

Другие советы

У нас есть коммерческий продукт с открытым исходным кодом: wyBuild и обновление wyUpdate.Он обладает способностью исправлять ошибки и очень прост в использовании.

Редактировать:За меня проголосовали отрицательные цифры, но мой пост был не просто откровенной продажей.Наше средство обновления, wyUpdate, имеет открытый исходный код, написано на C # и лицензируется по лицензии BSD.

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

Но проголосуйте против меня, если хотите.

Около 3-4 лет назад я опубликовал пример, который находится вне приложения: при обнаружении обновления приложение вызывает программу обновления и завершает работу, затем обновления завершаются, и приложение перезапускается.

Я опубликовал пример на старом сайте GotDotNet...Я должен буду попытаться найти его.

Это сработало идеально, и на написание ушло около 1-2 часов.

У Indigo Rose есть продукт под названием Истинное обновление это также делает это за вас.В прошлом я использовал их как в управляемых, так и в неуправляемых приложениях.По сути, это файл, который вы размещаете на своем сервере (http, ftp, как вам угодно).Затем вы вызываете исполняемый файл на стороне клиента, чтобы проверить наличие обновлений.Извлекается файл обновлений, имеющий логику для определения того, какая версия установлена на клиенте (ваш выбор, обнаружение DLL, чтение раздела реестра и т.д.).Затем он найдет для себя подходящее средство обновления и загрузит файл для выполнения.Это также хорошо работает через прокси-серверы.

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

В качестве отправной точки для создания своего собственного, на это, вероятно, стоит обратить внимание Статья Алекса Фейнмана о MSDN озаглавленная "Создание самообновляющихся приложений с помощью .NET Compact Framework".

Напишите свой собственный.

Я слышал, что в первый раз их несколько сложно написать, но после этого становится проще.

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

В вашем файле Program.cs сделайте что-то вроде этого:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Update();
        Application.Run(new Form1());
    }

    private static void Update()
    {
        string mainFolder;
        string updateFolder;
        string backupFolder;

        foreach (string file in
            System.IO.Directory.GetFiles(updateFolder))
        {
            string newFile = file.Replace(
                updateFolder, mainFolder);

            if (System.IO.File.Exists(newFile))
            {
                System.IO.File.Replace(file, newFile, backupFolder);
            }
            else
            {
                System.IO.File.Move(file, newFile);
            }
        }
    }

Кроме того, его можно сделать рекурсивным, чтобы при необходимости подобрать структуру каталогов.Это позволит вам обновить любую .библиотеку DLL в вашем проекте;все, по сути, за пределами основного .exe.Затем где-нибудь в другом месте вашего приложения вы можете справиться с получением файлов со своего сервера (или откуда угодно), которые необходимо обновить, поместить затем в папку updateFolder и перезапустить приложение.

Давным-давно в одном проекте, используя .NET Compact Framework 1.0, я написал приложение с автоматическим обновлением.Мы использовали функцию развертывания CAB в SqlCE для загрузки файлов на устройство (сейчас вы бы использовали Sync Framework), и у нас был отдельный exe-файл, который выполнял распаковку CAB и обновление файлов.

Обновление будет выглядеть следующим образом:пользователю будет предложено обновить, нажать кнопку и выйти из пользовательского интерфейса приложения.Исполняемый файл программы обновления возьмет верх, получит cab-файл с сервера, создаст резервную копию текущих DLL-файлов и распакует cab-файл с помощью wceload.Затем пользовательский интерфейс будет перезапущен, и в случае сбоя обновление будет откатано.Это все еще интересный сценарий на компактных устройствах, но сейчас есть инструменты получше, чем просто sqlce.

Я бы, конечно, посмотрел на блок приложений updater и платформу синхронизации, чтобы реализовать это, если clickonce не подходит.Но я предполагаю, что вам все равно понадобится отдельный исполняемый файл, потому что библиотеки DLL, которые вы хотите перезаписать, вероятно, заблокированы во время использования exe, как уже говорилось в одном из предыдущих ответов.

Я написал свой собственный автозапуск, автозапуск использует общий конфигурационный файл для приложения, который содержит URL-адреса для загрузки последних версий / проверьте, нужно ли его обновлять.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top