实现.NET应用程序的自动更新(2)

2008-02-22 09:33:19来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  (三) 实现更新

  .NET应用程序更新组件通过将下载和更新过程分为单独的两个阶段来获得健壮性。当每一阶段都完成时,在位于客户端应用程序目录下的一个更新显式文件(manifest file)中记载下来。如果下载或更新任何一个阶段中的过程被打断,它就会在下一次应用程序启动时从上一次完成的断点继续原来的工作。每一阶段都可以重新运行,因此如果在一个阶段中间出现失败,重新运行该阶段就可以成功。如果有错误发生,比如在下载过程中与服务器的链接丢失,.NET更新组件将会在稍后重试。如果报告了非常多的错误(例如web服务器再也没有回到在线状态),下载和更新将会被放弃并且报告出错误。

  我们的第一个方法是简单地启动一个单独的进程来实现更新。这个单独的进程将会首先关闭应用程序进程,实现更新(因为这时候已被解锁),重启应用程序进程并且在完成之后关闭自己。因此,这种设计存在三个基本的问题:

  . 在某些情况下它不起作用。在更新应用程序时,更新进程关闭原始的应用程序进程,更新进程自身也要被关闭,因此也就不会实现更新。

  . 我们希望能够自动更新所有要实现更新的代码。我们希望自动安装修补的能力不仅仅发生在应用程序上,而且.NET应用程序更新组件自身也可以。使用这种模式,我们不能更新实现更新的进程。

  . 强制用户关闭应用程序并在使用过程中等待,这是很不礼貌的。

  用来实现应用程序更新的最后一种方法是使用.NET框架并行程序集模式。作为试图更新应用程序自身的替代方案,生成一个比目前存在版本新的应用程序版本。

  新版本可以通过合并目前现存的应用程序目录与下载的更新版本来生成。当新版本完成时,用户在下次重新打开应用程序时会自动使用新版本。原始应用程序的拷贝就可以被移除了。棘手问题是弄清在某个指定时刻哪个版本该被载入。我们介绍一个名称为Appstart的应用程
序。Appstart是进入你应用程序的入口点,使用这种模式,你的应用程序目录看起来是这个样子:..

--> Program Files

--> MyApp

--> Appstart.exe

--> Appstart.config

--> V1 Folder

--> MyApp.exe

--> V1.1 Folder

--> MyApp.exe

  要运行你的应用程序,你通常是启动Appstart.exe。如果你想在桌面上有个快捷键,那个快捷键必须应该指向Appstart而不是直接指向应用程序(注意,你可以重命名AppStart.exe 为任何你想要的名字,例如YourApp.exe)Appstart.exe是个非常简单的程序,它读取Appstart.config文件并且载入指定的应用程序。一个有效Appstart.config文件如下所示:

<Config>
 <AppFolderName>V1 Folder</AppFolderName>
 <AppExeName>MyApp.exe</AppExeName>
 <AppLaunchMode>appdomain</AppLaunchMode>
</Config>

  AppFolderName指定包含当前要运行的应用程序版本的子文件夹。AppExeName包含在那个文件夹下要载入的exe文件名。当一个应用程序更新完成时,最后一步就是修改AppFolderName的值为指向应用程序的新版本。这样,下次用户运行应用程序时,就会运行新的应用程序更新后的版本。AppLaunchMode指定如何加载应用程序。有两种方式加载应用程序:第一种方式是使用AppDomains。AppDomains是.NET框架公
用语言运行时的特性,也是独立的逻辑单元和管理对象。公用语言运行时允许每个进程中存在多个应用程序域。这样Appstart.exe就能够在单独的AppDomain中同时却是相同的AppStart.exe进程中加载你的应用程序。尽管事实是两个不同的exe 程序在运行(即Appstart.exe和MyApp.exe),但只有一个进程在使用。对于大多数应用程序AppDomains会工作得很好,当然,在一个单独的AppDomain中运行和在一个单独
的进程中运行还是有些细微区别的。在这种情况下,AppLaunchMode可以设置为“process”,这样就会使应用程序在单独进程中加载。

  一旦Appstart启动应用程序,它就会进入休眠状态等待应用程序终止。一旦应用程序终止,Appstart也会关闭。
三、实例演练

  前面我们讨论了.NET应用程序更新是如何工作的,现在我们来将它应用在实例中。

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

  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应用程序更新组件

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

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

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

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

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

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

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

  (3)ShowDefaultUI: .NET 应用程序更新组件具有一系列用户界面来通知用户一些事件,比如有一个新的更新可以使用了或者在更新期间发生错误等。这种用户界面可以通过设置默认的用户界面为无效而用自定义应用程序指定的用户界面来代替它,挂钩适当的事件(比如

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:.NET下正则表达式应用的四个示例

下一篇:使用asp.net进行多关键字查询的例子