最近手上的 Smart Client 项目已接近尾声,正准备为其添加“自动更新”功能。因为时间紧迫,完全自己开发是不可能了,再说已有现成的,为什么不用呢?呵呵~
目前,实现“自动更新”这个特征,主要有两种选择:一个是采用 Microsoft Practice & Patterns 中提供的 Updater Application Block (现在属于 Enterprise Library 的一部分);另一种选择是采用 windowsforms.net 上一个微软员工写的一个 AppUpdater 组件(?http://windowsforms.net/articles/appupdater.aspx?)。
这两个东西有相似的地方,也有不同的地方,比如 Updater Application Block 提供了很强大的扩展接口,但个人感觉也有些体积庞大;后者比较小巧,windowsforms.net 中推出的 Terrarium (一个基于 .net 的游戏程序,也是一个典型的 Smart Client)中即采用了这个小家伙,并对它进行了扩展(Terrarium 中比较特殊的两点扩展是:1.采用Web Service形式,2.更新控制更加智能:只告诉一定数量的客户端需要更新软件,而告诉其他客户端“没有”更新,从而避免了更新高峰使服务器瘫痪的情形。随后逐批通知其他客户端更新软件。)
在搜索结果中发现,AppUpdater有一个广为人知的问题,如下图所示的提示:
Unable to auto-download the missing parts of the application from:
http://localhost/temp/System.resources.dll
但发现多数人给出的建议(比如:http://www.cnblogs.com/myxq/archive/2005/02/28/110370.aspx)就是,在系统中找到这些所谓“遗失”的文件,然后把它们加入到程序目录中来。
事实上,这些都是些资源文件,而且它们存在系统目录中,不应该是“missing”才对(因为程序也没有因为缺少它们而出现其他问题)。
搜索结果还发现一个现象是:问这个问题的大都是中文、日文、还有不认识的欧洲语言、俄语等等,基本上没看到英语用户在讨论这个问题。
我也查找了缺少的这些资源文件,它们所在的目录是:C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\zh-CHS
这样就比较明显了,对于英语用户他们不需要这些资源文件,他们使用已经打包在系统 dll 中的默认资源。可这个只是解释了为什么英语用户不讨论这个话题的现象。
简单看了 AppUpdater 的源码,发现这个错误提示出现的位置是一段自动下载缺失assembly的方法,它挂接了 AppDomain? 类的 AssemblyResolve 事件,当程序集解析失败时,自动从网络中下载。
我的初步猜测是,这几个资源文件是 AppUpdater.dll 自身依赖的,然后在它自己对自己进行解析时引发了这个 AssemblyResolve 事件。
很抱歉,我还没给出解决方法,仅仅初步分析了一下(还不知道对不对,最近太忙,闲下来再研究)。
另,这次第一次做 Smart Client 程序(这次主要突出的是离线工作的特征),有很多经验教训,过些日子待项目平静下来开始整理整理,做一些文章给大家参考。
打印 | 张贴于 2005-05-10 23:36:00 | Tag:暂无标签
留言反馈
[DownloaderManager.CheckDownloadCompleteOrError] :
Error downloading files from the server for the application 'YourApp',
the following message was in the exception: 'YourApp'.
ERROR: HRESULT 中的异常:0x8007013D。
STACK: at Microsoft.ApplicationBlocks.ApplicationUpdater.Downloaders.IBackgroundCopyError.GetErrorDescription(UInt32 LanguageId, String& pErrorDescription)
at Microsoft.ApplicationBlocks.ApplicationUpdater.Downloaders.BITSDownloader.HandleDownloadErrorCancelJob(IBackgroundCopyJob copyJob, String& errMessage)
at Microsoft.ApplicationBlocks.ApplicationUpdater.Downloaders.BITSDownloader.Microsoft.ApplicationBlocks.ApplicationUpdater.Interfaces.IDownloader.GetJobStatus(Guid jobId)
at Microsoft.ApplicationBlocks.ApplicationUpdater.DownloaderManager.CheckDownloadCompleteOrError()
我在用AppStart得时候,下载以后不能自己重新启动,我检查了AppStart得原代码,加入了一句p.UseShellExecute=false;才解决,其中p是你得程序得进程实例。
配置得时候一定记得要删除你IIS上Update目录得后缀为config得配置,否则只要有config文件下载就不能正常进行。
我得qq:13052377 欢迎交流。
方案一:分别挂接 AppUpdater 对象的 UpdateDetected, UpdateComplete 事件,在相应事件处理程序中弹出你自己的对话框。
方案二:改 AppUpdater 源码,重新编译。
因为它是英文的,我想改成中文,怎么作啊。。。!?
web目录设为 可浏览,可写入,
windows2003,记得设置WEB_DAV为允许。
IIS里的配置不正确。好好看看它的文档。
请加我:17007325
Updates那个目录不要放在Application的目录下,应该单独建一个目录
或者在IIS中将“应用程序设置”删除,成为一个普通的web目录。
原理就是如果是applicaiton,在服务器端要做处理的,所以才会发现问题,直接下载就不会出现这个问题了。
还有AssemblyCulture可以设为空
我开始做的时候也出现这个问题,后来可能是注意了上面一些,就过了