我已经构建了一个Compact Framework应用程序,并且正在使用WmAutoUpdate将新版本部署到移动设备(http://www.sebastianvogelsang.com/2009/09/23/wmautoupdate-a-net-compact-framework-auto-update-library/)。有人用过吗?很酷,但是我有一个问题。

如果我在更新过程中导致应用程序崩溃,应该通过将备份版本复制回主目录来恢复。这是行不通的,因为该exe文件已被操作系统“锁定”,因为该文件当前正在使用中。我可以确认是这种情况,因为我也无法使用Windows资源管理器将其删除。错误详细信息是:

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));


当允许正常运行时,代码设法更新应用程序exe文件(我不确定如何)。问题是回滚时它不起作用。

欢呼
标记

最佳答案

我使用了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中的随机目录中。然后,我们将备份文件夹复制到应用程序原始目录。当然,这将在设备的Temp目录中生成一个.TMP文件,以及一个包含实际运行进程的文件夹。您必须偶尔在生产代码中删除此临时文件夹。

09-17 02:17