Net中自动升级组件的配置手册

来源:互联网 发布:js下拉列表 编辑:程序博客网 时间:2024/04/27 21:47

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

 

必备的文件清单:

文件名

功能描述

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
翻译中文如下:
 
Updater Application Block
1.       概述
当你的应用程序需要自动升级新组件,或者当你正在编写某项服务以向客户机器提供到各种应用程序的升级时,你需要使用它。
它是一个能够被用来将新版本应用程序下载到客户机器上(例如使用BITS)的组件。它包括一个声明,用来指定所有相关的文件,并确保整个应用程序都被下载下来了。它对自定义的下载提供了可选的文件验证和支持,还提供了验证组件。它使用异常管理块。
智能升级、自动更新,这是我们以前开发Windows应用程序时经常碰到而且必须注意的问题。在.NET应用程序更新组件没有出现之前这个问题曾经令人非常头疼(除非你就不打算进行升级)。谁又不希望自己开发的应用程序象Windows XP自身那样具备自动更新的功能呢?使用.NET应用程序更新组件将会使这一切变得非常简单
2.功能说明:
    2.1为 .NET Framework 应用程序实现基于“拉”机制的更新解决方案。
2.2 使用加密验证技术,在使用应用程序更新之前验证它们的真实性。
2.3 在没有用户干预的情况下执行后部署配置任务。
    2.4 帮助您编写能够自动将其本身更新为可用的最新版本的应用程序。
 3.所包含的组件:
3.1.Microsoft.ApplicationBlocks.ApplicationUpdater
核心组件
3.2.Microsoft.ApplicationBlocks.ApplicationUpdater.Interfaces
作为开发者在更新应用程序块的基础上用来自定义更新程序解决方案的接口
3.3.AppStart
用来开启将要更新的应用程序(可以看作一个发射器),
3.4.ManifestUtility
WinForm为基础的更新目录,管理可以用来产生应用程序的更新文件
3.5.Microsoft.ApplicationBlocks.ExceptionManagement
异常管理
3.6.Microsoft.ApplicationBlocks.ExceptionManagement.Interfaces
异常管理提供的接口
4.ApplicationUpdate组件类
4.1.核心类:
用来控制查询,下载,验证,后台更新处理进程.
4.1.1ApplicationUpdate更新程序的根对象,负责开启和管理在配置文件中的每一个应用程序的线程列表.
DownloadManager 在此执行.并且更新程序中提供公共的API,允许控制程序控制应用程序的更新
4.1.2.DownloadManager
管理查询,下载,验证,后台更新处理进程.
       4.2.Downloader
Downloader类继承IDownloader接口使能够互相复制文件.
4.2.1.BITSDownloader
 Background Intelligent Transfer Service (BITS):后台智能传输服务
下载工具使用后台智能传输服务通过HTTP链接复制文件
4.2.2.BITS Interop wrappers
包含了后台智能传输服务API(BITSDownloader类去初始化和关列后台智能传输服务的复制工作)
4.3.Validator
继承IValidator接口,标记并检验应用程序表征和应用程序文件
4.3.1.KeyValidator
以对称密码为基础的验证器
4.3.RSAValidator
公有/私有RSA密码为基础的
4.结构体系图例
如图所示: Updater Application Block 的体系结构。

 

Updater Application Block
可帮助确保应用程序成功地完整安装。要执行事务性安装,你将需要包含相应的代码,以便除了执行自动更新以外,还检查是否已经在本地硬盘上安装了所有代码。这些代码的形式可以是一个清单文件以及用于确定该清单中的每个文件都在本地硬盘上的代码。
5.使用方法
5.1. 为更新做检查
为了更新自身,应用程序首先需要做的就是弄清楚可使用的更新放在什么地方。为做到这一点,应用程序需要知道三件事情:
5.1.1到什么地方为更新做检查;
应用程序更新组件使用HTTP进行所有的网络通讯。这就允许通过企业网或外网来更新应用程序。这样的话进行更新检查所需要的地址就成了已知的Web服务器的一个URL地址。
 
5.1.2什么时候进行更新检查;
.NET应用程序更新组件在组件生成的基础上产生一个线程,该线程负责进行更新检查。该线程在大多数时间处于休眠状态,但会在设置好的间隔苏醒并实现一次更新检查。应用程序为新的更新所做的检查的频率依赖于各应用自身。但是进行更新检查的间隔常用值的范围一般是从一个小时到几天。对于所有的应用程序,这种轮询的基本方法并不都合适。比如Microsoft Money只是在用户让它去进行更新检查时它才去检查。在这种情况下,更新轮询线程可被禁用,通过用命令调用更新组件的CheckForUpdate()方法来实现更新检查。
 
