重命名正在运行的可执行文件(exe)

Ast*_*tin 8 .net c# windows file-rename file-in-use

我们正在尝试同时将更新推送到多个服务器,我的经理发现可以重命名正在运行的.exe文件.利用这些知识,他想重命名正在运行的exe并复制所述exe的新版本,这样任何运行foo.exe的内存副本的人都可以,并且任何打开指向foo.exe的快捷方式的人都将获得一个新副本已应用更新.

我想我需要澄清,他不希望旧版本神奇地更新,他只是希望他们继续运行旧版本,直到他们再次打开exe,在这种情况下,它将打开新的名称,具有该名称旧的.

它有时会抛出一个异常,即文件在他的程序中使用,但如果他尝试在循环中重命名它最终会成功.在我的机器上,我甚至无法在循环中使其工作.

我的第一个主要问题是:这样做是否可以接受.重命名正在运行的可执行文件是否应该是有效的方案?

其次,如果它是一个有效的场景,那么怎么可靠地做到这一点呢?我们目前的想法是尝试使用File.Move(C#)进行重命名,如果它不起作用,则写出错误日志,以便手动处理.

Eri*_*ert 18

飞机技工和外科医生在酒吧见面.机修工说:"你知道,我们的工作基本相同.我们把破碎的东西拿出去,把新的,更好的零件装进去." 外科医生说:"是的,但是当你进行修理时,你不必让飞机保持飞行!"

尝试通过在应用程序运行时移动文件来更新应用程序似乎与尝试修复飞行中的飞机一样危险.可能?当然.大大增加了catetrophic崩溃的风险?是的.

如果要更新的应用程序是托管应用程序,请考虑使用ClickOnce部署.这样,下次有人运行应用程序时,如果有新版本可用,它将被复制并自动安装.这比在应用程序仍然运行时弄乱应用程序要安全和愉快得多.

  • 如果你想知道以前是否已经完成:以色列的CH-53直升机曾经在其起落架上发生严重故障,这意味着它无法着陆而不会造成严重的伤害和潜在的伤亡(至少飞行员是在危险之中).为空军工作的天才在飞机上空中设计和制造了临时部件,然后在直升机悬停在地面以上时将其更换.在空中大约20个小时后,包括aireal加油,它终于安全降落. (17认同)
  • 然而在Linux中这没什么大不了的. (3认同)

Cod*_*ray 10

  1. 不,这是不可接受的.不要这样做.这不是有效的部署机制.这应该是你的或他的第一个线索:

    它有时会抛出一个异常,即文件在他的程序中使用,但如果他尝试在循环中重命名它最终会成功.

    无论如何它都行不通.他的理论非常错误:

    利用这些知识,他想重命名正在运行的exe并复制所述exe的新版本,这样任何运行foo.exe的内存副本的人都可以,并且任何打开指向foo.exe的快捷方式的人都将获得一个新副本已应用更新.

    具体来说,内存中的副本不会自动替换为新的可执行文件,因为它具有相同的名称.您首先允许重命名可执行文件的原因是操作系统未使用文件名来查找应用程序.原始可执行文件仍将被加载,并且它将保持加载状态,直到您显式卸载它并加载新的,已修改的可执行文件.

    请注意,即使是像Chrome和Firefox这样的现代网络浏览器,它们的超级自动化,在后台,没有人注意到它们存在,更新程序仍然必须关闭并重新启动应用程序才能应用更新.

    不要担心在这里射击信使.您的客户和技术支持部门更有可能首先向您开枪.

  2. 见号1.


Viv*_*Viv 4

在我们的组织中,我们通过两个发布文件夹(即 EXE_A 和 EXE_B)解决了更新问题。我们还有一个名为 EXE 的发布文件夹,其中仅包含所有指向用户运行应用程序的 EXE_A 或 EXE_B 的链接。

当我们发布程序的新版本时,我们将其发布到链接中未引用的文件夹中,然后更新链接(EXE)。这样,您就不会遇到用户持有应用程序/程序集的异常。此外,如果用户想要运行更新版本,他所需要做的就是关闭/重新执行 EXE 文件夹中的链接。

  • 为什么这么说?我们使用类似的策略并且效果很好。 (3认同)
  • 这是我能想象到的最糟糕、最容易出错的部署机制。遵循此建议,后果自负…… (2认同)