开发者社区> 老朱教授> 正文

版本的自动更新

简介:
+关注继续查看



本文转自高海东博客园博客,原文链接:http://www.cnblogs.com/ghd258/archive/2005/10/22/259708.html,如需转载请自行联系原作者

除了在软件架构设计中需要规划好各功能项以备分别可以实现局部升级外,重要的是配置好自动升级组件。然而该自动升级组件并非直接引用即可,它需要遵守一定的规则部署才能完成自动升级。以下给出它的配置手册。 必备的文件清单:

文件名

功能描述

AppStart.exe

类似中介代理的程序,由它来启动真正的应用程序。不直接启动主应用程序是为了防止主应用程序升级的过程中被锁死而造成升级失败。

AppStart.config

AppStart.exe的配置文件,它指定要启动的应用程序所在目录,以及要启动应用程序的名称

appupdater.dll

最重要的部件,自动升级的主要组件

system.Resources.dll

资源文件

mscorlib.Resources.dll

核心资源文件

UpdateVersion.xml

服务器端版本升级配置文件

自动升级配置:

注意事项

1.  因为自动升级组件appupdater代码里写死的原因,AppStart.configAppStart.exe是不能改名的!

2.  服务器端最好使用Windows 2000 Server .  使用Windows 2003 Server 会因为网络安全策略造成访问不了服务器目录资源,升级失败。

3.  服务器端需要把提供升级的该站点配置为允许目录浏览。

4.  文件的层次结构必须如下配置: 
客户端执行程序目录结构如下

AppStart.exe   (不能改名)

AppStart.config (不能改名)

ClientExe  (这个目录名称可以自定,但必须同时修改AppStart.configAppFolderName项内容)

 

 

TrySmartClient.exe(这个是自定的主应用程序)

 

 

appupdater.dll (自动升级组件)

其中AppStart.config内容如下:

<Config>

  <AppFolderName>ClientExe</AppFolderName>

  <AppExeName>TrySmartClient.exe</AppExeName> 

</Config> 
AppStart.config解释:

<AppFolderName>ClientExe</AppFolderName>

告诉AppStart.exe要寻找的主应用程序目录名称。 
<AppExeName>TrySmartClient.exe</AppExeName>

告诉AppStart.exe要寻找的主应用程序名。

服务器端目录结构(该目录需要设置为允许目录浏览):

UpdateVersion.xml (必须,不能改名)

Ver  (可自定,但必须同时修改UpdateVersion.xmlApplicationUrl项内容)

 

 

TrySmartClient.exe  (新版本主应用程序)

 

 

mscorlib.Resources.dll (资源文件)

 

 

system.Resources.dll(资源文件)

 其中UpdateVersion.xml内容如下:

<VersionConfig>

    <AvailableVersion>6.0.0.0</AvailableVersion>

    <ApplicationUrl>http://YourServerDomainName/SmartServer/Ver/</ApplicationUrl>

</VersionConfig>

 UpdateVersion.xml解释:

<AvailableVersion>6.0.0.0</AvailableVersion>

告诉客户端目前可用的版本,客户端appupdater组件会比较本地主应用程序版本号和该项配置的版本号,如果比本地的版本号更高,则进行下载更新。

 <ApplicationUrl>http://YourServerDomainName/SmartServer/Ver/</ApplicationUrl>

告诉客户端到哪个网址进行下载更新

按上述目录结构和配置文件内容,appupdater组件的关键属性配置应该如下:

AutoFileLoad

:True

ChangeDetectionMode

ServerManifestCheck

UpdateUrl

http://YourServerDomainName/SmartServer/UpdateVersion.xml

 appupdater组件关键属性配置解释:

AutoFileLoad = true  //允许自动文件装载

ChangeDetectionMode ServerManifestCheck  //检测模式:根据配置文件进行检测,也就是UpdateUrl属性指定的文件。

UpdateUrl :指定自动升级组件检测服务器端升级配置文件统一资源定位位置和文件名。(也就是网址)

 上述配置在.Net Framework 1.1 Windows2000下测试通过appupdater自动升级组件下载地址:http://c2c.6688.com/updateDown/appupdater.rar

 现在我们来将它应用在实例中。

第一步:建立应用程序来进行更新

