Самостоятельное обновление приложения .net CF - PullRequest
3 голосов
/ 25 февраля 2009

Мне нужно, чтобы приложение CF самообновлялось через веб-сервис. Я нашел одну статью на MSDN от 2003 года, которая объясняет это довольно хорошо. Тем не менее, я хотел бы поговорить здесь на практике. Кто-нибудь действительно делал это раньше или все полагаются на сторонние решения?

Меня специально попросили сделать это таким образом, поэтому, если вам известны какие-либо советы / предостережения, любая информация приветствуется.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 08 июня 2009

Это относительно легко сделать. По сути, ваше приложение вызывает веб-сервис для сравнения его версии с версией, доступной на сервере. Если версия сервера более новая, ваше приложение загружает новый EXE-файл в виде массива byte [].

Далее, поскольку вы не можете удалить или перезаписать работающий EXE-файл, ваше приложение переименовывает свой исходный EXE-файл во что-то вроде «MyApplication.old» (к счастью, это позволяет ОС). Затем ваше приложение сохраняет загруженный массив byte [] в той же папке, что и исходный EXE-файл, и с тем же оригинальным именем (например, «MyApplication.exe»). Затем вы выводите сообщение пользователю (например, «обнаружена новая версия, перезапустите») и закрываете.

Когда пользователь перезапустит приложение, это будет новая версия, которую он запускает. Новая версия удаляет старый файл («MyApplication.old»), и обновление завершено.

Наличие самого обновления приложения без необходимости перезапуска пользователя - это огромная боль в заднице (для обновления необходимо запустить отдельный процесс, что означает отдельное приложение обновления, которое само не может быть автоматически обновлено) и Я никогда не мог заставить его работать на 100% надежно. У меня никогда не было жалоб клиента на требуемый перезапуск.

2 голосов
/ 08 июня 2009

Я задал этот же вопрос некоторое время назад: Как автоматически обновить приложение Windows Mobile

В основном вам нужно два приложения.

App1: запускает само приложение, но также проверяет наличие CAB-файла (установщик). Если есть cab-файл, он выполняет CAB-файл.

Приложение 2: фактическое применение. Он будет вызывать веб-службу, передавая номер версии службе и получая URL-адрес обратно, если существует новая версия (). После загрузки вы можете дополнительно установить файл cab и завершить работу.

Одна важная проблема: если у вас есть файлы, которые одна установка помещает в файловую систему, но не может перезаписать (файл базы данных, журнал и т. Д.), Вам потребуется две отдельные установки.

Чтобы установить кабину: найдите wceload.exe http://msdn.microsoft.com/en-us/library/bb158700.aspx

    private static bool LaunchInstaller(string cabFile)
    {
        // Info on WceLoad.exe
        //http://msdn.microsoft.com/en-us/library/bb158700.aspx
        const string installerExe = "\\windows\\wceload.exe";

        const string processOptions = ""; 
        try
        {
            ProcessStartInfo processInfo = new ProcessStartInfo();
            processInfo.FileName = installerExe;
            processInfo.Arguments = processOptions + " \"" + cabFile + "\"";

            var process = Process.Start(processInfo);
            if (process != null)
            {
                process.WaitForExit();
            }

            return InstallationSuccessCheck(cabFile);
        }
        catch (Exception e)
        {
            MessageBox.Show("Sorry, for some reason this installation failed.\n" + e.Message);
            Console.WriteLine(e);
            throw;
        }
    }

    private static bool InstallationSuccessCheck(string cabFile)
    {
        if (File.Exists(cabFile))
        {
            MessageBox.Show("Something in the install went wrong.  Please contact support.");

            return false;
        }
        return true;
    }

Чтобы получить номер версии: Assembly.GetExecutingAssembly (). GetName (). Version.ToString ()

Чтобы загрузить такси:

        public void DownloadUpdatedVersion(string updateUrl)
    {
        var request = WebRequest.Create(updateUrl);
        request.Credentials = CredentialCache.DefaultCredentials;
        var response = request.GetResponse();

        try
        {
            var dataStream = response.GetResponseStream();
            string fileName = GetFileName();
            var fileStream = new FileStream(fileName, FileMode.CreateNew);

            ReadWriteStream(dataStream, fileStream);
        }
        finally
        {
            response.Close();
        }
    }
1 голос
/ 25 февраля 2009

Что именно вы подразумеваете под "самообновлением"? Если вы имеете в виду конфигурацию или данные, то веб-сервисы должны работать отлично. Если вы говорите об автоматической загрузке и установке новой версии, это другая история.

Найдено Этот загружаемый образец от Microsoft - похоже, он должен помочь.

0 голосов
/ 08 июня 2009

Если вы хотите использовать сторонний компонент, взгляните на AppToDate , разработанный ребятами из MoDaCo.

...