WmAutoUpdate - 有人用它吗?不会回滚

时间:2011-01-05 22:03:52

标签: c# compact-framework

我已经构建了一个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文件(我不知道如何)。问题是它在回滚时不起作用。

啦啦队
标记

1 个答案:

答案 0 :(得分:0)

我使用过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文件,以及包含实际运行进程的文件夹。您必须在生产代码中暂时删除此临时文件夹。