在这一步我们将建立应用程序来演示如何实现自动更新。

1.        使用VS.NET生成一个新的Windows应用项目,命名为“SampleApp”。

2.        给窗体一个你选择的有趣的背景色。我们将使用背景色来与后面更新的版本区别。

3.        现在让我们给这个应用程序增加一个细微的功能,首先给你的窗体增加一个按钮。压缩文件中包含一个拥有简单Windows窗体的程序集。给压缩文件中Samples\SampleApp\SimpleForm程序集增加一个引用。然后在你的按钮事件句柄中添加两行代码:

    SimpleForm.Form1 F = new SimpleForm.Form1();

    F.Show();

4.        将你的build标志从debug转换为RELEASE。这将允许我们避免稍后当我们生成一个应用程序的新版本而同时原始拷贝正在运行产生的pdb文件锁定问题。

生成并测试你的应用程序。

第二步:添加.NET应用程序更新组件

在这一步我们将给SampleApp添加.NET应用程序更新组件。

1.        VS.NET工具栏的组件标签上,右击选择“自定义工具栏”。选择‘.NET框架组件’标签。点“浏览”并选择位于压缩文件中AppUpdater项目下的AppUpdater.dll,单击OK

2.        一个AppUpdater图标现在应该出现在工具栏的组件列表的底部。将AppUpdater组件拖放到SampleApp窗体上。一个名为appUpdater1.NET应用程序更新组件的实例会出现在窗体的底部。

第三步:设置.NET应用程序更新组件  

在这一步我们将设置.NET应用程序更新组件。注意这个示例你只需改变最开始的四个属性,其它的,默认值就够了。

AppUpdater  属性 ――这是.NET Application应用程序更新的核心,对于本程序需要做以下设置:

属性名称

描述

AutoFileLoad

这个控制后面要描述的命令下载特征,现在将它设置为true

ChangeDetectionMode

 

 

该枚举决定如何为更新进行检查。在该例中,我们将使用一个服务器显式检查,因此将这个值设置为“ServerManifestCheck”。

ShowDefaultUI

 

 

.NET应用程序更新组件具有一系列用户界面来通知用户一些事件,对于该例我们将使用默认的用户界面,因此将这个值设置为true

UpdateUrl

 

 

UpdateUrl是决定更新程序到何处去寻找更新的。在该例中设置为服务器显式文件的URL

http://yourWebserver/SampleApp_ServerSetup/UpdateVersion.xml. 

用你的Web服务器名称来代替”yourWebserver”

 

 

Downloader 属性――AppUpdater组件有两个子组件。第一个称之为Downloader,它控制组件的下载和安装。下面是该属性的描述,对于我的示例来说默认的属性值就能工作的很好。

属性名称

描述

DownloadRetryAttempts

 

 

在下载期间如果有错误发生(比如Web服务器宕机)downloader会稍后重试。这个属性控制downloader认为是彻底的应用程序更新错误之前重试网络请求的次数。

SecondsBeteweenDownloadRety

重试网络请求之前等待的秒数。

UpdateRetryAttempts

这个属性控制试图更新的次数。

ValidateAssemblies

 

 

这个属性控制下载程序集有效完成的级别。更多信息参见这篇文章的安全一节。

 Poller 属性――AppUpdater的第二个子组件是PollerPoller控制更新检查。下面是该属性的描述,对于我们的示例而言,所有的默认属性值就工作的很好。

属性名称

描述

AutoStart

 

 

布尔值,在应用程序启动时控制Poller是否应当开始轮询或它是否应当等待直到有计划的显式开始。

DownloadOnDetection

布尔值,控制Poller在一个新的更新发现时是否立即开始下载更新,或者是否通过调用DownloadUdpate()方法必须开始显式下载。

InitialPollInterval

应用程序启动后在第一次执行更新检查前等待的秒数。

PollInterval

 

 

第一次更新检查之后,PollInterval控制后续每次更新检查之间间隔的秒数,注意:默认为每30秒进行一次检查。

 所有这一切完成之后,你的属性表格看起来应当是下面这个样子:Samples\SampleApp\SampleApp_Complete目录包含应用程序正确安装的一个版本。

第四步:生成并在客户端部署应用程序V1版本。

