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

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

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

Спасибо!

Ответов (4)

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

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

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

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

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

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

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

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