,技术专题   工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛,技术专题
您的位置:软件 > 开发者网络 > 微软开发专栏 > 技术专题 > 正文
.NET智能传输服务实现自动更新(下)
[文章信息]
作者:陶刚编译
时间:2003-08-19
出处:yesky
责任编辑:方舟
[文章导读]
.NET框架组件为在代码中使用介绍很多有趣的安全结构,代码访问安全性就是一个例子
advertisement
热点推荐
· 深入探讨SQL Server 2000对XML的支持
· Swing(空)
· 3DS Stodio Max 宝典
· 中小企业服务器配置方案--前 言
· 中小企业服务器配置方案--代理接入服务器(3)
[正文]

上一页  1 2 3 4  下一页

  更新包和替换

  如果自动升级应用程序对无代码文件没有作用,或者它要求所有EXE和DLL文件都可以管理并做名字强化,我也不会对它感兴趣。因此我需要一条途径来使用.NET框架组件强化命名绑定而不强迫更新文件是.NET框架组件文件。答案是将更新文件作为组件的资源嵌入一个组件文件。这不仅使所有文件类型受到强化命名保护,而且简化了BITS工作,从多个工作变为单个文件下载,一个大文件实际上是多个小文件包组成。实际上,包可以包括CAB文件或者MSI脚本--这些都没有限制。

  所有的.NET框架组件语言编译器都允许向一个组件文件种嵌入任意文件。我将演示怎样使用C#编译器实现该功能,但是概念与Visual Basic .NET或者可管理C++一样。下面的代码将Code.dll、 Bitmap.gif和Data.xml编译为一个Update2.dll文件,它包含了作为嵌入资源的每个文件:

csc /res:Code.dll /res:Bitmap.gif /res:Data.xml /out:Update2.dll
/t:library

  注意C#编译器有足够的灵活性,能在没有.cs代码文件时建立DLL组件。该DLL只包含嵌入资源。但是,如果你希望DLL包含一个强化名字,你需要包括一个短的.cs文件,它的代码与StrongName.cs的类似。

Assembly update = Assembly.Load(...); //载入组件

//获取资源名称
String[] resources = update.GetManifestResourceNames();

//枚举资源
foreach(String s in resources){
using(
//获取资源流
Stream res = update.GetManifestResourceStream(s),
file = new FileStream(s, FileMode.CreateNew) //建立文件
){
Int32 pseudoByte;
while((pseudoByte = res.ReadByte())!=-1){ //复制字节
file.WriteByte((Byte)pseudoByte);
}
}
}

提取组件资源代码

  发现嵌入资源并将它们复制到文件系统的必要代码在图4中显示。代码使用Assembly.GetManifestResourceName和Assembly.GetManifestResourceStream方法来查找资源并将它们复制为文件系统的文件。代码中没有保存文件系统的原文件数据,但它可以简单修改实现该功能。注意提取过程只在Assembly.Load已经验证了容器组件的签名后才执行。

  文件替换和提取

  即使有强化名称和组件资源,在应用程序更新过程中提取文件进入应用程序目录也是一个不容易的问题。该问题的症结是应用程序正在运行时要复制自己的文件。更为复杂的是,你运行的应用程序也许像记事本,这种应用程序,同时多个实例在运行。

  如果有类似的应用程序,我们是有通用的解决方案的。与其规定一个解决方案,不如查看可用的管理替换问题的特性。首先,一个简单的可能性是在与主程序的过程分开的过程中运行自动升级特性。当应用程序是不可管理的或者想扩充使它能够使用本文的技术时,这是个非常好的途径。更新过程能处理所有的BITS逻辑和文件提取,该过程在试图提取文件前一直等待,直到主应用程序终止为止。

  在单独的过程中运行提取代码主要有三个不利之处。首先,它使自己批处理自动更新代码很困难。其次,在服务器端这种方法没有什么好处,因为服务器不太可能关闭。第三,如果主应用程序被Windows Job对象管理,那么当主过程存在时,自动更新过程将被Windows自动终止。

  AutoUpdateApp.exe例程在主应用程序逻辑的过程中运行自动升级逻辑。如果你也决定同样做,可能会遇到删除和替换正在被该过程使用的DLL和EXE文件的问题。删除使用中的DLL或EXE文件的一个公开的小窍门是将该文件改名为临时文件,并把新文件复制为就文件名。接着你能在下次重启系统时使用MoveFileEx Win32 API记录该文件的删除,或者在应用程序中包含查找临时文件并删除的逻辑。

  就算使用更名的窍门,也得考虑更新正在进行时,用户运行了应用程序得另一个实例,它将载入一部分旧文件和一部分新文件。有多种方法解决问题,其中一个是在CLR中使用应用程序域的影像(shadow)复制特性。

  CLR在逻辑应用程序容器中(称为应用程序域或者AppDomain)运行可管理代码。多个AppDomain可以在一个Windows过程中运行。建立一个AppDomain时,可以标识新域来影像复制文件。它的意思是在应用程序载入组件时,组件文件被复制到一个隐藏的文件夹并从影像位置载入。该特性被ASP.NET框架组件中的ASP.NET类使用,用于把应用程序文件导出,这样才能被ASP.NET代码生成器更新。

  AppDomain对应用程序的再次执行也有用处。理想情况下,当有更新存在时,应用程序将提示用户是否有兴趣更新。回答"是"后,应用程序使用新特性运行。对有些应用程序,在新过程中重新载入应用程序是可以接受的,在其它应用程序中,更好的方式是新代码在执行更新的过程中运行。

  使用AppDomain重新运行可管理EXE是很容易的。本文的例程中的RelaunchExe方法就是一个实现的例子。RelaunchExe方法建立一个新AppDomain并重新运行执行文件,给它传递相同的命令行参数。


上一页  1 2 3 4  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
,技术专题相关内容,技术专题焦点新闻
  • FVD刺激高清碟机加速商业化 抢占商机最重要
  • 3家搜索引擎集体诉讼8848 吕春维未敢出席
  • 杨元庆:没有准备不会获批的备用方案
  • 军队信息化诞生新领域 电子军务呼之欲出
  • 世界经济论坛公布信息化程度全球最新排名
  • 2004政务绩效评估:政府门户尚处于发展阶段
  • 甲骨文出资5.15亿美元 意图收购RetekInc
  • 技术并购:帮你突破传统增长的“天花板”
  • ,技术专题Advertisement