在这一步我们将生成应用程序V1版本并将它部署在客户端。

SampleApp项目中,打开AssemblyInfo.cs文件。将AssemblyVersion的值从“1.0”修改为“1.0.0.0.这会引起在生成程序集时获得值为“1.0.0.0的标记,该标记代替VS.NET通常指定为递增的值。

1.        生成应用程序。

2.        从压缩文件中将Samples\SampleApp\SampleApp_ClientSetup目录拷贝到你的本地机器上。要注意SampleApp_ClientSetup目录已经包含了AppStart.exeAppStart.config已经设置为指向1.0.0.0目录并且启动SampleApp.exe

SampleApprelease生成目录下拷贝SampleAppAppupdater.dllSimpleForm.dllSampleApp.exe)到你客户端的SampleApp_ClientSetup\1.0.0.0目录下。

在这个时候,一个功能完整的应用程序版本应当被“安装”到了客户端,可以通过运行AppStart.exe来执行。

第五步:安装Web服务器

在这一步我们将安装Web服务器以在轮询应用程序更新时使用。.NET应用程序更新组件使用HTTP-DAV来下载应用程序更新因此需要一个支持HTTP-DAVWeb服务器。Windows 2000上的IIS5.0和更新的操作系统都支持HTTP-DAV

1.        从压缩文件中将Samples/SampleApp_ServerSetup目录拷贝到你的Web服务器上的wwwroot目录下。

2.        为了完整,将SampleAppV1版本拷贝到Web服务器的1.0.0.0文件夹。

3.        在你的Web服务器上为SampleApp_ServerSetup目录启用IIS的“目录浏览”。

第六步:自动更新应用程序

OK,现在是时间来通过自动安装一个新版本来看看以上这些艰苦工作的结果了。

1.        如果你部署在客户端的SampleApp版本没有运行,加载它让它运行。记得使用AppStart.exe

2.        回到VS.NET并在SampleApp窗体中做一些可以被注意到的修改(比如修改背景色)。

3.        AssemblyInfo.cs的版本信息修改为2.0.0.0

4.        重新生成。

5.        回到Web服务器并生成一个和1.0.0.0目录同等的目录2.0.0.0。从release生成目录下将新版本应用程序拷贝到Web服务器上新建的2.0.0.0目录下。

6.        打开UpdateVersion.xml并修改AvailableVersion2.0.0.0。修改ApplicationURL为指向新的2.0.0.0路径。

7.        保存对UpdateVersion.xml所做的修改。

一旦你保存了新的UpdateVersion.xml,在30秒之内,运行中的SampleApp拷贝将会探测到新的可用的版本。SampleApp将下载新版本,实现更新,并弹出默认的用户界面询问用户是否希望重启并立即开始使用新版本。单击“Yes”回应该对话框。SampleApp将会重启并运行新版本。如果你查看客户端SampleApp的部署,你会注意到现在在原始的1.0.0.0的目录后有一个2.0.0.0的目录。1.0.0.0目录将会在下一次更新发生时被清空。

 

如果由于某种原因,你无法使得.NET应用程序更新器工作。在你深入调试之前确定以下几点,你遇到的问题很可能就是如下之一:

• 你是否将IIS目录浏览给打开了?如果没有,更新器将不会下载安装任何文件。

• 你是否正确的部署了一切并正确设置了URL

• 如果你的应用程序安装在program files目录下,确定你是该机的超级管理员或超级用户吗?如果不是,你将不会有写权限来更新应用程序。

• 你是在应用程序的主用户界面线程中生成AppUpdater对象的吗?如果不是,更新器将不能显示用户界面并且在激发事件回到用户界面时失败。

• 是否更新成功,但应用程序使用新的更新自动重启时失败?.NET应用程序更新组件试图通过调用Application.Exit方法来重启应用程序。然而,该方法并不能保证关闭一个应用程序。如果你生成并遗留了单独的线程在运行,该方法就无法关闭进程。保证所有线程终止的解决的方案是通过调用Application.OnExit事件,或者挂钩.NET应用程序更新器的OnUpdateComplete事件并自己处理关闭。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
11560 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
11535 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
8268 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
16697 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
18897 0
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
34093 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
20661 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
23786 0
+关注
3546
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载