我们正在尝试将更新推送到多个服务器,我的经理发现可以重命名正在运行的.exe文件。利用这些知识,他想重命名正在运行的exe并复制所述exe的新版本,这样任何运行foo.exe内存副本的人都可以,并且任何打开指向foo.exe的快捷方式的人都将获得一个新副本已应用更新。
我想我需要澄清,他不希望旧版本神奇地更新,他只是希望他们继续运行旧版本,直到他们再次打开exe,在这种情况下它将打开新版本有一个旧的名字。
它有时会抛出一个异常,即该文件正在他的程序中使用,但如果他尝试在循环中重命名它最终会成功。在我的机器上,我甚至无法在循环中使其工作。
我的第一个主要问题是:这样做是否可以接受。是否应该重命名正在运行的可执行文件?
其次,如果它是一个有效的场景,那怎么可靠地做到这一点?我们目前的想法是尝试使用File.Move(C#)进行重命名,如果它不起作用,则写出错误日志,以便手动处理。
答案 0 :(得分:17)
飞机机械师和外科医生在酒吧见面。机修工说:“你知道,我们的工作基本相同。我们把破碎的东西拿出去,把新的,更好的零件装进去。”外科医生说:“是的,但是当你进行修理时,你不必让飞机保持飞行!”
尝试通过在应用程序运行时移动文件来更新应用程序似乎与在飞行中修复飞机一样危险。可能?当然。大大增加了catetrophic崩溃的风险?是的。
如果要更新的应用程序是托管应用程序,请考虑使用ClickOnce Deployment。这样,下次有人运行应用程序时,如果有新版本可用,它将被复制并自动安装。这比在应用程序仍在运行时弄乱应用程序更加安全和愉快。
答案 1 :(得分:9)
不,这是不可接受的。不要这样做。这不是有效的部署机制。这应该是你的或他的第一个线索:
它有时会在程序中引发文件正在使用的异常,但如果他尝试在循环中重命名它最终会成功。
无论如何它都行不通。他的理论非常错误:
使用该知识,他想重命名正在运行的exe并复制所述exe的新版本,以便任何运行foo.exe的内存副本的人都可以,并且任何打开指向foo.exe的快捷方式的人都将获得已应用更新的新副本。
具体来说,内存中的副本不会自动替换为新的可执行文件,因为它具有相同的名称。您首先允许重命名可执行文件的原因是操作系统未使用文件名来查找应用程序。原始可执行文件仍将被加载,它将保持加载状态,直到您显式卸载它并加载新的,已修改的可执行文件。
请注意,即使像Chrome和Firefox这样的现代网络浏览器,它们的超级花哨自动,在后台,没有人注意到它们存在,更新程序仍然必须关闭并重新启动应用程序才能应用更新。
不要担心在这里射击信使。您的客户和技术支持部门更有可能先向您开枪。
见第1号。
答案 2 :(得分:2)
在我们的组织中,我们通过两个发布文件夹说EXE_A和EXE_B解决了更新问题。我们还有一个名为EXE的发布文件夹,它只有链接,其中所有链接指向用户运行应用程序的EXE_A或EXE_B。
当我们发布新版本的程序时,我们将它发布到链接中未引用的文件夹,然后更新链接(EXE)。通过这种方式,您不会遇到用户持有应用程序/程序集的异常。此外,如果用户想要运行更新版本,他需要做的就是关闭/重新执行EXE文件夹中的链接。
答案 3 :(得分:1)
如果您使用的是Windows Vista / Server2k8或更新版本,您可以使用mklink
创建指向包含您的应用程序的文件夹的符号链接,并从“symblic链接文件夹”中启动该应用程序,然后在更新时创建一个新文件夹,例如“AppV2”并将SymLink更改为该文件夹,因此下次用户重新启动应用程序时,他会从新文件夹中启动它而不会注意到。
重命名打开的文件总是一个糟糕的选择!
但总的来说,无论如何我会想到一个更好的部署策略,因为如果你需要使用这样的“黑客”,它总是一个混乱的情况。我不知道你的应用程序,但也许ClickOnce可以开始,因为你可以配置它来检查每次启动时的更新...