前言
AutoUpdaterDotNet是Ravi Patel大神的力作,来源 https://github.com/ravibpatel/AutoUpdater.NET 。完全支持远程服务器版本检查及在线下载更新版本,客户端更兼容IE/Chrome/FireFox等众多浏览器软件。本着研究看的心态,同时看了许多关于AutoUpdaterDotNet控件技术的文章,感觉缺少了许多东西,特留下此篇文档供新手参考使用。如果有什么问题之处,敬请指正。
一、环境搭建
1、下载及应用方式:
可以在VS中通过:
PM> Install-Package Autoupdater.NET.Official
直接进行加载进项目中。
也可以,在github下载zip,通过dll库进行引用。
2、Web服务搭建
可以应用于IIS环境,也可以应用在Apache/easyhttp/GuaikNet等众多Web服务端环境。只需要确认环境完全遵行html5 + css3 + js就可以。此篇文章以搭载IIS环境来展开:
a. 搭建好IIS后,在IIS管理器中Default Web Site网站下先配置好,两个子目录:
Downloads是存放软件升级所需要的补丁包(.zip格式),Updates是存放AutoUpdaterStarter.xml环境配置文件(.xml)以及更新完成后呈现的更新日志Page(UpdateLog.html)。
AutoUpdaterStarter.xml源码:(其中标红字的为必设定项,而标蓝字的为可选设定项。标黑字的mandatory,需要前端UI处理args传参值)
<?xml version='1.0' encoding="UTF-8"?> <item> <!--在版本标记之间提供应用程序的最新版本。版本必须为X.X.X.X格式。--> <version>2.3.2.0</version> <!--在url标签之间提供最新版本安装程序文件或zip文件的url。自动更新。NET下载这里提供的文件,并在用户按下Update按钮时安装它。--> <url>http://192.168.1.8/Downloads/GasMisUpdateHotFix.zip</url> <!--在changelog标记之间提供应用程序更改日志的URL。如果你不提供变更日志的URL,那么更新对话框将不会显示变更日志。--> <changelog>http://192.168.1.8/Updates/UpdateLog.html</changelog> <!--如果你不想让用户跳过这个版本,可以将其设置为true。这将忽略“稍后提醒”和“跳过”选项,并在更新对话框中隐藏“稍后提醒”和“跳过”按钮。--> <!--mandatory mode="2">true</mandatory --> <!--可以在强制元素上提供minVersion属性。当您提供该选项时,只有当安装的应用程序版本小于您在这里指定的最小版本时才会触发强制选项。--> <!--mandatory minVersion="1.2.0.0">true</mandatory --> <!--args(可选):您可以在这个标记之间为安装程序提供命令行参数。您可以在命令行参数中包含%path%,它将被当前正在执行的应用程序所在目录的path所取代。--> <!--mandatory args="xxxxx">false</mandatory --> <!--提供更新文件的校验和。如果你做这个autotoupater。NET将在执行更新过程之前比较下载文件的校验和,以检查文件的完整性。 您可以在校验和标记中提供algorithm属性,以指定应该使用哪个算法来生成下载文件的校验和。目前支持MD5、SHA1、SHA256、SHA384和SHA512。--> <!--checksum algorithm="MD5">Update file Checksum</checksum --> </item>
更新日志UpdateLog.html页面的设计,可随意自行设计。完全符合并支持html5 + css3 + js代码标准。需要强调的是,IIS如果开启并支持了https协议,开启了SSL签名认证(IIS对目录启用了SSL设置),没有关系直接在xml源码中将http://改成https://就可以了,但开启了基本身份验证,就需UI前端设定相关参数(请见下文)
b. 前端UI设计
有两种加载方式:
(1) 通过建立一个CheckforUpdate的窗体,将AutoUpdater.Start方法写入本窗体CheckforUpdate_Load事件中;最后在项目启动类中FormLoad()事件加载并实例化该窗体。
(2)直接在项目启动类中调用AutoUpdater.Start方法,简单直观。
demo如下:
1 namespace CusPro.GasMis.Starter 2 { 3 public partial class FrmLogin : Form 4 { 5 public FrmLogin() 6 { 7 InitializeComponent(); 8 } 9 10 private void FrmLogin_Load(object sender, EventArgs e) 11 { 12 #region 更新提示/判断是否自动更新 13 AutoUpdaterStarter(); 14 #endregion 15 16 } 17 18 private void AutoUpdaterStarter() 19 { 20 //XML文件服务器下载地址 21 22 AutoUpdater.Start("http://192.168.1.8/Updates/AutoUpdaterStarter.xml"); 23 24 //通过将其分配给InstalledVersion字段来提供自己的版本 25 //AutoUpdater.InstalledVersion = new Version("1.2"); 26 27 //查看中文版本 28 //Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture("zh"); 29 30 //显示自定义的应用程序标题 31 AutoUpdater.AppTitle = config.AppName + "升级更新"; 32 33 //不显示“稍后提醒”按钮 34 //AutoUpdater.ShowRemindLaterButton = false; 35 36 //强制选项将隐藏稍后提醒,跳过和关闭按钮的标准更新对话框。 37 //AutoUpdater.Mandatory = true; 38 //AutoUpdater.UpdateMode = Mode.Forced; 39 40 //为XML、更新文件和更改日志提供基本身份验证 41 //BasicAuthentication basicAuthentication = new BasicAuthentication("myUserName", "myPassword"); 42 //AutoUpdater.BasicAuthXML = AutoUpdater.BasicAuthDownload = AutoUpdater.BasicAuthChangeLog = basicAuthentication; 43 44 //为http web请求设置User-Agent 45 //AutoUpdater.HttpUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"; 46 47 //启用错误报告 48 AutoUpdater.ReportErrors = true; 49 50 //将应用程序设定不需要管理员权限来替换旧版本 51 //AutoUpdater.RunUpdateAsAdmin = false; 52 53 //打开下载页面,不直接下载最新版本***** 54 AutoUpdater.OpenDownloadPage = true; 55 56 //设置为要下载更新文件的文件夹路径。如果没有提供,则默认为临时文件夹。 57 //AutoUpdater.DownloadPath = Environment.CurrentDirectory; 58 59 //设置zip解压路径 60 AutoUpdater.InstallationPath = Environment.CurrentDirectory; 61 62 //处理应用程序在下载完成后如何退出 63 AutoUpdater.ApplicationExitEvent += AutoUpdater_ApplicationExitEvent; 64 65 //自定义处理更新逻辑事件 66 AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent; 67 } 68 69 70 private void AutoUpdater_ApplicationExitEvent() 71 { 72 Text = @"Closing application..."; 73 Thread.Sleep(5000); 74 Application.Exit(); 75 } 76 77 private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) 78 { 79 if (args.Error == null) 80 { 81 if (args.IsUpdateAvailable) 82 { 83 DialogResult dialogResult; 84 if (args.Mandatory.Value) 85 { 86 dialogResult = 87 MessageBox.Show( 88 $@"您有新的版本 {args.CurrentVersion} 可用,当前使用的是{ 89 args.InstalledVersion 90 } 版本,这是必需的更新。", 91 @"Update Available", 92 MessageBoxButtons.OK, 93 MessageBoxIcon.Information); 94 } 95 else 96 { 97 dialogResult = 98 MessageBox.Show( 99 $@"您有新的版本 {args.CurrentVersion} 可用,当前使用的是{args.InstalledVersion} 版本, 100 您现在要更新应用程序吗?", @"Update Available", 101 MessageBoxButtons.YesNo, 102 MessageBoxIcon.Information); 103 } 104 105 106 if (dialogResult.Equals(DialogResult.Yes) || dialogResult.Equals(DialogResult.OK)) 107 { 108 try 109 { 110 //You can use Download Update dialog used by AutoUpdater.NET to download the update. 111 112 if (AutoUpdater.DownloadUpdate(args)) 113 { 114 Application.Exit(); 115 } 116 } 117 catch (Exception exception) 118 { 119 MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButtons.OK, 120 MessageBoxIcon.Error); 121 } 122 } 123 } 124 else 125 { 126 MessageBox.Show(@"There is no update available. Please try again later.", @"Update Unavailable", 127 MessageBoxButtons.OK, MessageBoxIcon.Information); 128 } 129 } 130 else 131 { 132 if (args.Error is System.Net.WebException) 133 { 134 MessageBox.Show( 135 @"There is a problem reaching update server. Please check your internet connection and try again later.", 136 @"Update Check Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); 137 } 138 else 139 { 140 MessageBox.Show(args.Error.Message, 141 args.Error.GetType().ToString(), MessageBoxButtons.OK, 142 MessageBoxIcon.Error); 143 } 144 } 145 } 146 } 147 148 }
二、功能性测试
运行测试的结果:
值得注意的是,我采用的是项目程序集的版本号与xml中的版本号进行比对检查,只要是小于xml文件版本号,即会认为需要升级更新。
而升级的逻辑处理,可以通过xml与AutoUpdater相关参数:
xml参数
<mandatory mode="2">true</mandatory>
AutoUpdater参数(前端UI)
AutoUpdater.ShowRemindLaterButton = false;
<!--提供自己的程序集,那么可以通过提供Start方法的第二个参数来实现,如下所示。
AutoUpdater.Start("http://rbsoft.org/updates/AutoUpdaterTest.xml", myAssembly);-->
<!--不想在更新表单上显示跳过按钮,那么只需用上面的代码添加以下一行。
AutoUpdater.ShowRemindLaterButton = false;-->
这些参数的影响来判断执行升级更新的逻辑。
有什么问题欢迎留言指出……
-END-