AppUpdater 的一个问题

最近手上的 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 程序(这次主要突出的是离线工作的特征),有很多经验教训,过些日子待项目平静下来开始整理整理,做一些文章给大家参考。

最近手上的 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 程序(这次主要突出的是离线工作的特征),有很多经验教训,过些日子待项目平静下来开始整理整理,做一些文章给大家参考。

AppUpdater 的一个问题相关推荐

  1. smart client auto update

    试了一下appupdater,发现总是报mscorlib.XX.dll及其它DLL找不到. 网上找了一些文章,http://blog.joycode.com/percyboy/archive/2005 ...

  2. java---解惑--

    Java谜题1--表达式谜题 谜题1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转吗? public static boolean isOdd(int i){  ret ...

  3. [日常] 面试知识点总结(持续更新)

    数据结构和算法:物理结构和逻辑结构1.逻辑结构(集合结构,线性结构,树形结构,图形结构)2.物理结构一般是讲内存,顺序存储结构,链式存储结构浅谈算法中,高斯算法从1加到100,循环的话是100次,高斯 ...

  4. 堆栈计算机的原理和实现

    堆栈计算机的原理和实现 原书< Stack Computers: the new wave > (原书封面) 原作者 Philip J. Koopman, Jr. 编译者 赵宇 张文翠 这 ...

  5. Python3 OpenCV4 计算机视觉学习手册:6~11

    原文:Learning OpenCV 4 Computer Vision with Python 3 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集] ...

  6. 【题库】计算机二级选择题

    一.公共基础知识 考10分 二.计算机基础 考4分 三.Office操作 考6分 一.公共基础知识 考10分 1.下列叙述中正确的是 A)所谓算法就是计算方法 B)程序可以作为算法的一种描述方法 C) ...

  7. Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几

    Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...

  8. 作为一个java程序员,常用的linux命令(越攒越多)

    本篇记录我在工作中不断遇到的常用的linux命令,并进行总结,时常更新! 1. 升级服务时先停止服务,然后进行替换 linux中杀进程时候,如果你是知道它所占用的端口号的话,可以通过 netstat ...

  9. 伍六七带你学算法 入门篇——最后一个单词的长度

    难度 简单 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度.如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词. 如果不存在最后一个单词,请返回 0 . 说 ...

最新文章

  1. C中文件操作的文本模式和二进制模式,到底有啥区别?
  2. 采购审批专题总结--bob
  3. 数据连接linux网络编程之TCP/IP基础(四):TCP连接的建立和断开、滑动窗口
  4. VIM打开shell脚本中文乱码解决
  5. 03凑算式(数字填空)
  6. 2.QT中使用资源文件,程序打包
  7. python能写什么脚本_你用 Python 写过哪些有趣的脚本?
  8. debian 9 安装后的配置,debian 9 开发环境。
  9. 审稿意见说我引言和结论写的毫无差别!
  10. 计算器 - 栈的应用
  11. 关于java前端与后端的技术和工资对比!
  12. 联众打码写滑动_如何能够对接联众打码平台
  13. MyEclipse自定义JSP模板
  14. 美国成功企业竞争情报案例分析
  15. 笔记本电脑热点显示正在断开连接,一直无法开启热点,inetsh winsock reset 命令重置可以解决
  16. html隐藏或显示不出来,win7隐藏文件显示不出来
  17. 百度竞价ocpc投放是一门玄学吗
  18. 云原生和云计算的区别,普通人都能看懂!
  19. 判断两个区间有无交集
  20. java基础 DK JRE JVM 关系 JDK 下载和安装

热门文章

  1. 图像滤镜艺术---(Lightleaks Filter)漏光滤镜
  2. 联手Slack,IBM欲开发多元化智能聊天机器人
  3. iOS-SDPhotoBrowser
  4. Eclipse启动之四 : Eclipse核心框架启动(百度空间迁移)
  5. grails指定环境
  6. Writing a FilterUnloadCallback Routine for a Minifilter Driver 为一个微过滤驱动写一个过滤器卸载回调例程...
  7. 3G时代需要“移动云计算专业”
  8. 重新拾起ActionScript,物已是人已非--浅谈软件之美
  9. 《数据库系统概念》7-函数、存储过程、触发器
  10. 使用Memcached实现Session共享