AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects.
Under MIT License
By ravibpatel
AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects.
Under MIT License
By ravibpatel
AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects.
powershell
PM> Install-Package Autoupdater.NET.Official
AutoUpdater.NET downloads the XML file containing update information from your server. It uses this XML file to get the information about the latest version of the software. If the latest version of the software is greater than the current version of the software installed on User's PC then AutoUpdater.NET shows update dialog to the user. If user press the update button to update the software then It downloads the update file (Installer) from URL provided in XML file and executes the installer file it just downloaded. It is a job of installer after this point to carry out the update. If you provide zip file URL instead of installer then AutoUpdater.NET will extract the contents of zip file to application directory.
AutoUpdater.NET uses XML file located on a server to get the release information about the latest version of the software. You need to create XML file like below and then you need to upload it to your server.
````xml
2.0.0.0
http://rbsoft.org/downloads/AutoUpdaterTest.zip
https://github.com/ravibpatel/AutoUpdater.NET/releases
false
````
There are two things you need to provide in XML file as you can see above.
xml
<mandatory mode="2">true</mandatory>
xml
<mandatory minVersion="1.2.0.0">true</mandatory>
xml
<checksum algorithm="MD5">Update file Checksum</checksum>
After you done creating and uploading XML file, It is very easy to add a auto update functionality to your application. First you need to add following line at the top of your form.
csharp
using AutoUpdaterDotNET;
Now you just need to add following line to your main form constructor or in Form_Load event. You can add this line anywhere you like. If you don't like to check for update when application starts then you can create a Check for update button and add this line to Button_Click event.
csharp
AutoUpdater.Start("http://rbsoft.org/updates/AutoUpdaterTest.xml");
Start method of AutoUpdater class takes URL of the XML file you uploaded to server as a parameter.
AutoUpdater.Start should be called from UI thread.
AutoUpdater.NET uses Assembly version to determine the current version of the application. You can update it by going to Properties of the project as shown in following screenshot.
Version specified in XML file should be higher than Assembly version to trigger the update.
If you want to provide your own Assembly then you can do it by providing second argument of Start method as shown below.
csharp
AutoUpdater.Start("http://rbsoft.org/updates/AutoUpdaterTest.xml", myAssembly);
If you don't want AutoUpdater.NET to determine the installed version from assembly then you can provide your own version by assigning it to InstalledVersion field as shown below.
csharp
AutoUpdater.InstalledVersion = new Version("1.2");
If you like to use ftp XML URL to check for updates or download the update file then you can provide you FTP credentials in alternative Start method as shown below.
csharp
AutoUpdater.Start("ftp://rbsoft.org/updates/AutoUpdaterTest.xml", new NetworkCredential("FtpUserName", "FtpPassword"));
If you are using FTP download URL in the XML file then credentials provided here will be used to authenticate the request.
If you want to check for updates synchronously then set Synchronous to true before starting the update as shown below.
csharp
AutoUpdater.Synchronous = true;
If you don't want to show Skip button on Update form then just add following line with above code.
csharp
AutoUpdater.ShowSkipButton = false;
If you don't want to show Remind Later button on Update form then just add following line with above code.
csharp
AutoUpdater.ShowRemindLaterButton = false;
If you want to ignore previously set Remind Later and Skip settings then you can set Mandatory property to true. It will also hide Skip and Remind Later button. If you set Mandatory to true in code then value of Mandatory in your XML file will be ignored.
csharp
AutoUpdater.Mandatory = true;
You can enable forced updates by setting Mandatory property to true and setting UpdateMode to value of Mode.Forced
or Mode.ForcedDownload
. Mode.Forced
option will hide Remind Later, Skip and Close buttons on the standard update dialog. Mode.ForcedDownload
option will skip the standard update dialog and start downloading and updating the application without user interaction. Mode.ForceDownload
option will also ignore value of OpenDownloadPage flag.
csharp
AutoUpdater.Mandatory = true;
AutoUpdater.UpdateMode = Mode.Forced;
You can provide Basic Authentication for XML, Update file and Change Log as shown in below code.
csharp
BasicAuthentication basicAuthentication = new BasicAuthentication("myUserName", "myPassword");
AutoUpdater.BasicAuthXML = AutoUpdater.BasicAuthDownload = AutoUpdater.BasicAuthChangeLog = basicAuthentication;
Set the User-Agent string to be used for HTTP web requests so you can differentiate them in your web server request logs.
csharp
AutoUpdater.HttpUserAgent = "AutoUpdater";
You can turn on error reporting by adding below code. If you do this AutoUpdater.NET will show error message, if there is no update available or if it can't get to the XML file from web server.
csharp
AutoUpdater.ReportErrors = true;
If your application doesn't need administrator privileges to replace old version then you can set RunUpdateAsAdmin to false.
csharp
AutoUpdater.RunUpdateAsAdmin = false;
If you don't want to download the latest version of the application and just want to open the URL between url tags of your XML file then you need to add following line with above code.
csharp
AutoUpdater.OpenDownloadPage = true;
This kind of scenario is useful if you want to show some information to users before they download the latest version of an application.
If you don't want users to select Remind Later time when they press the Remind Later button of update dialog then you need to add following lines with above code.
csharp
AutoUpdater.LetUserSelectRemindLater = false;
AutoUpdater.RemindLaterTimeSpan = RemindLaterFormat.Days;
AutoUpdater.RemindLaterAt = 2;
In above example when user press Remind Later button of update dialog, It will remind user for update after 2 days.
If your XML and Update file can only be used from certain Proxy Server then you can use following settings to tell AutoUpdater.NET to use that proxy. Currently, if your Changelog URL is also restricted to Proxy server then you should omit changelog tag from XML file cause it is not supported using Proxy Server.
csharp
var proxy = new WebProxy("ProxyIP:ProxyPort", true)
{
Credentials = new NetworkCredential("ProxyUserName", "ProxyPassword")
};
AutoUpdater.Proxy = proxy;
You can specify where you want to download the update file by assigning DownloadPath field as shown below. It will be used for ZipExtractor too.
csharp
AutoUpdater.DownloadPath = Application.StartupPath;
If you are using a zip file as an update file then you can set the "InstallationPath" equal to the path where your app is installed. This is only necessary when your installation directory differs from your executable path.
csharp
var currentDirectory = new DirectoryInfo(Application.StartupPath);
if (currentDirectory.Parent != null)
{
AutoUpdater.InstallationPath = currentDirectory.Parent.FullName;
}
You can specify the size of the update form by using below code.
csharp
AutoUpdater.UpdateFormSize = new System.Drawing.Size(800, 600);
You can change how AutoUpdater.NET saves the Remind Later and Skip values by assigning the PersistenceProvider. If you don't provide a PersistenceProvider then it will save the values in Windows registry.
If you are using .NET 4.0 or above then you can use JsonFilePersistenceProvider instead of default RegistryPersistenceProvider as shown below.
csharp
string jsonPath = Path.Combine(Environment.CurrentDirectory, "settings.json");
AutoUpdater.PersistenceProvider = new JsonFilePersistenceProvider(jsonPath);
You can create your own PersistenceProvider by implementing IPersistenceProvider interface.
You can call Start method inside Timer to check for updates frequently.
csharp
System.Timers.Timer timer = new System.Timers.Timer
{
Interval = 2 * 60 * 1000,
SynchronizingObject = this
};
timer.Elapsed += delegate
{
AutoUpdater.Start("http://rbsoft.org/updates/AutoUpdaterTest.xml");
};
timer.Start();
csharp
DispatcherTimer timer = new DispatcherTimer {Interval = TimeSpan.FromMinutes(2)};
timer.Tick += delegate
{
AutoUpdater.Start("http://rbsoft.org/updates/AutoUpdaterTestWPF.xml");
};
timer.Start();
If you like to handle Application exit logic yourself then you can use ApplicationExitEvent like below. This is very useful if you like to do something before closing the application.
````csharp
AutoUpdater.ApplicationExitEvent += AutoUpdater_ApplicationExitEvent;
private void AutoUpdater_ApplicationExitEvent()
{
Text = @"Closing application...";
Thread.Sleep(5000);
Application.Exit();
}
````
Sometimes as a developer you need to maintain look and feel for the entire application similarly or you just need to do something before update. In this type of scenarios you can handle the updates manually by subscribing to an event. You can do it by adding following line with above code.
````csharp
AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent;
private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args)
{
if (args.Error == null)
{
if (args.IsUpdateAvailable)
{
DialogResult dialogResult;
if (args.Mandatory.Value)
{
dialogResult =
MessageBox.Show(
$@"There is new version {args.CurrentVersion} available. You are using version {args.InstalledVersion}. This is required update. Press Ok to begin updating the application.", @"Update Available",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
else
{
dialogResult =
MessageBox.Show(
$@"There is new version {args.CurrentVersion} available. You are using version {
args.InstalledVersion
}. Do you want to update the application now?", @"Update Available",
MessageBoxButtons.YesNo,
MessageBoxIcon.Information);
}
// Uncomment the following line if you want to show standard update dialog instead.
// AutoUpdater.ShowUpdateForm(args);
if (dialogResult.Equals(DialogResult.Yes) || dialogResult.Equals(DialogResult.OK))
{
try
{
if (AutoUpdater.DownloadUpdate(args))
{
Application.Exit();
}
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
else
{
MessageBox.Show(@"There is no update available please try again later.", @"No update available",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
else
{
if (args.Error is WebException)
{
MessageBox.Show(
@"There is a problem reaching update server. Please check your internet connection and try again later.",
@"Update Check Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
MessageBox.Show(args.Error.Message,
args.Error.GetType().ToString(), MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
````
When you do this it will execute the code in above event when AutoUpdater.Start method is called instead of showing the update dialog.
If you want to use other format instead of XML as an AppCast file then you need to handle the parsing logic by subscribing to ParseUpdateInfoEvent. You can do it as follows.
````csharp
AutoUpdater.ParseUpdateInfoEvent += AutoUpdaterOnParseUpdateInfoEvent;
AutoUpdater.Start("http://rbsoft.org/updates/AutoUpdaterTest.json");
private void AutoUpdaterOnParseUpdateInfoEvent(ParseUpdateInfoEventArgs args)
{
dynamic json = JsonConvert.DeserializeObject(args.RemoteData);
args.UpdateInfo = new UpdateInfoEventArgs
{
CurrentVersion = json.version,
ChangelogURL = json.changelog,
DownloadURL = json.url,
Mandatory = new Mandatory
{
Value = json.mandatory.value,
UpdateMode = json.mandatory.mode,
MinimumVersion = json.mandatory.minVersion
},
CheckSum = new CheckSum
{
Value = json.checksum.value,
HashingAlgorithm = json.checksum.hashingAlgorithm
}
};
}
````
json
{
"version":"2.0.0.0",
"url":"http://rbsoft.org/downloads/AutoUpdaterTest.zip",
"changelog":"https://github.com/ravibpatel/AutoUpdater.NET/releases",
"mandatory":{
"value":true,
"minVersion": "2.0.0.0",
"mode":1
},
"checksum":{
"value":"E5F59E50FC91A9E52634FFCB11F32BD37FE0E2F1",
"hashingAlgorithm":"SHA1"
}
}