我有一个小应用程序,它是一个可执行文件。对于上下文,它将部署到瘦客户端计算机并在引导时自动运行。用户无权关闭此应用程序。
但是,我需要应用程序易于更新。我无法编写我的软件来执行任何类型的自动更新例程,因为这些站通常具有必须事先禁用的写入阻止程序*。
作为管理员,最简单的解决方案是使用瘦客户机提供的各种工具或必要时的组策略/脚本复制旧的EXE。更新不一定立即生效 - 下次重启很好。
问题在于,当然,可执行文件正在使用中,无法覆盖。允许这种情况发生的最佳方法是什么?将软件完全加载到内存中并从那里运行?做一些将exe复制到临时文件夹然后用命令行开关执行的例程,这样它就不会无休止地循环了吗?
*这可能会造成一些混乱。这些是Windows XP / Windows 7嵌入式计算机。在大多数情况下,它们像普通计算机一样工作,除了文件系统写入被透明地重定向到缓存驱动器。重新启动时,所有更改都将完全还原。更新机器的常规脚本将类似于:
Disable Write Blocker
Reboot Machine
Copy Files
Reboot Machine
Enable Write Blocker
Reboot Machine
但是,我的应用程序将在每次重启后自动启动,因为没有机制通知它。因此,当脚本运行时,可执行文件仍在使用中。
答案 0 :(得分:0)
您可以将Windows“MoveFileEx与DelayUntilReboot选项一起使用。
要从C#执行此操作,请参阅this answer,其中显示了如何设置对Windows API的调用。
注意:我认为通话需要管理员权限。
答案 1 :(得分:0)
您可以使用名为Shadow copying assemblies的内容。搜索网络,你会发现很多例子(也在SO和Codeproject上)。
显然,只有在禁用写保护的情况下,应用程序才能更新。你在使用FBWF还是EWF?您甚至可以从写保护中排除应用程序文件夹。