博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

TaskVision更新模型

Posted on 2008-10-05 15:03  a-peng  阅读(3173)  评论(9编辑  收藏  举报

(一)、引言
这学期有一门课:《Structs实用开发指南--基于MVC+MyEclipse的Java Web应用开发》,上课的老师人挺好。
由于老师是介绍Web开发,所以第一节课理所当然的夸奖一下Web开发,批评一下Windows开发。
B/S部署方便,当程序需要更新,只需在服务器上更新程序。
C/S部署麻烦,当程序需要更新,需要到所有客户端那去更新程序,老师甚至道出亲身经历,当初在一家公司上班,需要到很多用户那去部署公司的产品,那个累啊,后来程序需要更新,又得到每个用户那跑一趟。

我深深的同情老师的劳累,但我很想对老师说:其实现在C/S的部署早已经不是问题,腾讯QQ,迅雷,傲游,千千静听等等,都提供了当服务器出现新版本软件时都会提示用户下载。

(二)、预备知识
既然那些软件可以做到,当然我们也可以。
在.Net中,可以使用ClickOnce与AppUpdater。
TaskVision中使用AppUpdater来完成自动更新,所以我们这里主要介绍AppUpdater。

AppUpdater是开源的,下载地址:http://windowsforms.net/downloads/GDN/dotnetupdater.zip
包含AppUpdater源码,使用例子,及文档。

小菜的这篇文章有意义吗?有,因为我是小菜,所以我能以小菜的目光看问题。
Google下AppUpdater,出现的结果基本一样,国内的Copy太强了。原创的文章有的还不在第一篇。。。唉!

(三)、完成效果
先看下完成后的效果,有助于提起我们的兴趣。

情节:客户端安装了TaskVision1.0 程序。我们在服务端发布新版本程序TaskVision2.0,客户端自动检测到更新,提示下载,下载,运行新程序。

运行客户端程序:
 image
间隔15秒左右,弹出检测到新版本TaskVision窗口,我们可以更改该间隔时间,之后会提到。
image
点击否则不进行下载,点击是进行下载。
image
新版本程序已经下载到本地,点否不启动新程序,点是启动新程序。
image 

代码下载:https://files.cnblogs.com/a-peng/SmartClient_Chapter01.rar

(四)、分析

注意:以上内容是小菜定制的,所以你在TaskVision源码中是找不到的。

我们的程序需要使用到的文件(都可以在dotnetupdater.zip压缩包中找到)

客户端使用到的文件
1、AppUpdater.dll(客户端自动更新核心组件)
2、AppStart.exe(类似中介代理的程序,由它来启动真正的应用程序。不直接启动主应用程序是为了防止主应用程序升级的过程中被锁死而造成升级失败)
3、AppStart.config(AppStart.exe的配置文件,它指定要启动的应用程序所在目录,以及要启动应用程序的名称)
代码如下:

<Config>
  
<AppFolderName>1.0.0.0</AppFolderName>
  
<AppExeName>TaskVision.exe</AppExeName>
  
<AppLaunchMode>process</AppLaunchMode>
</Config>

既启动AppStart.exe将会启动1.0.0.0文件夹下的TaskVision.exe程序。

服务端使用到的文件
4、UpdateVersion.xml
代码如下:

<VersionConfig>
    
<AvailableVersion>2.0.0.0</AvailableVersion>
    
<ApplicationUrl>http://localhost/TaskVisionUpdates/2.0.0.0/</ApplicationUrl>
</VersionConfig>

既服务器可用版本为2.0.0.0,路径为http://localhost/TaskVisionUpdates/2.0.0.0/

我们在主窗体中拉入AppUpdater组件,设置属性如下:
image 
Downloader(下载)和Poller(服务器轮寻)来AppUpdater的两个子组件。
Poller.InitialPollInterval表示初始化轮寻服务器时间为15秒,每次间隔30秒轮寻,在实际应用中我们会把这个值设高一些。
ShowDefaultUI设为false既不使用默认提示更新界面。

AppUpdater指定了ChangeDetectionMode(更改更新模式)为ServerManifestCheck(检查服务器清单,也就是检查UpdateUrl指定的文件UpdateVersion.xml)
如果UpdateVersion.xml配置文件中的有效版本号<AvailableVersion>2.0.0.0</AvailableVersion>比本地应用程序的版本号更高,则说明有新版本。

AppUpdater的事件有如下三个。
image
OnUpdateDetected表示当检测到新版本时触发。

private void appUpdater_OnUpdateDetected(object sender, System.EventArgs e)
{
    
string message = "检测到新版本TaskVision,是否下载新版本TaskVision.";

    
if (MessageBox.Show(message, "检测到新版本TaskVision", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
    
{
        appUpdater.DownloadUpdate();
    }

}

OnUpdateComplete表示当更新完成时触发。

private void appUpdater_OnUpdateComplete(object sender, Microsoft.Samples.AppUpdater.UpdateCompleteEventArgs e)
{
    
if (e.UpdateSucceeded)
    
{
        
string message = "更新完成,是否启动新版本TaskVison?";

        
if (MessageBox.Show(message, "更新完成", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
        
{
            appUpdater.RestartApp();
        }

    }

    
else
    
{
        
string message = "更新失败,下一次程序启动时重新尝试更新.";
        MessageBox.Show(message, 
"更新失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

}


(五)、常见问题
问题1:
服务器版本为1.0.0.0与2.0.0.0,本地应用程序版本为1.0.0.0,更新后下载到本地应用程序版本为1.0.0.0_1,而且程序与1.0.0.0中的程序相同?
  这个问题的原因,在于你没有在IIS中将站点TaskVisionUpdates设为目录浏览。

问题2:服务器版本为1.0.0.0与2.0.0.0,本地应用程序版本为1.0.0.0,更新后下载到本地应用程序版本为1.0.0.0_1,程序是新版本?
  这个问题的原因,在于你没有把新版本程序的AssemblyInfo.cs中的[assembly: AssemblyVersion("1.0.0.0")]和[assembly: AssemblyFileVersion("1.0.0.0")]更改为新版本:[assembly: AssemblyVersion("2.0.0.0")]和[assembly: AssemblyFileVersion("2.0.0.0")]

问题3:没有同意下载新版本程序,然后新版本程序已经被下载到本地?
  你必须将AppUpdater组件的属性
Poller.DownloadOnDetection (直接下载新版本程序)设为 false。

问题4:会提示缺少system.Resources.dll  与 mscorlib.Resources.dll 这两个文件?
  你可以通过设置AutoFileLoad设为False避免。
  
  这两个文件都是系统文件为何会缺失呢,而且英文用户不会出现这个问题?
  因为中文用户它们所在的目录是:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\zh-CHS 你会发现这个目录下没有这两个文件。
  英语用户他们使用已经打包在系统 dll 中的默认资源,所以可以找到这两个文件。

(六)、后记
不过可惜,不知道如何使用AppUpdater完成进度条更新效果。 高手请指点!

不过发现另一款开源更新组件SmartAssembly支持,图片上有进度条更新效果,等有时间再试试。
http://www.codeproject.com/KB/dotnet/SmartAssembly.aspx

*************************************************************************
作者:a-peng
出处:
http://a-peng.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出
原文连接,否则保留追究法律责任的权利。
*************************************************************************