c# - 应用(服务)自升级?

标签 c# .net .net-4.0

我正在使用 C# 开发基于 .NET4 的应用程序,它作为 Windows 服务运行。

我希望此应用程序能够在它定期连接到的 Web 服务发出指示时自行升级。有没有一种公认的方法来完成这个?有可能吗?

我的想法是这样的:

  1. Windows 服务 (.exe) 代码以 zip 格式下载其替换和支持 DLL,并将它们解压缩到临时目录。该 zip 还包含一个小型“升级程序”可执行文件或脚本。
  2. 该服务派生一个子进程来运行升级程序,在命令行上传递目标目录和任何其他所需信息
  3. 服务关闭
  4. 升级程序等待服务完全停止,然后将必要的文件(新的 .exe、DLL)移动到最终安装目录,替换旧文件
  5. 升级程序重新启动 Windows 服务,该服务生成(升级后的).exe 并在启动后退出

这行得通吗?您可能会从我的术语和方法中发现我来自 UNIX 背景而不是 Windows 背景。我已经在 UNIX 上使用了这种方法,但我不知道可能存在什么样的 Windows 陷阱...

更新:我提出这个问题的主要动机是围绕 self 更新 .NET 应用程序的技术可行性(如何就地替换 .DLL 等)。正如评论中所指出的那样,在实现这样的功能时还涉及许多其他考虑因素,特别是关于验证所应用的新软件组件是否合法的安全问题。这些也很重要,但并不特定于 .NET 或 Windows (imo)。当然,欢迎对这些领域发表评论,但目前它们不是我主要关心的问题......

最佳答案

您的方法当然是合理的,但除非您在 LocalSystem 帐户下运行(不推荐!)您没有权限写入您的应用程序文件夹或启动/停止您自己的服务。即使您在用户帐户下运行,您也可能会因为 UAC 而遇到问题,尽管我不确定这一点。无论如何,在用户帐户下运行并不好,因为它需要用户输入帐户密码,并且密码更改、锁定等会带来额外的复杂性。您必须从安装程序中为两者设置 ACL,无论如何都必须运行提升安装服务。

关于c# - 应用(服务)自升级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4762937/

相关文章:

c# - 如何创建和设置多态属性?

c# - 如何在 ASP.Net Core 5 Identity 中从 Google OAUTH 获取刷新 token ?

c# - 在单独的程序集中启用带有上下文的迁移?

c# - Visual C# - 在哪里存储处理文件和工作而不是 C :\ProgramFiles?

应用程序失去和获得焦点的 .NET 事件

c# - 使用 Validator 时忽略 .NET 4 RTM MetadataType 属性

c# - Visual Studio F6 停止工作。它不再构建项目

.NET PInvoke 异常处理

jquery - MVC、WCF ASP.NET 4.0 和 JQUERY

c# - 无法将字符串转换为字符