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

本文关键字:exe 可执行文件 运行 重命名 | 更新日期: 2023-09-27 18:02:00

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

我想我需要澄清,他不希望旧的副本神奇地更新,他只是希望他们继续运行旧的副本,直到他们再次打开exe,在这种情况下,它会打开新的一个有旧的名字。

它有时会抛出一个异常,表明该文件正在他的程序中使用,但如果他尝试在循环中重命名它,它最终会成功。在我的机器上,我甚至还没有能够让它在一个循环中工作。

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

其次,如果这是一个有效的场景,那么如何可靠地做到这一点?我们目前的想法是尝试多次使用File。移动(c#)做一个重命名,如果它不工作,然后写一个错误日志,这样它可以手动处理。

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

一个飞机机修工和一个外科医生在酒吧里相遇。机修工说:"你知道,我们的工作基本上是一样的。我们把坏掉的东西拿出来,装上新的、更好的零件。"外科医生说:"是的,但是你不必在修理的时候让飞机保持飞行!"

试图在应用程序运行时通过移动文件来更新应用程序似乎就像试图修理飞行中的飞机一样危险。可能吗?确定。灾难性崩溃的风险大大增加?是的。

如果您正在更新的应用程序是托管应用程序,请考虑使用ClickOnce Deployment。这样,下次有人运行应用程序时,如果有可用的新版本,它将被复制并自动安装。这比在应用程序还在运行的时候乱动它要安全得多,也令人愉快得多。

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

    有时会抛出一个异常,说明文件正在使用,但如果他尝试在循环中重命名它,它最终会成功。

    不管怎样,它不会起作用的。他的理论是完全错误的:

    利用这些知识,他想重命名一个正在运行的exe,并复制一个新版本的说的exe,这样任何人运行他们的内存中foo.exe的副本是好的,任何人打开一个快捷方式指向foo.exe将得到一个新的副本与更新应用。

    具体来说,内存中的副本不会仅仅因为具有相同的名称而自动替换为新的可执行文件。允许重命名可执行文件的原因首先是因为操作系统没有使用文件名来查找应用程序。原来的可执行文件仍然会被加载,直到您显式地卸载它并加载新的、修改过的可执行文件。

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

    不要担心在这里射到信使。你的客户和你的技术支持部门更有可能首先杀了你。

  2. 见第1条

在我们的组织中,我们通过使用两个名为EXE_A和EXE_B的发布文件夹来解决更新问题。我们也有一个名为EXE的发布文件夹,它只有链接,所有这些链接都指向用户运行应用程序的EXE_A或EXE_B。

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

如果你使用Windows Vista/Server2k8或更新版本,你可以使用mklink创建一个符号链接到包含应用程序的文件夹,并在"符号链接文件夹"中启动应用程序,然后在更新时创建一个新文件夹,例如:"AppV2"并将SymLink更改为该文件夹,因此下次用户重新启动应用程序时,他会在不注意的情况下从新文件夹中启动它。

重命名打开的文件总是一个糟糕的选择!

但总的来说,无论如何我都会想到一个更好的部署策略,因为如果你需要使用这样的"hack",它总是一个混乱的情况。我不知道你的应用程序,但也许ClickOnce将是一个点开始,因为你可以配置它来检查更新在每次启动…