C# 发布我的程序';因此可以在运行时覆盖它

C# 发布我的程序';因此可以在运行时覆盖它,c#,.net,C#,.net,我有一个小的应用程序,它是一个单一的可执行文件。对于上下文,这将部署到瘦客户端计算机,并在引导时自动运行。用户无权关闭此应用程序 然而,我需要的应用程序是易于更新。我不能编写我的软件来执行任何类型的自动更新例程,因为这些站点通常有一个写阻止程序*,必须事先禁用它 作为管理员,最简单的解决方案是使用瘦客户机提供的各种工具或组策略/脚本(如果需要)将新的EXE复制到旧的EXE上。更新不必立即生效-下次重新启动就可以了 当然,问题是可执行文件正在使用中,不能被覆盖。让这种情况发生的最好方式是什么?将软

我有一个小的应用程序,它是一个单一的可执行文件。对于上下文,这将部署到瘦客户端计算机,并在引导时自动运行。用户无权关闭此应用程序

然而,我需要的应用程序是易于更新。我不能编写我的软件来执行任何类型的自动更新例程,因为这些站点通常有一个写阻止程序*,必须事先禁用它

作为管理员,最简单的解决方案是使用瘦客户机提供的各种工具或组策略/脚本(如果需要)将新的EXE复制到旧的EXE上。更新不必立即生效-下次重新启动就可以了

当然,问题是可执行文件正在使用中,不能被覆盖。让这种情况发生的最好方式是什么?将软件完全加载到内存中并从那里运行?执行某种例行程序,将exe复制到一个临时文件夹,然后使用命令行开关执行它,这样它就不会无休止地循环

*这可能会引起一些混乱。这些是Windows XP/Windows 7嵌入式计算机。在大多数情况下,它们的工作方式与普通计算机类似,只是文件系统写入被透明地重定向到缓存驱动器。重新启动时,所有更改都将完全恢复。用于更新计算机的普通脚本将执行以下操作:

Disable Write Blocker 
Reboot Machine
Copy Files
Reboot Machine
Enable Write Blocker
Reboot Machine

但是,我的应用程序在每次重新启动后都会自动启动,因为没有机制通知它。因此,当脚本运行时,可执行文件仍在使用。

您可能可以使用带有DelayUntilReboot选项的Windows

要从C#执行此操作,请参见显示如何设置对Windows API的调用的内容


注意:我认为该呼叫需要管理员权限。

您可以使用名为的东西。在网上搜索,你会发现很多例子(还有SO和Codeproject)


显然,只有禁用写保护时,应用程序才能更新。您使用的是FBWF还是EWF?您甚至可以将应用程序文件夹从写保护中排除。

唯一的方法是使用“卷影副本”。Windows中正在运行的可执行文件不能按此方式释放。还有一些工具可以“在重新启动时复制[或删除]”,这可能值得一看。@user2246674您所说的卷影复制是什么意思?你是说使用Windows VSS吗?如果是这样的话,我就不能指望有能力了。关于第二点,我需要使我的应用程序在这方面完全透明。Windows软件有各种类型的自动更新功能。为什么不调查一下呢?不要把轮子改造成梯形。@CodyGray,我不能。这些机器没有持久文件系统。它们被设计为使用脚本和文件副本等进行更新,所以我需要找到一种方法在其中工作。@Dan..重新启动时?:D(在使用我上面提到的短语时,可以找到很多例子。)感谢您花时间回答。我已经澄清了写阻止程序是如何工作的,因为我认为这种方法对我不起作用。@Dan为什么不起作用?如果您在更新过程描述中的“复制文件”阶段使用此延迟移动,则移动将在随后的“重新启动计算机”步骤中发生(此时写入阻止可能仍处于禁用状态,但在应用程序启动之前,因为移动发生在启动过程中)@Iridium这主要是对平均过程的猜测。但是这样做需要管理员使用两种机制。一个是准备机器,另一个是在我的应用程序中调用更新——我认为这是不可取的。