Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更新正在运行的服务?_C# - Fatal编程技术网

C# 如何更新正在运行的服务?

C# 如何更新正在运行的服务?,c#,C#,目前我有一个应用程序用来更新我的软件,这是一个独立的可执行文件,唯一的工作是执行软件更新 启动时,它会将自身从\Binary\复制到\Running\文件夹,然后在\Running\中执行自身以执行工作(因此\Binary\中的副本永远不会被锁定或使用),如果需要更新自身,它只会更新\Binary\下的副本,因此下次运行时会执行较新的副本,并且不会出现任何问题。这一过程多年来一直运作良好 现在我需要做一个更改,我需要将这个过程移动到一个服务(这样它就可以作为LocalSystem执行软件更新,在

目前我有一个应用程序用来更新我的软件,这是一个独立的可执行文件,唯一的工作是执行软件更新

启动时,它会将自身从\Binary\复制到\Running\文件夹,然后在\Running\中执行自身以执行工作(因此\Binary\中的副本永远不会被锁定或使用),如果需要更新自身,它只会更新\Binary\下的副本,因此下次运行时会执行较新的副本,并且不会出现任何问题。这一过程多年来一直运作良好

现在我需要做一个更改,我需要将这个过程移动到一个服务(这样它就可以作为LocalSystem执行软件更新,在LocalSystem中它有管理员权限)-我可以使用相同的模型吗?服务启动时是否可以将自身从\Binary\复制到\Running\并始终从\Running\文件夹运行

否则,对如何更新Service.exe有什么建议吗

任何建议、帮助、建议都将不胜感激。
谢谢,

在过去的一个项目中,我们使用了两个阶段的更新:

  • 首先,一个名为Stub的非常小的简单程序将检查实际更新程序(称为CopyFiles)的更新。如果服务器上的CopyFiles较新,它将被复制下来

  • 然后,存根将启动CopyFiles并自行终止

  • CopyFiles然后可以根据需要更新存根以及所有主应用程序文件

  • 然后,CopyFiles将启动主应用程序可执行文件


对于您的场景,我可以看到两个正在运行的服务—一个是您的实际应用程序,另一个是监视\Binary文件夹。该服务具有管理员权限,可以关闭实际的应用程序服务,将更新复制到\Running,然后重新启动应用程序服务。

在过去的一个项目中,我们使用了两个阶段的更新:

  • 首先,一个名为Stub的非常小的简单程序将检查实际更新程序(称为CopyFiles)的更新。如果服务器上的CopyFiles较新,它将被复制下来

  • 然后,存根将启动CopyFiles并自行终止

  • CopyFiles然后可以根据需要更新存根以及所有主应用程序文件

  • 然后,CopyFiles将启动主应用程序可执行文件


对于您的场景,我可以看到两个正在运行的服务—一个是您的实际应用程序,另一个是监视\Binary文件夹。该服务具有管理员权限,可以关闭实际的应用程序服务,将更新复制到\Running,然后重新启动应用程序服务。

如果您创建一个单独的Windows服务来调用现有应用程序,该怎么办?只要你的应用程序没有GUI,并且没有假设它是在用户帐户下运行的(例如,不访问HKCU注册表项),那么这应该可以工作。在Windows下,子进程继承父进程的安全上下文,因此从服务调用的独立exe应在配置的服务帐户下运行。

如果创建一个单独的Windows服务调用现有的应用程序,该怎么办?只要你的应用程序没有GUI,并且没有假设它是在用户帐户下运行的(例如,不访问HKCU注册表项),那么这应该可以工作。在Windows下,子进程继承父进程的安全上下文,因此从服务调用的独立exe应在配置的服务帐户下运行。

您正在询问更新程序可执行文件的更新,对吗?是。。。Service.exe(用于更新我的软件)本身可以更新…您询问的是更新程序可执行文件,对吗?是的。。。Service.exe(用于更新我的软件)本身可以更新…然后你失去了对现有应用程序的控制-如果单独的windows服务启动updater.exe服务,然后终止(它需要终止才能由updater.exe更新)如何控制updater.exe(停止/启动/等等)?服务管理器将如何处理它?如果Windows服务只运行单独的updater.exe,为什么它需要更改?updater.exe可以像当前一样更新自身。服务只是根据您想要的任何逻辑调用它-例如,每天在预定时间调用一次。显然,如果您将智能更新移动到服务中,它需要是可更新的-我建议使用一个只调用updater.exe的愚蠢服务。我了解到,即使是愚蠢的小工具也可能有一天需要更新,因此你总是需要一个计划/结构来完成它-因为一旦它出现,你就卡住了。然后你就失去了对现有应用程序的控制-如果单独的窗口服务启动updater.exe服务,然后终止(它需要终止,以便可以由updater.exe更新)如何控制updater.exe(停止/启动/等?服务管理器将如何处理它?如果Windows服务只运行单独的updater.exe,为什么它需要更改?updater.exe可以像当前一样更新自身。服务只是根据您想要的任何逻辑调用它-例如,每天在预定时间调用一次。显然,如果您将智能更新移动到服务中,它需要是可更新的-我建议使用一个只调用updater.exe的愚蠢服务。我了解到,即使是愚蠢的小工具也可能有一天需要更新,因此你总是需要一个计划/结构来完成它-因为一旦它出现了,你就卡住了。好吧-为了让它不那么复杂-我没有强迫重新启动的问题更新Updater.exe服务时。因此,启动Stub.exe服务,检查\Binary\中是否存在Updater.exe.new,将其复制到\Running\中,然后启动Updater.exe服务?这是你的推荐(打字)吗?这确实让它很容易。有一个名为MoveFileEx()的Win32 API方法,它有一个pInvoke(Interop)si