private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEventArgs asyncCompletedEventArgs) { if (asyncCompletedEventArgs.Cancelled) { return; } try { if (asyncCompletedEventArgs.Error != null) { throw asyncCompletedEventArgs.Error; } if (_args.CheckSum != null) { CompareChecksum(_tempFile, _args.CheckSum); } ContentDisposition contentDisposition = null; if (_webClient.ResponseHeaders["Content-Disposition"] != null) { contentDisposition = new ContentDisposition(_webClient.ResponseHeaders["Content-Disposition"]); } var fileName = string.IsNullOrEmpty(contentDisposition?.FileName) ? Path.GetFileName(_webClient.ResponseUri.LocalPath) : contentDisposition.FileName; var tempPath = Path.Combine( string.IsNullOrEmpty(AutoUpdater.DownloadPath) ? Path.GetTempPath() : AutoUpdater.DownloadPath, fileName); if (File.Exists(tempPath)) { File.Delete(tempPath); } File.Move(_tempFile, tempPath); string installerArgs = null; if (!string.IsNullOrEmpty(_args.InstallerArgs)) { installerArgs = _args.InstallerArgs.Replace("%path%", Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)); } var processStartInfo = new ProcessStartInfo { FileName = tempPath, UseShellExecute = true, Arguments = installerArgs }; var extension = Path.GetExtension(tempPath); if (extension.Equals(".zip", StringComparison.OrdinalIgnoreCase)) { string installerPath = Path.Combine(Path.GetDirectoryName(tempPath), "ZipExtractor.exe"); File.WriteAllBytes(installerPath, Resources.ZipExtractor); string executablePath = Process.GetCurrentProcess().MainModule.FileName; string extractionPath = Path.GetDirectoryName(executablePath); if (!string.IsNullOrEmpty(AutoUpdater.InstallationPath) && Directory.Exists(AutoUpdater.InstallationPath)) { extractionPath = AutoUpdater.InstallationPath; } StringBuilder arguments = new StringBuilder($"\"{tempPath}\" \"{extractionPath}\" \"{executablePath}\""); string[] args = Environment.GetCommandLineArgs(); for (int i = 1; i < args.Length; i++) { if (i.Equals(1)) { arguments.Append(" \""); } arguments.Append(args[i]); arguments.Append(i.Equals(args.Length - 1) ? "\"" : " "); } processStartInfo = new ProcessStartInfo { FileName = installerPath, UseShellExecute = true, Arguments = arguments.ToString() }; } else if (extension.Equals(".msi", StringComparison.OrdinalIgnoreCase)) { processStartInfo = new ProcessStartInfo { FileName = "msiexec", Arguments = $"/i \"{tempPath}\"" }; if (!string.IsNullOrEmpty(installerArgs)) { processStartInfo.Arguments += " " + installerArgs; } } if (AutoUpdater.RunUpdateAsAdmin) { processStartInfo.Verb = "runas"; } try { Process.Start(processStartInfo); } catch (Win32Exception exception) { if (exception.NativeErrorCode == 1223) { _webClient = null; } else { throw; } } } catch (Exception e) { MessageBox.Show(e.Message, e.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); _webClient = null; } finally { Close(); } }
private static object CheckUpdate(Assembly mainAssembly) { var companyAttribute = (AssemblyCompanyAttribute)GetAttribute(mainAssembly, typeof(AssemblyCompanyAttribute)); string appCompany = companyAttribute != null ? companyAttribute.Company : ""; if (string.IsNullOrEmpty(AppTitle)) { var titleAttribute = (AssemblyTitleAttribute)GetAttribute(mainAssembly, typeof(AssemblyTitleAttribute)); AppTitle = titleAttribute != null ? titleAttribute.Title : mainAssembly.GetName().Name; } string registryLocation = !string.IsNullOrEmpty(appCompany) ? $@"Software\{appCompany}\{AppTitle}\AutoUpdater" : $@"Software\{AppTitle}\AutoUpdater"; if (PersistenceProvider == null) { PersistenceProvider = new RegistryPersistenceProvider(registryLocation); } BaseUri = new Uri(AppCastURL); UpdateInfoEventArgs args; using (MyWebClient client = GetWebClient(BaseUri, BasicAuthXML)) { string xml = client.DownloadString(BaseUri); if (ParseUpdateInfoEvent == null) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(UpdateInfoEventArgs)); XmlTextReader xmlTextReader = new XmlTextReader(new StringReader(xml)) { XmlResolver = null }; args = (UpdateInfoEventArgs)xmlSerializer.Deserialize(xmlTextReader); } else { ParseUpdateInfoEventArgs parseArgs = new ParseUpdateInfoEventArgs(xml); ParseUpdateInfoEvent(parseArgs); args = parseArgs.UpdateInfo; } } if (string.IsNullOrEmpty(args.CurrentVersion) || string.IsNullOrEmpty(args.DownloadURL)) { throw new MissingFieldException(); } args.InstalledVersion = mainAssembly.GetName().Version; args.IsUpdateAvailable = new Version(args.CurrentVersion) > mainAssembly.GetName().Version; if (!Mandatory) { if (string.IsNullOrEmpty(args.Mandatory.MinimumVersion) || args.InstalledVersion < new Version(args.Mandatory.MinimumVersion)) { Mandatory = args.Mandatory.Value; UpdateMode = args.Mandatory.UpdateMode; } } if (Mandatory) { ShowRemindLaterButton = false; ShowSkipButton = false; } else { // Read the persisted state from the persistence provider. // This method makes the persistence handling independent from the storage method. var skippedVersion = PersistenceProvider.GetSkippedVersion(); if (skippedVersion != null) { var currentVersion = new Version(args.CurrentVersion); if (currentVersion <= skippedVersion) { return(null); } if (currentVersion > skippedVersion) { // Update the persisted state. Its no longer makes sense to have this flag set as we are working on a newer application version. PersistenceProvider.SetSkippedVersion(null); } } var remindLaterAt = PersistenceProvider.GetRemindLater(); if (remindLaterAt != null) { int compareResult = DateTime.Compare(DateTime.Now, remindLaterAt.Value); if (compareResult < 0) { return(remindLaterAt.Value); } } } return(args); }