在编写自己的自动更新程序时,是否有一个我应该遵循的通用框架?
前一段时间我正在阅读如何创建一个"引导过滤器",它将在主应用程序之前首先加载(因为由于文件锁定而无法更新正在运行的应用程序等)
那么任何提示/最佳实践呢?
你可能要写自己的.正如FOR提到的,基本的想法是在服务器上放置程序的最新版本(我假设是EXE),然后让应用程序在启动时检查服务器,并从服务器下载EXE(如果是)更新的版本.
我通常将其实现为应用程序在启动时调用的Web服务.关于这种方法的几个警告:
Web服务方法需要获取服务器上EXE的版本号,并将其与调用者的版本号进行比较.如果使用Assembly类读取服务器EXE的版本号,则只要Web服务实例正在运行(至少20分钟),就会锁定该文件.因此,您有时可能无法使用较新版本替换服务器上的EXE.使用AssemblyName类 - 这允许您在不加载程序集(并锁定它)的情况下读取程序集信息.
调用者应用程序无法用新版本替换其自己的文件 - 您无法删除或更新正在运行的应用程序文件.但它可以做的是在运行时重命名自己的文件.因此,自动更新的技巧是让应用程序重命名(例如"MyApplication.exe"到"MyApplication_OLD.exe"),将新版本下载到应用程序文件夹(名为"MyApplication.exe"),通知用户发生了更新,需要重新启动应用程序,然后结束.当用户重新启动应用程序时,它将是启动的较新版本 - 此版本检查并删除旧版本.
在这样的更新之后执行自动更新以自动重启应用程序是非常棘手的(它涉及启动另一个进程,然后在自动重启过程开始之前结束自己的进程).我从来没有让用户抱怨不得不重新启动应用程序.
好的,首先,如果市场上的某个安装程序/更新程序产品符合您的需求,您应该使用它们.话虽这么说,我很幸运不久前建立了这样一个系统.是的,我们的安装程序/更新程序包括客户端的两个部分,以便:
~A部分将连接到存储和发布最新版本的服务器; 如果有更新版本的B部分可用,它会下载并启动它
~B部分将专注于安装/更新实际应用程序(并可以下载和安装A部分的更新).
除此之外,我建议始终考虑安装程序/更新程序中的以下4个操作:
安装和卸载
更新和回滚(即撤消上次更新)
当您的用户拥有一个可以在一夜之间自动更新的系统时,回滚功能非常重要.如果每次更新都会更新,他们可以在您解决问题时回滚并继续工作.
最后,安装程序/更新程序应该尝试并且不知道它安装/更新的应用程序,以便在应用程序更改时,安装程序/更新程序系统受到的影响最小.