Как автоматически обновить приложение Windows Mobile
У меня есть приложение.net cf 3.5 для Windows Mobile, которое мой клиент хочет иметь функции автообновления.
Вот что у меня так далеко:
- создать CAB с помощью CAB-проекта Smart Device (это достаточно хорошо, или я должен делать что-то еще здесь)
2. Получить номер версии приложения
Assembly.GetExecutingAssembly().GetName().Version.ToString();
- Позвоните в веб-службу WCF для поиска номера версии.
- Загрузите новую версию файла cab.
- ???
- Выполнить WCELoad.exe в CAB-файле
- прибыль
5 ответов
Ваше решение, как правило, правильное, но имеет несколько проблем.
- Вы не можете обновить себя. Вы должны закрыть и попросить обновить приложение, чтобы предотвратить проблему с совместным доступом к файлам. Обычно это достигается с помощью специального приложения для обновления, которое вы запускаете. Он может быть целью значка приложения и, следовательно, выполнять обновления при каждом запуске, или он может запускаться с помощью пункта меню типа "проверить наличие обновлений". В любом случае, вы должны запустить его и убедиться, что само приложение не запущено.
- Как правило, рекомендуется создать резервную копию на случай повреждения или прерывания установки.
- Обновления CAB потребуют оптовых обновлений всего. В конце концов, это может быть не то, что вам нужно (вы можете захотеть обновить только один файл, сборку или что-то еще), поэтому, начав с логики вытягивания отдельных файлов, вы станете более расширяемыми.
Старый, но все еще очень полезный ресурс - это статья MSDN Алекса Фейнмана о создании самообновляющихся приложений.
Я только что опубликовал WmAutoUpdate, фреймворк.NET C#, который будет выполнять автообновления в Compact Framework. Это свободно доступно на Github: http://github.com/seboslaw/wmautoupdate
Нет необходимости создавать специальное приложение для обновления, по крайней мере, не на WM 6 с.netcf 3.5. Я загружаю файл.cab с помощью веб-службы, а затем запускаю новый процесс и запускаю wceload, чтобы выполнить установку без вывода сообщений. Это позволит закрыть мое работающее приложение, удалить его, а затем выполнить установку, как указано в документации MSDN здесь.
В Windows Mobile версии 5.0 и выше при использовании Wceload.exe для переустановки CAB-файла Wceload.exe удаляет ранее установленную версию CAB-файла перед установкой новой версии. Во время удаления этого процесса Wceload.exe закрывает все запущенные в настоящий момент исполняемые файлы, которые были установлены на целевом устройстве, используя CAB-файл, основываясь на их имени файла. Wceload.exe также закрывает все исполняемые файлы, которые являются целью файловой операции, такой как перемещение или копирование. Чтобы закрыть исполняемый файл, Wceload.exe отправляет WM_CLOSE во все окна верхнего уровня, принадлежащие процессу. Если процесс не завершается своевременно после получения сообщения WM_CLOSE, то Wceload.exe принудительно закрывает его, вызывая TerminateProcess. Wceload.exe не пытается закрыть исполняемые файлы, отправленные в образе времени выполнения на целевом устройстве.
У меня также есть cesetup.dll для дополнительной очистки файлов во время удаления.
Большая проблема, с которой я столкнулся, заключается в том, что я не могу изменить папку установки для моего приложения при установке в режиме без вывода сообщений, и по умолчанию используется свойство%installDir% из моего файла.inf. И создание отдельного.cab для каждого устройства, которое хочет обновить, не очень хорошее решение.
Команда, в которой я участвовал, реализовала это, создав второе мобильное приложение (вне обновляемого приложения) на мобильных устройствах, которое отвечало за загрузку и запуск CAB.
- На каждой док-станции основное приложение определяло, нужно ли его обновлять с помощью вызова веб-службы.
- Если его версия устарела, он вызывает приложение обновления с URI новой версии для установки и затем завершает работу.
- Приложение обновления будет загружать новую CAB и выполнять установки / перезагрузки и изменения реестра, в зависимости от ситуации.
Это сработало для нас довольно хорошо.
Вы правы. после wM5 6... WCEload просто останавливает приложение, если оно установлено, поэтому вам не нужно останавливать его вручную. но вам нужно установить обновление в режиме без вывода сообщений, потому что в противном случае пользователь может отменить его, поэтому вам нужен установщик тихой кабины. скачать его с