private static void BackgroundWorkerDoWork(object sender, DoWorkEventArgs e) { e.Cancel = true; var mainAssembly = e.Argument as Assembly; var companyAttribute = (AssemblyCompanyAttribute)GetAttribute( mainAssembly, typeof(AssemblyCompanyAttribute)); if (string.IsNullOrEmpty(AppTitle)) { var titleAttribute = (AssemblyTitleAttribute)GetAttribute(mainAssembly, typeof(AssemblyTitleAttribute)); AppTitle = titleAttribute != null ? titleAttribute.Title : mainAssembly.GetName().Name; } var appCompany = companyAttribute != null ? companyAttribute.Company : ""; RegistryLocation = !string.IsNullOrEmpty(appCompany) ? $@"Software\{appCompany}\{AppTitle}\AutoUpdater" : $@"Software\{AppTitle}\AutoUpdater"; InstalledVersion = mainAssembly.GetName().Version; var webRequest = WebRequest.Create(AppCastURL); webRequest.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore); if (Proxy != null) { webRequest.Proxy = Proxy; } WebResponse webResponse; try { webResponse = webRequest.GetResponse(); } catch (Exception) { e.Cancel = false; return; } UpdateInfoEventArgs args; using (var appCastStream = webResponse.GetResponseStream()) { if (appCastStream != null) { if (ParseUpdateInfoEvent != null) { using (var streamReader = new StreamReader(appCastStream)) { var data = streamReader.ReadToEnd(); var parseArgs = new ParseUpdateInfoEventArgs(data); ParseUpdateInfoEvent(parseArgs); args = parseArgs.UpdateInfo; } } else { var receivedAppCastDocument = new XmlDocument(); try { receivedAppCastDocument.Load(appCastStream); var appCastItems = receivedAppCastDocument.SelectNodes("item"); args = new UpdateInfoEventArgs(); if (appCastItems != null) { foreach (XmlNode item in appCastItems) { var appCastVersion = item.SelectSingleNode("version"); try { CurrentVersion = new Version(appCastVersion?.InnerText); } catch (Exception) { CurrentVersion = null; } args.CurrentVersion = CurrentVersion; var appCastChangeLog = item.SelectSingleNode("changelog"); args.ChangelogURL = appCastChangeLog?.InnerText; var appCastUrl = item.SelectSingleNode("url"); args.DownloadURL = appCastUrl?.InnerText; if (Mandatory.Equals(false)) { var mandatory = item.SelectSingleNode("mandatory"); Boolean.TryParse(mandatory?.InnerText, out Mandatory); } args.Mandatory = Mandatory; var appArgs = item.SelectSingleNode("args"); args.InstallerArgs = appArgs?.InnerText; var checksum = item.SelectSingleNode("checksum"); args.HashingAlgorithm = checksum?.Attributes["algorithm"]?.InnerText; args.Checksum = checksum?.InnerText; } } } catch (XmlException) { e.Cancel = false; webResponse.Close(); return; } } } else { e.Cancel = false; webResponse.Close(); return; } } if (args.CurrentVersion == null || string.IsNullOrEmpty(args.DownloadURL)) { webResponse.Close(); if (ReportErrors) { throw new InvalidDataException(); } return; } CurrentVersion = args.CurrentVersion; ChangelogURL = args.ChangelogURL = GetURL(webResponse.ResponseUri, args.ChangelogURL); DownloadURL = args.DownloadURL = GetURL(webResponse.ResponseUri, args.DownloadURL); Mandatory = args.Mandatory; InstallerArgs = args.InstallerArgs ?? String.Empty; HashingAlgorithm = args.HashingAlgorithm ?? "MD5"; Checksum = args.Checksum ?? String.Empty; webResponse.Close(); if (Mandatory) { ShowRemindLaterButton = false; ShowSkipButton = false; } else { using (var updateKey = Registry.CurrentUser.OpenSubKey(RegistryLocation)) { if (updateKey != null) { var skip = updateKey.GetValue("skip"); var applicationVersion = updateKey.GetValue("version"); if (skip != null && applicationVersion != null) { var skipValue = skip.ToString(); var skipVersion = new Version(applicationVersion.ToString()); if (skipValue.Equals("1") && CurrentVersion <= skipVersion) { return; } if (CurrentVersion > skipVersion) { using (var updateKeyWrite = Registry.CurrentUser.CreateSubKey(RegistryLocation)) { if (updateKeyWrite != null) { updateKeyWrite.SetValue("version", CurrentVersion.ToString()); updateKeyWrite.SetValue("skip", 0); } } } } var remindLaterTime = updateKey.GetValue("remindlater"); if (remindLaterTime != null) { var remindLater = Convert.ToDateTime( remindLaterTime.ToString(), CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat); var compareResult = DateTime.Compare(DateTime.Now, remindLater); if (compareResult < 0) { e.Cancel = false; e.Result = remindLater; return; } } } } } args.IsUpdateAvailable = CurrentVersion > InstalledVersion; args.InstalledVersion = InstalledVersion; e.Cancel = false; e.Result = args; }
private static void BackgroundWorkerDoWork(object sender, DoWorkEventArgs e) { Assembly mainAssembly = Assembly.GetEntryAssembly(); var companyAttribute = (AssemblyCompanyAttribute)GetAttribute(mainAssembly, typeof(AssemblyCompanyAttribute)); var titleAttribute = (AssemblyTitleAttribute)GetAttribute(mainAssembly, typeof(AssemblyTitleAttribute)); AppTitle = titleAttribute != null ? titleAttribute.Title : mainAssembly.GetName().Name; string appCompany = companyAttribute != null ? companyAttribute.Company : ""; RegistryLocation = !string.IsNullOrEmpty(appCompany) ? string.Format(@"Software\{0}\{1}\AutoUpdater", appCompany, AppTitle) : string.Format(@"Software\{0}\AutoUpdater", AppTitle); RegistryKey updateKey = Registry.CurrentUser.OpenSubKey(RegistryLocation); if (updateKey != null) { object remindLaterTime = updateKey.GetValue("remindlater"); if (remindLaterTime != null) { DateTime remindLater = Convert.ToDateTime(remindLaterTime.ToString(), CultureInfo.CreateSpecificCulture("en-US")); int compareResult = DateTime.Compare(DateTime.Now, remindLater); if (compareResult < 0) { var updateForm = new UpdateForm(true); updateForm.SetTimer(remindLater); return; } } } InstalledVersion = mainAssembly.GetName().Version; WebRequest webRequest = WebRequest.Create(AppCastURL); webRequest.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore); WebResponse webResponse; try { webResponse = webRequest.GetResponse(); } catch (Exception) { if (CheckForUpdateEvent != null) { CheckForUpdateEvent(null); } return; } Stream appCastStream = webResponse.GetResponseStream(); var receivedAppCastDocument = new XmlDocument(); if (appCastStream != null) { receivedAppCastDocument.Load(appCastStream); } else { if (CheckForUpdateEvent != null) { CheckForUpdateEvent(null); } return; } XmlNodeList appCastItems = receivedAppCastDocument.SelectNodes("item"); if (appCastItems != null) { foreach (XmlNode item in appCastItems) { XmlNode appCastVersion = item.SelectSingleNode("version"); if (appCastVersion != null) { String appVersion = appCastVersion.InnerText; CurrentVersion = new Version(appVersion); if (CurrentVersion == null) { return; } } else { continue; } XmlNode appCastChangeLog = item.SelectSingleNode("changelog"); ChangeLogURL = GetURL(webResponse.ResponseUri, appCastChangeLog); XmlNode appCastUrl = item.SelectSingleNode("url"); DownloadURL = GetURL(webResponse.ResponseUri, appCastUrl); if (IntPtr.Size.Equals(8)) { XmlNode appCastUrl64 = item.SelectSingleNode("url64"); var downloadURL64 = GetURL(webResponse.ResponseUri, appCastUrl64); if (!string.IsNullOrEmpty(downloadURL64)) { DownloadURL = downloadURL64; } } } } if (updateKey != null) { object skip = updateKey.GetValue("skip"); object applicationVersion = updateKey.GetValue("version"); if (skip != null && applicationVersion != null) { string skipValue = skip.ToString(); var skipVersion = new Version(applicationVersion.ToString()); if (skipValue.Equals("1") && CurrentVersion <= skipVersion) { return; } if (CurrentVersion > skipVersion) { RegistryKey updateKeyWrite = Registry.CurrentUser.CreateSubKey(RegistryLocation); if (updateKeyWrite != null) { updateKeyWrite.SetValue("version", CurrentVersion.ToString()); updateKeyWrite.SetValue("skip", 0); } } } updateKey.Close(); } var args = new UpdateInfoEventArgs { DownloadURL = DownloadURL, ChangelogURL = ChangeLogURL, CurrentVersion = CurrentVersion, InstalledVersion = InstalledVersion, IsUpdateAvailable = false, }; if (CurrentVersion > InstalledVersion) { args.IsUpdateAvailable = true; if (CheckForUpdateEvent == null) { var thread = new Thread(ShowUI); thread.CurrentCulture = thread.CurrentUICulture = CurrentCulture ?? Application.CurrentCulture; thread.SetApartmentState(ApartmentState.STA); thread.Start(); } } if (CheckForUpdateEvent != null) { CheckForUpdateEvent(args); } }