5.1.3.如何进行更新检查:
直接文件检查----通过检查来更新最简单的方法是使用HTTP来比较服务器和客户端的应用程序的最后的修改日期/时间戳是否一致。如果服务器上有更新的文件,客户端就知道是时间更新自己了。对于Web浏览器来讲,也是同样的道理,它知道是否需要重新下载一个html页面或图片还是是否可以重复使用先前已下载的。对于管理员来说这当然是最简单的。当应用程序有一个新的版本可用时,管理员简单的拷贝一个更新的版本来覆盖Web服务器上的旧版本。这种方法的问题在于更新不是自动进行,由此会出现潜在的失败窗体。比如,如果管理员在更新Web服务器上的应用程序版本,同时有个客户在下载更新之前的版本,那么这个客户的计算机上就会既存在更新之前的一些文件,也存在更新之后新版本的一些文件。基于上述原因,对于重要的应用程序不提倡使用直接文件检查来更新。
 
显式检查----为解决直接文件检查存在的原子问题,有必要进行一定级别的间接检查。为产生一间接级别,在服务器上使用一个显式的文件。一个可和.NET应用程序更新组件使用的有效的服务器显式文件大致是这个样子:
<VersionConfig>
<AvailableVersion>1.0.0.0</AvailableVersion>
<ApplicationUrl>http://localhost/demos/selfupdate/V1/</ApplicationUrl>
</VersionConfig>
 
AvailableVersion指定最新的可用程序集的版本号。ApplicationURL属性指定该版本应用程序所在的URL地址。当管理员想要更新客户端应用程序时,他们就会将应用程序的新版本拷贝到Web服务器上并且适当的修改服务器显式文件。客户端自身会探测到服务器显式文件已被修改,然后下载显式文件。客户端随后比较显式文件中指定的程序集版本号与应用程序EXE文件的版本号。如果服务器显式文件中的可用版本号较新,应用程序就知道是时间实现更新了。这种方法没有前一种方法的原子问题,对大多数应用程序而言是推荐使用的方法。
 
XML Web Service 检查----XML Web Services提供一种更高级的更新检查的方式。比如,假定你希望在转出更新你的其他用户之前先对一系列早期用户进行更新,如果客户端应用程序调用一个XML Web Service来检查一项更新是否可用,那个XML Web Service还可以在数据库中查询该用户并判断该用户是否是早期用户。如果他们是早期用户,XML Web Service就返回一个值表示更新可用。如果不是,Web Service就返回一个值表示更新不可用。因为采用Web Service为更新做检查能够根据客户端所希望的功能采取许多形式,.NET 应用程序更新组件并不提供直接XML Web Service支持。采用XML Web Service来进行更新检查,首先建立XML Web Service并挂钩OnCheckForUpdate事件。这样就允许你自己的自定义检查代替轮询者线程更新检查。OnCheckForUpdate事件有一个返回值,该值表示更新是否被检测到。
 
 
5.2相关参数的设置及操作
5.2.1参数的设置介绍
.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秒进行一次检查。
 
5.2.2所有这一切完成之后,包含应用程序正确安装的一个版本。Samples/SampleApp/SampleApp_Complete目录下
 
5.2.3生成并在客户端部署应用程序V1版本。在这一步我们将生成应用程序V1版本并将它部署在客户端。
SampleApp项目中,打开AssemblyInfo.cs文件。将AssemblyVersion的值从“1.0”修改为“1.0.0.0”.这会引起在生成程序集时获得值为“1.0.0.0”的标记,该标记代替VS.NET通常指定为递增的值。
生成应用程序。
从压缩文件中将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来执行。
 
5.2.4:安装Web服务器
在这一步我们将安装Web服务器以在轮询应用程序更新时使用。.NET应用程序更新组件使用HTTP-DAV来下载应用程序更新因此需要一个支持
HTTP-DAVWeb服务器。Windows 2000上的IIS5.0和更新的操作系统都支持HTTP-DAV
从压缩文件中将Samples/SampleApp_ServerSetup目录拷贝到你的Web服务器上的wwwroot目录下。
. 为了完整,将SampleAppV1版本拷贝到Web服务器的1.0.0.0文件夹。
在你的Web服务器上为SampleApp_ServerSetup目录启用IIS的“目录浏览”。
5.2.5.自动更新应用程序
. 如果你部署在客户端的SampleApp版本没有运行,加载它让它运行。记得使用AppStart.exe
. 回到VS.NET并在SampleApp窗体中做一些可以被注意到的修改(比如修改背景色)。
AssemblyInfo.cs的版本信息修改为2.0.0.0
. 重新生成。
. 回到Web服务器并生成一个和1.0.0.0目录同等的目录2.0.0.0。从release生成目录下将新版本应用程序拷贝到Web服务器上新建的2.0.0.0目录下。
. 打开UpdateVersion.xml并修改AvailableVersion2.0.0.0。修改ApplicationURL为指向新的2.0.0.0路径。
. 保存对UpdateVersion.xml所做的修改。
一旦你保存了新的UpdateVersion.xml,在30秒之内,运行中的SampleApp拷贝将会探测到新的可用的版本。SampleApp将下载新版本,实现更新,并弹出默认的用户界面询问用户是否希望重启并立即开始使用新版本。单击“Yes”回应该对话框。SampleApp将会重启并运行新版本。如果你查看客户端SampleApp的部署,你会注意到现在在原始的1.0.0.0的目录后有一个2.0.0.0的目录。1.0.0.0目录将会在下一次更新发生时被清空。
 
