C# - Windows应用程序自动更新程序的方法

时间:2016-02-28 09:22:54

标签: c# windows-services windows-installer auto-update

我有一个安装在多个远程工作站上的Windows应用程序(用C#编写),安装由MSI软件包完成。

正在不时地对程序进行更改的更新安装,此时,对于每次更新,我们需要前往.MSI所在的每个站点复制它并运行它而不是启动应用程序。

我希望如此:每当用户尝试启动应用程序时,将初始化后台进程,将安装的版本与.msi位置上的最新版本进行比较,如果需要的更新将运行安装,则启动应用程序。

问题在于,无法在程序内完成,因为在安装/升级过程中程序无法运行。另一个考虑因素并非所有站点同时运行,因此我无法安排及时升级,并且无法在站点启动时完成,因为有时需要在站点已完成时进行更新操作(该站在我的应用程序旁边有几个功能)。

我已经考虑了几种方法,看起来像Windows服务可以做到这一点,但我不知道它是否可以"绑定"初始化程序,如果它可以暂停程序进行必要的检查和更新,而不是重新启动应用程序。

我对所有想法持开放态度,所以请不要对我的想法感到有责任......

3 个答案:

答案 0 :(得分:1)

  

此时,对于每次更新,我们需要为每个站点去.MSI所在的位置   位于复制并运行它,而不是启动应用程序。

解雇冒充系统管理员的人。

除非您在安装程序中做了一些奇怪的事情 - 它应该适用于您的标准软件分发包。哎呀,只要MSI允许管理没有ui安装,我就可以只使用活动目录推出更新而不会推出第三方软件。

您尝试修复无问题。软件分发是过去15到20年的解决方案。 MSI专门用于处理此问题,因为其他方法证明了问题。

因此,无论谁假装成为贵公司的管理员,都需要将他的行为放在一起并成为一体。什么都不做(除了做一个好的MSI)并让管理员完成他的工作。

其他一切只会产生很多问题(至少在成本方面)。而且完全不需要它。

答案 1 :(得分:0)

我正在更新我的回答,

这就是我们所做的......

  1. 创建安装程序/包(您可以在此处为所有用户安装)
  2. 生成Bootstrapper(https://msdn.microsoft.com/en-us/library/ms165429.aspx 您可以使用此工具创建bootstrapper(http://www.softpedia.com/get/Programming/Other-Programming-Files/Bootstrapper-Manifest-Generator.shtml

    1. 在引导程序中添加依赖项和其他条件

    2. 设置更新的网址

  3. 这将解决您的问题。我太快回答了,但我们这样做了。

    感谢。

答案 2 :(得分:0)

关于问题中假设的一些评论和答案:

"我希望如此:每当用户尝试启动应用时,将初始化后台进程,将安装的版本与.msi位置上的最新版本进行比较,如果需要的更新将运行安装,然后启动应用程序。"

这可能是一种有用的方法,当MSI在公司的Web服务器上时。该网站可以托管您发送ProductCode,版本,升级到的Web api,并报告是否有升级,补丁等以及从中下载的位置。如上所述,在公司域中,只使用AD。

"问题是它无法在程序中完成,因为在安装/升级过程中程序无法运行。"

为什么呢? Windows Installer将显示FilesInUse对话框,供最终用户关闭正在运行的应用程序。所以这种情况已经处理好了,我不确定你在哪里看到问题。

" ...如果它可以暂停程序进行必要的检查和更新,而不是重新启动应用程序。"

这正是Restart Manager的用途。将您的应用程序与RM集成,Windows Installer将允许您关闭应用程序(保存您需要恢复的任何数据),然后重新启动您,以便您可以恢复数据并且用户可以看到最小的中断。一个例子:

http://www.codeproject.com/Articles/772868/Restart-Manager-Support-For-Windows-Application

所以我认为TomTom的观点是有效的 - 没有必要重新发明AD做什么,或者担心如何更新正在运行的程序,或者在安装程序更新后如何重新启动程序,因为所有几年前这些问题都解决了。