Самостоятельное обновление .net CF-приложения

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

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

Спасибо!


person sarsnake    schedule 25.02.2009    source источник


Ответы (4)


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

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

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

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

person MusiGenesis    schedule 08.06.2009
comment
спасибо за ответ, в моем случае похоже придется делать самообновление. Причина этого в том, что наши пользователи не очень сообразительны и могут не обновлять приложение, и что в конечном итоге произойдет, у нас будут разные версии повсюду - это наверняка будет головной болью. Я бы предпочел заниматься этим автоматически на ранних этапах. - person sarsnake; 08.06.2009
comment
В моем случае я могу загрузить файл .cab (cf installer) с сервера, и это установщик, если мы щелкнем этот файл, он установит эту версию на мобильное устройство. Я попробовал ваш ответ, но он не работает. возможно с компактной рамкой.Пожалуйста, ответьте. - person Royal; 19.07.2014
comment
@Royal: да, этот подход возможен с помощью компактной платформы - фактически, моя версия работала как на Windows Mobile, так и на обычной Windows. Вы говорите, что пробовали это сделать - опубликуйте свою попытку как вопрос здесь, на StackOverflow, и укажите мне на нее, и я попытаюсь понять, в чем проблема с вашей реализацией. - person MusiGenesis; 20.07.2014

Некоторое время назад я задал тот же вопрос: Как автоматически обновить приложение 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();
        }
    }
person Chris Brandsma    schedule 08.06.2009

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

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

person Dave Swersky    schedule 25.02.2009
comment
На самом деле я имею в виду оба. msdn.microsoft.com/en-us/library/aa446487.aspx Это делает и то, и другое, но это старая статья, и мне просто интересно, есть ли у кого-нибудь практический опыт работы с ней. - person sarsnake; 25.02.2009

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

person Tom van Enckevort    schedule 08.06.2009