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

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

Ответы [ 9 ]

16 голосов
/ 04 июля 2009

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

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

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

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

9 голосов
/ 30 сентября 2008

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

2 голосов
/ 29 ноября 2008

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

2 голосов
/ 30 сентября 2008

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

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

2 голосов
/ 30 сентября 2008

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

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

Работало отлично, на запись ушло около 1-2 часов.

1 голос
/ 21 февраля 2009

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

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

1 голос
/ 30 сентября 2008

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

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

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

1 голос
/ 30 сентября 2008

В вашем файле 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 и перезапустить приложение.

1 голос
/ 30 сентября 2008

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

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

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

...