Updater application block简称UAB,是Microsoft patterns & practices(模式&实践组)早期开发的一个自动更新的组件,在Click-Once(.net 2.0)之前发布的,所以最新的版本也到2.0号就就停止更新了。
UAB使用了"推模式"的自动更新,在无需用户的干预下发布新版本的更新;
保持应用程序总是最新版本
用户可以使用多个插件
保持数据文件总是最新版本
为应用程序添加自我更新功能
使应用平滑升级到ClickOnce(.NET 2.0)使应用平滑升级到ClickOnce(.NET 2.0)
有效利用带宽
进行复杂升级
更简单的公共API
客户端更新方法4行代码搞定客户端更新
// Get the updater manager
ApplicationUpdaterManager updater = ApplicationUpdaterManager.GetUpdater();
// Check Version
manifests = updater.CheckForUpdates();
// update the application as per manifest details.
updater.Download(manifests, TimeSpan.MaxValue );
// Activate process.
updater.Activate( manifests );
新加入的事件机制是应用程序可以为更新的各个阶段加入自定义动作
updater.DownloadStarted +=new DownloadStartedEventHandler(updater_DownloadStarted);
updater.DownloadProgress += new DownloadProgressEventHandler(updater_DownloadProgress);
updater.DownloadCompleted += new DownloadCompletedEventHandler(updater_DownloadCompleted);
updater.DownloadError += new DownloadErrorEventHandler(updater_DownloadError);
updater.ActivationInitializing += new ActivationInitializingEventHandler(updater_ActivationInitializing);
updater.ActivationStarted += new ActivationStartedEventHandler(updater_ActivationStarted);
updater.ActivationInitializationAborted += new ActivationInitializationAbortedEventHandler(updater_ActivationInitializationAborted);
updater.ActivationError += new ActivationErrorEventHandler(updater_ActivationError);
updater.ActivationCompleted +=new ActivationCompletedEventHandler(updater_ActivationCompleted);
支持部分更新
选择你要更新的文件
使用事件监控下载过程
支持Windows Installer
清单、下载器和激活模块
图形化管理工具
Updater Management子系统
– ApplicationUpdaterManger
– RegistryManager
– UpdaterTask
Manifest Management子系统
Downloader子系统
Activation子系统
整个更新过程非常简单:
1. 应用程序通过ApplicationUpdaterManager检测是否有更新
2. ApplicationUpdaterManager使用ManifestManager下载XML清单
3. DownloadManager使用BITSDownloader传输文件
4. ActivationManger使用ActivationProcessor激活文件版本
由于自带更新不支持更新文件目录树,原因我也猜到因为在服务端是通过IIS发布的以http的方式下载,故不支持文件目录;平时更新windows form应用程序,目录结构相对比较简单,但是如果更新Web应用程序,目录结构就相对复杂,基本会包含几层目录,因此使用它原本自带的更新功能几乎不能实现。
解决这个问题我想到的思路有:
1 重写IDownloader方法,新建一个FTPDownloader,采用FTP的GET命令可以获取目录的下载,重写类可以参考BITSDownloader.cs,或是参考网上有人开发一个httpDownloader;
2使用MSI下载后安装更新,但是需要人参与更新点Next
3 采用winzip打包压缩后,下载到本地,然后解压到目标路径下,这样做既可以很好的利用网络贷款,又解决了多文件目录覆盖更新。
要采用第三种方案,就必须自定义开发一个Decompress Files ActivationProcessor,用于解压下载的文件到指定的目录;
.net下操作winzip,Gzip文件的使用开源的ICSharpCode.SharpZipLib.dll 版本为8.5可以很方便的解压/压缩文件,文件目录
UAB自身已经提供了很多ActivationProcessor
通过类名就可以知道这些类的功能,我就不在说明了
随便打开一个类库可以发现都是通过实现IActivationProcessor
新建一个UnZipProcessor
解压代码
扩展UnZipProcessor编辑UI
解压的zip文件,解压的路径两个参数
创建扩展参数类UnZipProcessItem
代码如下
扩展UI编辑页面UnZipProcessorEditor.cs
代码如下
注册新开发的组件
OK