AppUpdater 的一个问题
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 的一个问题相关推荐
- smart client auto update
试了一下appupdater,发现总是报mscorlib.XX.dll及其它DLL找不到. 网上找了一些文章,http://blog.joycode.com/percyboy/archive/2005 ...
- java---解惑--
Java谜题1--表达式谜题 谜题1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转吗? public static boolean isOdd(int i){ ret ...
- [日常] 面试知识点总结(持续更新)
数据结构和算法:物理结构和逻辑结构1.逻辑结构(集合结构,线性结构,树形结构,图形结构)2.物理结构一般是讲内存,顺序存储结构,链式存储结构浅谈算法中,高斯算法从1加到100,循环的话是100次,高斯 ...
- 堆栈计算机的原理和实现
堆栈计算机的原理和实现 原书< Stack Computers: the new wave > (原书封面) 原作者 Philip J. Koopman, Jr. 编译者 赵宇 张文翠 这 ...
- Python3 OpenCV4 计算机视觉学习手册:6~11
原文:Learning OpenCV 4 Computer Vision with Python 3 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集] ...
- 【题库】计算机二级选择题
一.公共基础知识 考10分 二.计算机基础 考4分 三.Office操作 考6分 一.公共基础知识 考10分 1.下列叙述中正确的是 A)所谓算法就是计算方法 B)程序可以作为算法的一种描述方法 C) ...
- Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几
Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...
- 作为一个java程序员,常用的linux命令(越攒越多)
本篇记录我在工作中不断遇到的常用的linux命令,并进行总结,时常更新! 1. 升级服务时先停止服务,然后进行替换 linux中杀进程时候,如果你是知道它所占用的端口号的话,可以通过 netstat ...
- 伍六七带你学算法 入门篇——最后一个单词的长度
难度 简单 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度.如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词. 如果不存在最后一个单词,请返回 0 . 说 ...
最新文章
- C中文件操作的文本模式和二进制模式,到底有啥区别?
- 采购审批专题总结--bob
- 数据连接linux网络编程之TCP/IP基础(四):TCP连接的建立和断开、滑动窗口
- VIM打开shell脚本中文乱码解决
- 03凑算式(数字填空)
- 2.QT中使用资源文件,程序打包
- python能写什么脚本_你用 Python 写过哪些有趣的脚本?
- debian 9 安装后的配置,debian 9 开发环境。
- 审稿意见说我引言和结论写的毫无差别!
- 计算器 - 栈的应用
- 关于java前端与后端的技术和工资对比!
- 联众打码写滑动_如何能够对接联众打码平台
- MyEclipse自定义JSP模板
- 美国成功企业竞争情报案例分析
- 笔记本电脑热点显示正在断开连接,一直无法开启热点,inetsh winsock reset 命令重置可以解决
- html隐藏或显示不出来,win7隐藏文件显示不出来
- 百度竞价ocpc投放是一门玄学吗
- 云原生和云计算的区别,普通人都能看懂!
- 判断两个区间有无交集
- java基础 DK JRE JVM 关系 JDK 下载和安装
热门文章
- 图像滤镜艺术---(Lightleaks Filter)漏光滤镜
- 联手Slack,IBM欲开发多元化智能聊天机器人
- iOS-SDPhotoBrowser
- Eclipse启动之四 : Eclipse核心框架启动(百度空间迁移)
- grails指定环境
- Writing a FilterUnloadCallback Routine for a Minifilter Driver 为一个微过滤驱动写一个过滤器卸载回调例程...
- 3G时代需要“移动云计算专业”
- 重新拾起ActionScript,物已是人已非--浅谈软件之美
- 《数据库系统概念》7-函数、存储过程、触发器
- 使用Memcached实现Session共享