|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你觉得数据库怎么样?程序 使用程序更新的办法一样平常有两种:一是关照用户(好比发E-mail),让用户到指定的网站地点下载更新的程序;二是将更新的职责从用户何处转移到使用程序本身,由使用程序本身代替用户猎取并安装一个软件的更新,客户端使用程序本身卖力从一个已知服务器下载并安装更新,用户独一必要举行干涉的是决意是不是乐意如今或今后安装新的更新。明显,后者比前者更友爱。你如今能够看到相似后一种办法的实践产物,好比WindowsXP和MicrosoftMoney。本文所先容的.NET使用程序更新组件就能够供应相似的功效。
1、.NET使用程序更新组件先容
.NET使用程序更新组件AppUpdater是利用.NET框架开辟的。只管AppUpdater不是微软的产物,可是只需你在VS.NET工具栏中增加了该组件,就能够象利用别的组件一样经由过程拖拽的体例将该组件从工具栏中拖放到你的使用程序中,并设置一些属性(好比猎取更新的地位、频次等)以后就能够使得你的客户端使用程序具有主动更新的功效。
2、事情道理
要深切了解.NET客户端使用程序更新组件的事情道理,必要细心研讨一下完成客户端使用程序更新有那些必需要做的事变。第一步必要做的是反省是不是有更新;当发明有更新时,入手下手第二步事情――下载更新;当更新下载完成时,举行是最初一步的事情――完成更新。
(一)为更新做反省
作为开辟者,起首你得告知使用程序到甚么中央往做更新反省,不然它岂不是要易如反掌?其次,断定什么时候做更新反省。不成能用户每次一运转客户端程序,而它就在背景一直的举行更新反省,那多华侈资本!最初另有一项主要的事变必要办理,那就是怎样举行更新反省。.NET使用程序更新组件利用HTTP举行通信,这就同意客户端使用程序穿透防火墙来举行更新。而且举行更新反省所必要的地点就成了已知的Web服务器的一个URL地点,第一个成绩顺遂办理。
.NET使用程序更新组件在组件天生的基本上发生一个线程,该线程卖力举行更新反省。该线程在年夜多半工夫处于休眠形态,但会在设置好的距离复苏并完成一次更新反省。使用程序为新的更新所做的反省的频次依附于各使用本身。举行更新反省的距离经常使用值的局限通常为从一个小时到几天。这类轮询的基础办法其实不合适于一切情形。好比MicrosoftMoney只是在用户让它往举行更新反省时它才往反省。在这类情形下,更新轮询线程可被禁用。
经由过程用命令挪用更新组件的CheckForUpdate()办法来完成更新反省。
关于怎样举行更新反省的办法有如许几种:
办法一:间接文件反省――利用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文件的版本号。假如服务器显式文件中的可用版本号较新,使用程序就晓得必要更新了。这类办法对年夜多半使用程序而言是保举利用的办法。
办法三:XMLWebService反省――XMLWebServices供应一种更初级的更新反省体例。好比,假定你但愿在举行更新你的其他用户之前先对一系列初期用户举行更新,假如客户端使用程序挪用一个XMLWebService来反省一项更新是不是可用,谁人XMLWebService还能够在数据库中查询该用户并判别该用户是不是是初期用户。假如他们是初期用户,XMLWebService就前往一个值暗示更新可用。假如不是,WebService就前往一个值暗示更新不成用。但本文先容的.NET使用程序更新组件其实不供应间接的XMLWebService撑持。
要接纳XMLWebService来举行更新反省,起首创建XMLWebService并挂钩一个OnCheckForUpdate事务。如许就同意你本人的自界说反省取代轮询者线程更新反省。OnCheckForUpdate事务有一个前往值,该值暗示更新是不是被检测到。
(二)下载更新
当.NET使用程序更新组件检测到一项新的更新可用时它会主动启动另外一个线程并入手下手异步背景下载更新。
下载利用HTTP-DAV来完成。DAV是一种扩大的HTTP,..它供应诸如目次和文件列举如许的功效。一项完全的下载历程始于指定一个URL。接纳URL来下载依附于完成更新反省所利用的体例。好比,假如利用服务器显式文件,下载更新所用的URL经由过程在服务器显式文件中的ApplicationURL属性指定。
更新下载明显必要必定的强健性。鄙人载和更新以后让客户端使用程序处于任何不不乱的形态是不成承受的。下载过程当中任何成绩大概城市呈现:更新文件所属的Web服务器大概会宕机,客户端呆板大概会溃散,大概由于某种缘故原由用户只是复杂的封闭了使用程序。因为
使用程序正在举行下载,假如它被封闭的话,下载将会中断。一种可选的计划计划是利用独自的体系服务来举行使用程序的下载和更新。利用体系服务,即使使用程序本身没有在运转,更新下载也会持续。实践上,WindowsXP就有一种称之为BITS的内建的下载服务,其目标即在此。BITS是WindowsXP用来对Windows本身举行下载更新的。想检察更多关于BITS的信息,请参阅http://msdn.microsoft.com/library/en-us/dnwxp/html/WinXP_BITS.asp。在.NET使用程序更新组件中没有利用这类服务,因而它能够在不撑持体系服务的Windows9x中利用。
(三)完成更新
.NET使用程序更新组件经由过程将下载和更新历程分为独自的两个阶段来取得强健性。当每阶段都完成时,在位于客户端使用程序目次下的一个更新显式文件(manifestfile)中纪录上去。假如下载或更新任何一个阶段中的历程被打断,它就会鄙人一次使用程序启动时从上一次完成的断点持续本来的事情。每阶段都能够从头运转,因而假如在一个阶段两头呈现失利,从头运转该阶段就能够乐成。假如有毛病产生,好比鄙人载过程当中与服务器的链接丧失,.NET更新组件将会在稍后重试。假如呈报了十分多的毛病(比方web服务器再也没有回到在线形态),下载和更新将会被保持而且呈报堕落误。
我们的第一个办法是复杂地启动一个独自的历程来完成更新。这个独自的历程将会起首封闭使用程序历程,完成更新(由于这时候候已被解锁),重启使用程序历程而且在完成以后封闭本人。因而,这类计划存在三个基础的成绩:
.在某些情形下它不起感化。在更新使用程序时,更新历程封闭原始的使用程序历程,更新历程本身也要被封闭,因而也就不会完成更新。
.我们但愿可以主动更新一切要完成更新的代码。我们但愿主动安装修补的才能不单单产生在使用程序上,并且.NET使用程序更新组件本身也能够。利用这类形式,我们不克不及更新完成更新的历程。
.强迫用户封闭使用程序并在利用过程当中守候,这是很不规矩的。
用来完成使用程序更新的最初一种办法是利用.NET框架并路程序集形式。作为试图更新使用程序本身的替换计划,天生一个比今朝存在版本新的使用程序版本。
新版本能够经由过程兼并今朝现存的使用程序目次与下载的更新版原本天生。当新版本完成时,用户鄙人次从头翻开使用程序时会主动利用新版本。原始使用程序的拷贝就能够被移除。辣手成绩是弄清在某个指准时刻哪一个版本该被载进。我们先容一个称号为Appstart的使用程
序。Appstart是进进你使用程序的出口点,利用这类形式,你的使用程序目次看起来是这个模样:..
-->ProgramFiles
-->MyApp
-->Appstart.exe
-->Appstart.config
-->V1Folder
-->MyApp.exe
-->V1.1Folder
-->MyApp.exe
要运转你的使用程序,你一般是启动Appstart.exe。假如你想在桌面上有个快速键,谁人快速键必需应当指向Appstart而不是间接指向使用程序(注重,你能够重定名AppStart.exe为任何你想要的名字,比方YourApp.exe)Appstart.exe是个十分复杂的程序,它读取Appstart.config文件而且载进指定的使用程序。一个无效Appstart.config文件以下所示:
<Config>
<AppFolderName>V1Folder</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也会封闭。
<P> 3、实例练习训练
后面我们会商了.NET使用程序更新是怎样事情的,如今我们来将它使用在实例中。
第一步:创建使用程序来举行更新
1.利用VS.NET天生一个新的Windows使用项目,定名为"SampleApp"。
2.给窗体一个你选择的风趣的背景致。我们将利用背景致来与前面更新的版本区分。
3.如今让我们给这个使用程序增添一个渺小的功效,起首给你的窗体增添一个按钮。紧缩文件中包括一个具有复杂Windows窗体的程序集。给紧缩文件中SamplesSampleAppSimpleForm程序集增添一个援用。然后在你的按钮事务句柄中增加两行代码:
..
SimpleForm.Form1F=newSimpleForm.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属性:这是.NETApplication使用程序更新的中心,关于本程序必要做以下设置:
(1)AutoFileLoad:这个把持前面要形貌的命令下载特性,如今将它设置为true。
(2)ChangeDetectionMode:该列举决意怎样为更新举行反省。在该例中,我们将利用一个服务器显式反省,因而将这个值设置为“ServerManifestCheck”。
(3)ShowDefaultUI:.NET使用程序更新组件具有一系列用户界面来关照用户一些事务,好比有一个新的更新可使用了大概在更新时代产生毛病等。这类用户界面能够经由过程设置默许的用户界面为有效而用自界说使用程序指定的用户界面来取代它,挂钩得当的事务(好比
OnUpdateComplete)并弹出自界说用户界面。关于该例我们将利用默许的用户界面,因而将这个值设置为true。
(4)UpdateUrl:UpdateUrl是决意更新程序到那边往寻觅更新的。在该例中我们利用一个服务器显式文件来反省更新,因而这个属性应该设置为服务器显式文件的URL。
在该例中将它设置为:http://yourWebserver/SampleApp_ServerSetup/UpdateVersion.xml。请用你的Web服务器名
称来取代“yourWebserver”。
Downloader属性:AppUpdater组件有两个子组件。第一个称之为Downloader,它把持组件的下载和Poller属性:AppUpdater的第二个子组件是Poller,Poller把持更新反省。
(1)AutoStart:布尔值,在使用程序启动时把持Poller是不是应该入手下手轮询或它是不是应该守候直到有企图的更新查询入手下手。
(2)DownloadOnDetection:布尔值,把持Poller在一个新的更新发明时是不是当即入手下手下载更新,大概是不是经由过程挪用DownloadUdpate()办法入手下手显式下载。
(3)InitialPollInterval:使用程序启动后在第一次实行更新反省前守候的秒数。
(4)PollInterval:第一次更新反省以后,PollInterval把持后续每次更新反省之间距离的秒数,注重:默许为每30秒进
行一次反省;明显,你会但愿你的使用程序削减更新反省的频次。
一切这统统完成以后,你的属性表格看起来应该是上面这个模样:
SamplesSampleAppSampleApp_Complete目次包括使用程序准确安装的一个版本。
安装:
(1)DownloadRetryAttempts:鄙人载时代假如有毛病产生(好比Web服务器宕机)downloader会稍后重试。这个属性把持downloader以为是完全的使用程序更新毛病之前重试收集哀求的次数。
(2)SecondsBeteweenDownloadRety:重试收集哀求之前守候的秒数。
(3)UpdateRetryAttempts:在更新时代假如产生严峻毛病,(比方downloader凌驾了试图重试的次数),就会发生一个使用程序更新毛病。默许的,将会中断试图更新。可是在使用程序下一次启动时会试图恢复(好比更新Web服务器大概会宕机好几天)。这个属性把持试图更新的次数。假如凌驾这个值,updater就会作废更新,重置它的形态并前往更新反省。
(4)ValidateAssemblies:这个属性把持下载程序集无效完成的级别。更多信息拜见这篇文章的平安一节。
第四步:天生并在客户端部署使用程序V1版本。
在SampleApp项目中,翻开AssemblyInfo.cs文件。将AssemblyVersion的值从“1.0”修正为“1.0.0.0”。这会引发在天生程序集时取得值为“1.0.0.0”..的标志,该标志取代VS.NET一般指定为递增的值。
1.天生使用程序。
2.从紧缩文件中将SamplesSampleAppSampleApp_ClientSetup目次拷贝到你的当地呆板上。要注重此目次已包括了AppStart.exe。AppStart.config已设置为指向1.0.0.0目次而且启动SampleApp.exe。
从SampleApp的release目次下拷贝SampleApp(Appupdater.dll,SimpleForm.dll和SampleApp.exe)
到客户端SampleApp_ClientSetup1.0.0.0目次下。至此,一个功效完全的使用程序版本已被“安装”到了客户端,能够经由过程运转AppStart.exe来实行。
第五步:安装Web服务器
在这一步我们将安装Web服务器以供应更新轮询功效。.NET使用程序更新组件利用HTTP-DAV来下载使用程序更新,因而必要一个撑持HTTP-DAV的Web服务器。Windows2000上的IIS5.0和更新的操纵体系都撑持HTTP-DAV。
1.将Samples/SampleApp_ServerSetup目次拷贝到你的Web服务器上的wwwroot目次下。
2.将SampleApp的V1版本拷贝到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并修正AvailableVersion为2.0.0.0。修正ApplicationURL为指向新的2.0.0.0路径。
7.保留对UpdateVersion.xml所做的修正。
一旦你保留了新的UpdateVersion.xml,在30秒以内,运转中的SampleApp拷贝将会探测到新的可用版本。
4、按需安装、平安、可扩大性及调试
(一)按需求安装
所谓按需求安装,指只要主可实行程序被显式安装到客户机上。使用程序剩下的部分能够依据基础必要主动下载和安装。
经由过程.NET使用程序更新组件的AutoFileLoad属性来启动按需求安装。你必需细心思索在你的使用程序中程序集界限所处的地位和甚么举措会引发程序集被下载。因为程序集的下载触及到收集输出输入,因而下载所消费的工夫是可变的。在程序集下载时代,使用程序会被解冻守候程序集下载完成。
(二)部署平安
主动安装使用程序更新的才能具有良多优点,但它也陪伴着一些潜伏的伤害。当你使得安装更新变得复杂时,假如不当心,你也大概使得安装歹意代码变得复杂。有两种伤害,第一种伤害是有人会用本人的Web服务器棍骗用来部署更新的Web服务器。他们大概会使用那台Web服务器在你的使用程序路径安装一个病毒程序。制止棍骗或别的经由过程收集举行的不合法干涉的最复杂的办法是利用HTTPS。要和.NET使用程序更新组件一同利用HTTPS,能够复杂地用HTTPSURLs来取代HTTPURLs。固然,HTTPS不是银弹。利用HTTPS有两个成绩,第一是可伸缩性。利用HTTPS必要服务器加密一切从Web服务器高低载的文件。假如一个使用程序的更新文件很年夜,加密更新文件的价值会使服务器的包袱太重。利用HTTPS的另外一个成绩是它对第二种平安伤害毫有益处。第二种伤害是黑客既大概从外部也大概从内部来打击你的服务器。一旦打击乐成,则有大概意味着成百上千的客户端也经由过程主动更新蒙受带累,这类情形将是劫难性的。
为办理这个成绩,.NET使用程序更新组件利用给.NET程序集增加强称号的特征来考证所下载的程序集。假如.NET使用程序更新组件检测到下载时代一个程序集不是利用你的密钥署名的,下载就会作废。这意味着只要具有你的使用程序私钥的人才网可以创建可主动部署的更新文件。
要考证程序集无效,.NET使用程序更新组件考证你以后安装的使用程序可实行程序的公钥和下载的更新的公钥是不是婚配。假如两个程序集以不异且保密的私钥署名,那末嵌进的公钥也就不异。由于被CLR加载的程序集为了考证它的公钥,CLR盘算它一般的哈希值反省来包管程序集实践上就是真实的程序集而不是被做了四肢举动的程序集。为了可以鄙人载时考证,能够给你一切的使用程序集增加强称号并将.NET使用程序更新组件的ValidateAssemblies属性设置为true。
鄙人载时举行程序集考证会起很年夜的感化,但实践上,使用程序会常常有分歧私钥署名的组件。好比,你的使用程序大概有两个文件:利用你的私钥署名的可实行程序集和另外一个包括你购置的使用在你的使用程序中的第三方图表控件的dll程序集。第三方程序集大概使
用第三方而不是你本人的私钥来署名。使情形变得更加庞大的是,在你的使用程序顶用来署名程序集的无效私钥的设置跟着版本号的改动大概会产生变更。你该怎样主动更新那些使用的范例?为办理这个成绩,你能够在你的使用程序中天生一个包括无效公钥的列表的程序集。将该程序集利用使用程序的主私钥(使用程序的exe文件署名的密钥)署名并把该程序集放到Web服务器上和使用程序更新文件一同的目次下。在更新下载历程入手下手之前,.NET使用程序更新组件将会反省Web服务器上使用程序更新目次下一个名为"AppUpdaterKeys.dll"的的程序集。假如存在,该程序集就会被下载。该程序会议被拿来和主使用程序的公钥对照考证。假如署名无效,密钥列表会被提掏出来。今后以后,任那边于该列表中的密钥会被以为是更新文件的无效署名。
有关平安方面保举的办法是利用HTTPSURLs来完成更新反省。这会供应第一级其余棍骗回护。关于更新下载,最好不要利用HTTPSRLs以免使你Web服务器的负荷太重。而是给你的使用程序的程序集增加强称号并利用程序集考证特征。
(三)可扩大性
在这篇文章后面讲过的示例中我们复杂地经由过程拖放一个组件到使用程序中并设置一些属性来完成主动部署。
固然这在很多使用程序中事情的很好,但在一些使用程序中会必要初级其余把持,这只能经由过程写代码来取得。我们能够编写本人的代码来交换失落.NET使用程序更新组件尺度历程,利用重写的CheckForUpdate()和ApplyUpdate()办法来定制反省和更新举动。
(四)调试
这一节将指出一些首选的调试选项,和形貌利用该组件的用户年夜多半罕见的成绩。
.NET使用程序更新器在和AppStart.exe不异的目次下天生一个名为AppUpdate.log的埋没日记文件。
一切的更新乐成和失利信息都纪录在该日记中。当有一个特别的客户端不克不及乐成更新光阴志文件会出格有效。
你可使用日记来判别在甚么工夫和是怎样更新失利的。别的,.NET使用程序更新组件利用.NET框架的Debug类来输入大批有效的信息。假如你在调试器中运转你的使用程序,你会在输入窗口中看到这些信息。你能够循着.NET使用程序更新器的纪录重点察看并找到出
成绩的中央。
假如因为某种缘故原由,你没法使得.NET使用程序更新器事情,在你深切调试之前请断定以下几点,你碰到的成绩极可能就是以下之一:..
.你是不是将IIS目次扫瞄给翻开了?假如没有,更新器将不会下载安装任何文件。
.你是不是准确的部署了统统并准确设置了URL?
.假如你的使用程序安装在programfiles目次下,断定你是该机的超等办理员或超等用户吗?假如不是,你将不会有写权限来更新使用程序。
.你是在使用程序的主用户界面线程中天生AppUpdater工具的吗?假如不是,更新器将不克不及显现用户界面而且在引发事务回到用户界面时失利。
.是不是更新乐成,但使用程序利用新的更新主动重启时失利?.NET使用程序更新组件试图经由过程挪用Application.Exit办法来加入使用程序。但是,该办法其实不能包管封闭一个使用程序。假如你天生并遗留了独自的线程在运转,该办法就没法封闭历程。包管一切线程停止的办理的计划是经由过程挪用Application.OnExit事务,大概挂钩.NET使用程序更新器的OnUpdateComplete事务并本人处置封闭。
5、总结
客户端使用程序部署便利是.NET框架第一个版本的主要的方针。用.NET框架创建办理部署成绩的客户端使用程序是一种很好的手艺。部署便利仍旧是将来.NET框架新版本的一个主要方针。就计划而言,这里形貌的.NET使用程序更新组件代表了我们的一些设法,在将来版本的.NET框架中我们将能够间接利用。但是,在谁人时分到来之前的这段时代,.NET使用程序更新组件不掉为入手下手创建主动更新使用程序的一种主要的办法。
我有个同学,他是搞Java的,他给我说“Java不是效率低,而是速度慢。”,我不是搞Java的,我实在想不透这句话的含义,难道执行速度不就是效率低吗?难道执行速度慢还成效率高了? |
|