5.3Smart Client开发使用AppUpdater组件
5.3.1使用AppUpdater组件要用到下面这些文件:可以在http://windowsforms.net/downloads/GDN/dotnetupdater.zip 中下载
AppStart.exe:类似中介代理的程序,由它来启动真正的应用程序。不直接启动主应用程序是为了防止主应用程序升级的过程中被锁死而造成升级失败。
AppStart.config AppStart.exe的配置文件,它指定要启动的应用程序所在目录,以及要启动应用程序的名称
appupdater.dll :最重要的部件,自动升级的主要组件
system.Resources.dll 资源文件
mscorlib.Resources.dll :核心资源文件
UpdateVersion.xml 服务器端版本升级配置文件
 
       5.3.2使用
        .Custom Control中导入AppUpdater
.配置自动下载选项
AutoFileLoad      :True
ChangeDetectionMode      ServerManifestCheck
UpdateUrl      http://YourServerDomainName/SmartServer/UpdateVersion.xml
ShowDefaultUI: True
AutoFileLoad 可以让服务器上的文件动态加载,大家可以把它想像成 Un-Touch 部署中的Assembly.LoadFrom类似的功能
ChangeDetectonMode是设置检测模式:根据配置文件进行检测,也就是UpdateUrl属性指定的文件。如果设成DirectFileCheck则是比较每一个文件的时间戳来决定要不要下载这个文件。
UpdaterUrl指服务器上的更新配置文件,其中UpdateVersion.xml内容如下:
<VersionConfig>
      <AvailableVersion>2.0.0.0</AvailableVersion>
      <ApplicationUrl>http://YourServerDomainName/SmartServer/Ver/</ApplicationUrl>
</VersionConfig>
UpdateVersion.xml解释:
<AvailableVersion>2.0.0.0</AvailableVersion>
告诉客户端目前可用的版本,客户端appupdater组件会比较本地主应用程序版本号和该项配置的版本号,如果比本地的版本号更高,则进行下载更新。
<ApplicationUrl>http://YourServerDomainName/SmartServer/Ver/</ApplicationUrl>
告诉客户端到哪个网址进行下载更新
建议把这个属性设置成Dynamic,即从配置文件中读出来,不过,要让服务器的.config文件允许被下载,还要在IIS ASP.net应用程序”配置“中对它进行设置,默认是不允许访问的。
ShowDefaultUI表示下载结束时用一个简单的界面提示你要不要启动新版本。你还可以用自己的窗体显示,方法是设成False,并在OnUpdateComplete事件中写代码把你的窗体显示出来。
当然,还有一些其他的属性,比如,是否要使用公钥(可以是一个,也可以提供一个Assembly,里面包括多个公钥)验证要下载的文件。
使用AppStart.exe启动实际的应用程序。
IIS把下载文件夹设成允许目录浏览,因为AppUpdater要枚举里面的所有文件,并把它们都下载到本地。如果是Windwos 2003,麻烦一点,要允许WebDAV,并把.config文件设置成允许下载。
做个msi安装文件,打包应用程序,这样,当应用程序运行时,它就能自动判断有无最新版本,并下载到本地运行。
 
6.注意事项:
6.1如果为安装应用程序只需要修改文件系统,则 Xcopy 方法可能是最佳选择。但是,因为您无法对安装过程进行编程控制,所以 Xcopy 方法不允许您执行下列操作:
6.1.1将程序集部署到全局程序集缓存(以及维护引用)
6.1.2部署 COM 对象
6.1.3部署要求注册或者进行其他注册表更改的组件
6.1.4 Windows 外壳程序集成
6.2您还可以在 Windows 资源管理器中使用拖放操作将共享程序集移动到全局程序集缓存文件夹中。但是,您应该避免使用该方法,因为该方法没有实现引用计数。没有引用计数,其他应用程序的卸载例程可能导致您的应用程序所需的程序集被从全局程序集缓存中删除。
6.3Downloader.cs中的Scavenge方法,清除非装载组建目录,将应用程序目录下的非装载Assembly的目录全部都删除了
如果不想非装载组建目录被去处,则修改为:
if(Directory.Name.ToLower() == "appupdater") {//HardDirectoryDelete}
如果更新服务器是windows2003,记得设置WEB_DAV为允许。