2

我的项目包含在用户的办公室台式电脑上运行的 WinForms、WPF 和 Windows 服务程序。我希望这些应用程序定期检查特定 URL 上可用的新版本,自动下载新版本并用新版本替换自己,而不会引起任何用户注意(请记住,用户可以运行从 XP 到 7 的 Windows 并使用非特权帐户工作(可以是活动目录的一部分))。或者,整个更新包必须能够作为无人值守安装的 MSI 包分发。

有什么关于实施这个的建议吗?

4

2 回答 2

1

你不走运 - 遗憾的是所有解决方案都很糟糕。您最好的选择(即我正在做的事情)是让一个应用程序定期检查它是否已过时并向用户发出信号。现在,在我的情况下,“Wndows 服务”的意思是“用户几乎一直登录在另一台计算机上控制该服务”,所以我需要有人真正提醒。如果这不起作用,您将不得不重新实现诸如 Windows 更新服务之类的东西 - 遗憾的是没有预定义的方法可以做到这一点。

顺便说一句,没有用户注意根本不起作用。- Windows 服务的安装/更新必须使用管理权限完成,即使这些权限来自进行更新的 Windows 服务的权限。肮脏的问题,无论你做什么。

我会选择 MSI - 这样企业用户可以通过他们的软件管理(可以安装特权)推出它,无论他们在那里使用什么(有多个),并且(家庭)最终用户可以使用管理员权限安装它,就像他们对所有其他软件所做的那样。也许在每次开始检查中央服务器上的新版本时调用 Web 服务。

于 2010-05-09T14:57:05.990 回答
1

这当然是一个有问题的领域,没有简单的解决方案,特别是因为每个解决方案都有许多缺点,没有明显的赢家。

一种选择是仅替换 .dll 文件。这可以防止对程序集进行签名(因为您没有更新可执行文件本身)并且需要以某种方式构建应用程序,以便几乎所有应用程序逻辑都驻留在 dll 中。好处是您可以让 exe 本身检查更新并在可用时下载它们,但这仅在 dll 作为数据存储在其他地方(例如,appdata 中的应用程序插件文件夹)时才可行。

另一种选择是使用以本地管理权限运行的 Windows 服务来下载和安装更新。这可以在没有用户干预的情况下发生,即使对于另一个 Windows 服务 afaik 也是如此。这里的诀窍是不要让更新服务保持运行,而是从实际应用程序之一启动它(无论是在启动时还是在它关闭时),然后在安装任何更新后让服务自行停止,以避免陷入用户困境具有另一个更新服务的系统。

最后,您应该认真考虑删除“完全无人值守”的部分。用户可能会发现间歇性启动延迟是一个问题,并且交流您正在做的事情不会造成任何伤害。我特别喜欢在启动时显示对话框“找到新版本 - 安装(现在)(退出时)(稍后)”的解决方案,让我完全控制我是否想要延迟。一些应用程序(比如我知道的每个扑克客户端)需要与服务器端软件同步,并且不给你这个选项,但仍然显示“更新进行中”对话框,以便我知道发生了什么。只要安装是自动的,我就不会担心提示。

于 2010-05-09T15:32:01.760 回答