一. 摘要
前两天在博客上发布了一篇英文的自动更新组件文章Release a AutoUpdater tool,那么在这篇文章中,咱们也对其功能进行一些简单说明,这个组件很是简单,因此你们能够下载进行一些改进。众所周知,对于通常的软件开发,在开始的时候都会有一个技术选型的阶段,最大的选型就是首先要肯定是选择Client/Server模式仍是Browser/Server模式。综合而论:二者各有优劣,在不少方面都不能被对方互相取代,如在适用Internet、维护工做量等方面,B/S比C/S要强不少;但在运行速度、数据安全、人机交互等方面,B/S就远不如C/S那么强大。因此综上所述,凡是C/S的强项,即是B/S的弱项,反之亦然。因为今天讨论的是自动更新组件,因此接下来咱们就往这方面细讲,既然C/S模式在运行速度、数据安全、人机交互有这么多的优势,尤为是客户端技术日益发展的今天,如何解决客户端的部署与自动升级问题即是一个很是重要的问题。html
二. 本文提纲
· 1.摘要安全
· 2.本文提纲服务器
· 3.为何不使用ClickOnce网络
· 4.简要介绍app
· 5.项目中如何使用框架
· 6.具体效果post
· 7.维护与下载spa
· 8.总结设计
三. 为何不使用ClickOnce
在前面的摘要中咱们简单介绍了自动更新功能的重要性,在这一小节里咱们来谈一下为何不使用微软给咱们提供的自动更新组件ClickOnce,你们都知道ClickOnce给咱们提供了不少功能:简单说来,ClickOnce 应用程序就是任何使用 ClickOnce 技术发布的 Windows 窗体或控制台应用程序。能够采用三种不一样的方法发布 ClickOnce 应用程序:从网页发布、从网络文件共享发布或是从媒体(如 CD-ROM)发布。ClickOnce 应用程序既能够安装在最终用户的计算机上并在本地运行(即便当计算机脱机时也能够运行),也能够仅以联机模式运行,而不在最终用户的计算机上永久安装任何内容。ClickOnce 应用程序能够自行更新;这些应用程序能够在较新版本变为可用时检查较新版本,并自动替换全部更新的文件。开发人员能够指定更新行为;网络管理员也能够控制更新策略,如将更新标记为强制性的。最终用户或管理员还能够对更新进行回滚,使应用程序恢复到早期的版本。3d
从上面你们能够看出ClickOnce 无疑是微软对Client/Server模式部署的最佳解决方案,但正是由于它的功能特别强大并且又要使用至关简单,因此在产品的封装上就特别严实,基本上就暴露了一些简单的操做接口,这样就无形把一些定制化的操做拒之于门外,好比:
1,用户不能本身指定安装路径。
2,对自动更新流程不能作定制化的操做。
3,对自动更新的UI不能定制化的设计。
正由于这几个缘由,因此不少企业都会作一些定制化的组件来实现自动更新的功能,基于此,咱们这里也实现了一个很是简单的自动更新组件.
四. 简要介绍
其实自动更新的原理很简单,分析起来无非就是简单的几步操做,固然实现方式也是大同小异,这里咱们就选一种较简单的方式:
1.启动主程序,主程序里面调用升级程序,升级程序链接到IIS或者FTP。
2.升级程序获取服务器端XML配置文件中新版本程序的更新日期或版本号或文件大小。
3.升级程序获取原有客户端应用程序的最近一次更新日期或版本号或文件大小,而后二者进行比较;若是新版本日期>原有程序的最新日期,则提示用户是否升级;或若是新版本版本号>原有程序的版本号,则提示用户是否升级;再或若是新版本文件大小>原有程序的文件大小,则提示用户是否升级。本文主要采用通常的作法,就是经过版本号来进行对比。
4.若是用户选择升级,则获取下载文件列表;
5.在本地创建与远程IIS或者FTP相应的临时目录,而后下载到这个临时目录文件下;
6.删除旧的主程序,拷贝临时文件夹中的文件到相应的位置;
8.结束升级流程并从新启动主程序。
根据前面的流程,咱们能够简单设计以下的项目:
图1
具体类介绍:
IAutoUpdater.cs 提供外部调用的接口
AutoUpdater.cs 该组件的主操做类
Autoupdater.config 本地配置文件
DownloadConfirm.cs 提示是否有更新页面
DownloadProgress.cs 下载进度页面
CommonUnitity.cs 一些经常使用功能
Config.cs 当更新完毕以后须要更新Config,因此这里须要一个提供序列化的Config类
ConstFile.cs 一些常量文件
DownloadFileInfo.cs 须要下载的文件实体类
LocalFile.cs 本地文件实体类
RemoteFile.cs 远程文件实体类
UpdateFileList.cs 本地的实体类集合
代码很是简单,具体能够下载进行查看,因此这里就不作过多阐述。
五. 项目中如何使用
第一步:Host更新的版本到服务器
若是须要让客户端获取最新的版本,首先咱们须要开发人员编译源代码并生成文件,而后拷贝到FTP或者IIS目录下,运行一个自动生成XML文件的程序,把全部的文件都自动生成到一个XML文件,详细见下图:
第二步:配置本地的Config
通过第一步的流程,这一步要作的就是配置本地的Config用于监测并下载远程IIS或者FTP下须要更新的文件,具体以下图所示:
图3
第三步:修改主程序
首先把AutoUpdater这个DLL引入咱们的主项目,而后在主项目中添加以下代码,固然你能够根据本身的须要进行书写,这个DLL提供了两个外部接口,一个接口用于判断是否有更新及下载,另外一个接口则是用于更新出错时进行回滚操做,具体代码以下:
#region check and download new version program bool bHasError = false; IAutoUpdater autoUpdater = new AutoUpdater(); try { autoUpdater.Update(); } catch (WebException exp) { MessageBox.Show("Can not find the specified resource"); bHasError = true; } catch (XmlException exp) { bHasError = true; MessageBox.Show("Download the upgrade file error"); } catch (NotSupportedException exp) { bHasError = true; MessageBox.Show("Upgrade address configuration error"); } catch (ArgumentException exp) { bHasError = true; MessageBox.Show("Download the upgrade file error"); } catch (Exception exp) { bHasError = true; MessageBox.Show("An error occurred during the upgrade process"); } finally { if (bHasError == true) { try { autoUpdater.RollBack(); } catch (Exception) { //Log the message to your file or database } } } #endregion
使用就是这么简单,更详细的操做,你们能够下载源码,也正由于它的简单,因此你们能够对其修改以知足具体项目的需求。
六. 具体效果
当咱们运行主程序(WinForm或者WPF),若是服务器上有最新的版本,就会弹出以下页面进行提示并让用户选择是否更新。
图4
当用户不须要更新时,能够选择Skip按钮跳过并继续主程序流程,反之则进入以下页面。
图5
在下载的过程当中,用户能够选择Cancel中止下载并从新回到主流程。
七. 维护与下载
该组件已经托管到CodePlex,因此你们能够到上面下载其源代码,具体地址:http://autoupdater.codeplex.com/
图6
八. 总结
咱们这篇文章简单的讲解了一个简单的自动更新组件,因为它比较简单并且功能单一,因此没有花费大量的篇幅进行论述,感兴趣的读者能够下载其源码。后面我会把本身开发的一套MVVM框架也托管上去,因为目前对Silverlight的支持还不太好,因此正在持续作相关的改进,其中借鉴了一些其余优秀框架的思想而且融入了一些实际应用场景,因此到时也但愿你们可以多多指教!