WmAutoUpdate - кто-нибудь использовал? Не откатится - PullRequest
3 голосов
/ 06 января 2011

Я создал приложение Compact Framework и использую WmAutoUpdate для развертывания новых версий на мобильных устройствах (http://www.sebastianvogelsang.com/2009/09/23/wmautoupdate-a-net-compact-framework-auto-update-library/). Кто-нибудь использовал это? Это круто, но у меня проблема.

Если я вызываю сбой приложения на полпути при обновлении, оно должно быть восстановлено путем копирования версии резервной копии обратно в основной каталог. Это не работает, потому что исполняемый файл «заблокирован» операционной системой, потому что он в настоящее время используется. Я могу убедиться, что это так, потому что я не могу удалить его с помощью Windows Explorer. Детали ошибки:

System.IO.IOException was unhandled
Message="IOException"
StackTrace:
     at System.IO.__Error.WinIOError(Int32 errorCode, String str)
     at System.IO.File.Move(String sourceFileName, String destFileName)
     at WmAutoUpdate.Updater.assertPreviousUpdate()
     at WmAutoUpdate.Updater..ctor(String url)

Ошибка возникает в этой строке в Updater.assertPreviousUpdate ():

File.Move(f, appPath + "\\" + getFilenameFromPath(f));

Коду удается обновить исполняемый файл приложения, когда ему разрешено нормально работать (я не знаю, как). Проблема в том, что он не работает при откате.

Cheer
Mark

1 Ответ

0 голосов
/ 03 февраля 2014

Я использовал WmAutoUpdate и обнаружил ту же проблему. Проблема в том, что вы можете перемещать файлы реального запущенного процесса, но вы не можете перезаписать их. Если вы проверите часть обновления, WmAutoUpdate перемещает запущенное приложение в каталог резервных копий, а затем записывает версию обновления в исходный каталог. Я исправил часть отката следующим образом:

if (Directory.Exists(backupDir))
{
  string tmpDir = Path.Combine(Path.GetTempPath(),Path.GetFileNameWithoutExtension(Path.GetTempFileName()));
  Directory.Move(appPath, tmpDir);
  Directory.Move(backupDir, appPath);
}

Сначала мы перемещаем файлы запущенного приложения в случайный каталог в Temp. Затем мы копируем резервную копию папки в исходную директорию приложения. Конечно, это сгенерирует файл .TMP в каталоге Temp вашего устройства и папку с фактическим запущенным процессом. Вам придется время от времени удалять эту временную папку в рабочем коде.

...