【问题标题】:rename a running application - dangerous?重命名正在运行的应用程序 - 危险吗?
【发布时间】:2011-04-28 14:27:28
【问题描述】:

我正在编写一个小实用程序来更新我们的应用程序。

为了更新更新实用程序,我希望它在运行时重命名并从远程源复制新版本。因此,下次启动更新程序时,您将获得一个新版本。

您知道使用该机制可能出现的任何问题吗?

实际上我很惊讶它可以重命名正在运行的程序(在那里丢失了一个蛋糕......),而不允许删除。

欢迎任何提示

使用 Win XP、.NET 3.5

【问题讨论】:

  • 下面的答案很好。但是,也许您应该研究 ClickOnce 部署,而不是自己滚动。那里有一些非常先进的东西,其优点是您不需要维护更新程序应用程序。
  • 很遗憾,由于公司窗口设置非常严格,无法使用 ClickOnce。我们无权访问任何管理员权限,并且本地用户只能呼吸。我们只有有限的写入权限...
  • 您是否真的尝试安装 ClickOnce 部署的应用程序,因为整个想法是它安装到用户可以访问的区域。

标签: c# .net windows


【解决方案1】:

您可以重命名 - 因为它仅更改元数据,但实际的文件分配链未修改,这意味着它们可以在使用它的进程中保持内存映射。

这是安装程序中普遍存在的技巧,当他们必须升级“实时”运行的二进制文件时。

如果应用程序稍后尝试从原始文件规范重新打开,它可能会导致问题。这不是可执行文件或 dll 经常发生的事情,尽管您应该了解可能进行一些自我认证(许可证检查)的嵌入式资源和程序。通常最好尽快重启相应的应用程序,就像 Windows 会敦促您在系统更新时重启一样

【讨论】:

  • 哦,我只是想到了替代file streams on NTFS;重命名主文件也将重命名所有替代流(这是一件好事,例如对于隐藏在那里的操作系统/服务内容)。请注意,如果文件被重命名,使用流的应用程序可能会感到困惑
【解决方案2】:

重命名 .exe 通常没有任何问题 - 重命名 .dll 则完全是另一回事。

我建议改用子目录(标有日期或版本号)并创建一个小型启动器应用程序(与“真实”应用程序具有相同的名称和图标)从文本文件中读取当前版本并启动它。

updater.exe (the launcher)
updater.config (containing /updater_v_02/updater.exe)
 /updater_v_01/updater.exe (the real app, v 01)
 /updater_v_02/updater.exe (the real app, v 02)

这样你就可以

  • 保留应用程序的多个版本
  • 在您的用户继续使用旧版本的同时测试新版本(直接从子目录启动)
  • 轻松切换 DLL 等

【讨论】:

    猜你喜欢
    • 2011-12-28
    • 2012-07-18
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2013-07-24
    • 2018-10-17
    • 2013-11-08
    相关资源
    最近更新 更多