SimpleUpdater for .NET 是一个适用于.NET的快速自动更新类库,用于快速地为现有的.NET应用程序添加上自动更新功能。
我是路标
更新详情
客户端更新内容
- 增加组件ID检测事件
- 增加同步检测更新以及任务检测更新方式
- 增加“不存在则跳过”的文件更新逻辑
- 修正下载时进度显示的bug
- 变更当前主程序模块以及信息监测方式
- 变更行为,最低版本达不到要求也视作错误
- 部分逻辑调整,提升特定情况下检测更新的速度
打包工具更新
- 加入组件ID支持
- 变更文件列表编辑方式,新增组件ID编辑以及“不存在则跳过”逻辑
- 新增打包选项,支持使用随机包名
- 新增打包前清空目标目录的选项
变更内容详解
打包工具:清空目标目录以及随机文件名选项
随机文件名选项是一个特殊的需要。在这之前版本的打包工具中,升级包的文件名是根据相对路径的MD5来进行计算的。这样的好处就是只要路径一样,打包时的文件名始终一样,便可以使用复制的模式直接发布更新,而不用先删除。
但是因为网络现状,越来越多的小宽带尤其是小区宽带会很奇葩地根据文件名来进行缓存,发布版本更新后文件名一致的情况下它们会使用自己的错误内容或版本错误的文件直接响应更新请求而不是下载最新文件,最终导致更新失败。同时,还有很偶尔的情况会发现下载回来的文件完全是风马牛不相及的文件(只是文件一样而已)。在之前的版本中,引入了随机化查询字符串的功能来企图阻止这种行为,但是后来证明没啥用,对这些静态文件某些小区宽带甚至会无视查询字符串进行缓存。
在4.0版的打包工具中,引入了两个新的选项。随机文件名模式启用后,将会使用随机GUID作为升级包的文件名,从而尽可能避免这种错误的发生。同时,新增生成前清空升级包所在目录内容的功能来减轻手动清理的需要,也避免文件冗余。
打包工具:组件标记
组件标记是指在生成升级包的时候,对特定的部分文件设置标记。比如某几个特定文件只有Beta版才有,那么可以在这里设置一个标记位“Beta”,然后在之后的文件编辑器里面将指定的文件选中为此标记。
在进行更新的时候,升级客户端将会根据已知的标记或触发的事件监测结果来决定带有这个标记的文件是否要更新。如果客户端不带有此标记,将会忽略此标记文件的更新。
具体示例请参考后面的章节。
打包工具:新的文件设置界面
基本上新的选择界面就是原来界面的加强版,可以直接在界面里设置各项参数,而不是用右键菜单和弹出框。
更新模式中新增了“不存在则跳过”,意思就是如果客户端没有这个文件,则不对它进行更新;如果存在这个文件,则检测其是否有更新。
客户端:组件ID检测
组件ID检测是对应了之前打包工具中的组件ID绑定,提供了静态绑定和动态绑定两种。
静态绑定指的是在检测之前,可以直接预置已知的组件ID以及其是否有效到更新上下文中。参考如下代码。
var updater = Updater.CreateUpdaterInstance(@"http://域名/{0}", "update_c.xml"); //设置标记位. 当设置更新文件标记位 Beta时,将会进行更新检测 //如果此设置为false,则当进行更新时会跳过对应的文件 updater.Context.ComponentStatus.Add("Beta", true);
动态绑定是指当要检测指定的标记且没有被预置或检测过时,会引发事件,在事件中进行检测,参考如下代码。
var updater = Updater.CreateUpdaterInstance(@"http://域名/{0}", "update_c.xml"); //获得通过事件检测。返回的结果将会进行缓存 //事件必须在检测更新前绑定 updater.RequestCheckComponentFlag += (s, e) => { if (e.ComponentId == "Beta") e.Valid = true; };
客户端:同步检测方式
默认的检测是异步的,检测结果通过事件来通知。4.2版中新增了同步模式,以便于需要先检查更新再运行的场合。
参考如下代码。
static void CheckUpdateSync() { var updater = Updater.CreateUpdaterInstance("http://www.fishlee.net/service/update2/56/40/{0}", "update_c.xml"); //同步模式检测更新 var checkResult = updater.CheckUpdateSync(false); if (checkResult.Error) { Console.WriteLine("Error: " + checkResult.Exception.Message); } else if (checkResult.HasUpdate) { Console.WriteLine("最新版:" + checkResult.NewVersion); } else { Console.WriteLine("您已经使用最新版"); } }
同步模式下,如果没有完成检测,则代码不会继续执行。CheckUpdateSync
带有一个可选参数,用于设置是否禁用内部的对话框。如果不禁用,当发现更新的时候将会触发发现更新的对话框。
客户端:异步模式
在4.2版本中,新增了异步模式。
参考以下代码。CheckUpdateTask
带有一个可选参数,用于设置是否禁用内部的对话框。如果不禁用,当发现更新的时候将会触发发现更新的对话框。
static async void CheckUpdateTask() { var updater = Updater.CreateUpdaterInstance(@"http://域名/{0}", "update_c.xml"); //任务模式检测更新 Version newVersion = null; try { newVersion = await updater.CheckUpdateTask(); if (newVersion == null) { Console.WriteLine("您已经使用最新版"); } else { Console.WriteLine("最新版:" + newVersion); } } catch (Exception) { Console.WriteLine("Error: " + updater.Context.Exception.Message); } }
安装&下载方式
详情请参见主页 http://www.fishlee.net/soft/simple_autoupdater/
鱼大,在你的帮助下,都弄好了,谢谢。:idea:
鱼大,我用这个更新程序,地址写的是ftp:// ,但总报错,提示更新发生了错误:在WebClient请求期间发生异常,这是什么问题?我ftp地址写的是对的。
写日志,应该会记录详细信息。
好的,我试试
不错,是我需要的。