我正在使用 C# 开发基于 .NET4 的应用程序,它作为 Windows 服务运行。
我希望此应用程序能够在它定期连接到的 Web 服务发出指示时自行升级。有没有一种公认的方法来完成这个?有可能吗?
我的想法是这样的:
- Windows 服务 (.exe) 代码以 zip 格式下载其替换和支持 DLL,并将它们解压缩到临时目录。该 zip 还包含一个小型“升级程序”可执行文件或脚本。
- 该服务派生一个子进程来运行升级程序,在命令行上传递目标目录和任何其他所需信息
- 服务关闭
- 升级程序等待服务完全停止,然后将必要的文件(新的 .exe、DLL)移动到最终安装目录,替换旧文件
- 升级程序重新启动 Windows 服务,该服务生成(升级后的).exe 并在启动后退出
这行得通吗?您可能会从我的术语和方法中发现我来自 UNIX 背景而不是 Windows 背景。我已经在 UNIX 上使用了这种方法,但我不知道可能存在什么样的 Windows 陷阱...
更新:我提出这个问题的主要动机是围绕 self 更新 .NET 应用程序的技术可行性(如何就地替换 .DLL 等)。正如评论中所指出的那样,在实现这样的功能时还涉及许多其他考虑因素,特别是关于验证所应用的新软件组件是否合法的安全问题。这些也很重要,但并不特定于 .NET 或 Windows (imo)。当然,欢迎对这些领域发表评论,但目前它们不是我主要关心的问题......
最佳答案
您的方法当然是合理的,但除非您在 LocalSystem 帐户下运行(不推荐!)您没有权限写入您的应用程序文件夹或启动/停止您自己的服务。即使您在用户帐户下运行,您也可能会因为 UAC 而遇到问题,尽管我不确定这一点。无论如何,在用户帐户下运行并不好,因为它需要用户输入帐户密码,并且密码更改、锁定等会带来额外的复杂性。您必须从安装程序中为两者设置 ACL,无论如何都必须运行提升安装服务。
关于c# - 应用(服务)自升级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4762937/