# AutoUpdater.NET: XML-driven auto updates for WinForms and WPF apps

> AutoUpdater.NET is an MIT-licensed C# library that checks an XML file on your server and updates a classic desktop app. It suits WinForms and WPF projects that ship an installer or a zip, and it leaves the actual update to that installer.

**ravibpatel/AutoUpdater.NET** — AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects.

- Repository: https://github.com/ravibpatel/AutoUpdater.NET
- Stars: 3,531 · Forks: 820
- Language: C#
- License: MIT
- Published: 2026-09-23 · Updated: 2026-09-23 · Language: en
- Canonical page: https://hysenlabs.com/projects/ravibpatel-autoupdater-net

## The problem AutoUpdater.NET solves for classic desktop apps

A WinForms or WPF application has no built-in channel for telling users a newer build exists. Users keep running whatever they installed, and support turns into emailing installers. AutoUpdater.NET fills that gap with a small class library: the app asks a server for release information, compares versions, and offers the update. The README frames the scope narrowly, calling it a class library that lets .NET developers "easily add auto update functionality to their classic desktop application projects." That word, classic, is doing real work. This is not for ASP.NET services, console daemons, or MAUI apps. The README states plainly that the library only works for WinForms or WPF application projects, and it lists .NET Framework 4.6.2 or above, .NET Core 3.1, and .NET 5.0 or above as supported runtimes. Windows 8 or above is the supported OS. If your product is a web app or a Linux service, this library is the wrong tool and no amount of configuration fixes that.

## How the XML release file drives the update flow

The mechanism is deliberately boring, which is a compliment. Your app calls AutoUpdater.Start with the URL of an XML file you host. The library downloads that XML, reads the version element, and compares it against the Assembly version of the running application. If the XML version is higher, an update dialog appears. If the user presses the update button, the library downloads the file at the url element and executes it. Everything after that point belongs to your installer. That division of responsibility is the design's defining trait: AutoUpdater.NET orchestrates the check and the download, but it does not install anything itself.

The XML file carries a few optional levers. changelog points at a page the dialog can show. mandatory, when set to true, hides the Skip and Remind Later buttons so the user cannot defer. The mandatory element also accepts attributes: mode="1" hides the Close button as well, and mode="2" skips the dialog entirely and starts downloading and updating automatically. A minVersion attribute makes mandatory apply only when the installed version is below the value you name. The checksum element lets you pin an expected hash, with algorithm attributes for MD5, SHA1, SHA256, SHA384, and SHA512, so the library verifies the downloaded file before running it. If you point url at a zip instead of an installer, the library extracts the contents into the application directory, which is why the README notes that Windows versions below 8 need .NET Framework 4.5 or above for ZipExtractor to work.

## Installing AutoUpdater.NET and wiring up a first check

The package is published on NuGet as Autoupdater.NET.Official. The README gives the Package Manager Console command:

```powershell
PM> Install-Package Autoupdater.NET.Official
```

Once the reference is in place, add the namespace to the form that should trigger the check:

```csharp
using AutoUpdaterDotNET;
```

Then call Start with the URL of your XML file. The README places this in the main form constructor or the Form_Load event, and notes it can also live in a button click handler if you prefer a manual check. One constraint is stated explicitly: AutoUpdater.Start should be called from the UI thread.

```csharp
AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml");
```

The XML you host needs at minimum a version and a url. The README's example looks like this:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<item>
  <version>2.0.0.0</version>
  <url>https://rbsoft.org/downloads/AutoUpdaterTest.zip</url>
  <changelog>https://github.com/ravibpatel/AutoUpdater.NET/releases</changelog>
  <mandatory>false</mandatory>
</item>
```

The version must be in X.X.X.X format, and it must be higher than the Assembly version of the installed app for anything to happen. If you run the app with a matching or lower XML version, expect no dialog at all. That silence is the most common first-run confusion, and the README addresses it directly in its section on current version detection.

## Where the update chain breaks

The library stops at the installer, and that is a genuine limitation rather than a footnote. If your installer cannot run silently or cannot replace files while the app is open, the user sees your installer's UI and whatever prompts it shows. AutoUpdater.NET has no opinion about that. The README says it is the job of the installer to carry out the update, so any failure in the installer's logic is outside this library's scope.

The zip path has its own edges. Extracting into the application directory assumes the process can write there, which fails for installs under Program Files without elevation. The executable element exists for this reason: if the update renames or moves the main binary, you supply the new path relative to the installation directory, for example bin\AutoUpdaterTest.exe. Forget that and the app may relaunch the old executable.

Version detection depends on the Assembly version, which many teams set once and never bump. If your build pipeline does not update it, the check compares against a stale number and either fires forever or never fires. The README also notes you can pass a custom Assembly as the second argument to Start, which is the escape hatch for builds that version assemblies differently. Finally, the mandatory mode="2" setting removes the user's ability to decline. That is a policy decision, not a technical one, and it is worth being sure you want an update that starts downloading without any dialog.

## AutoUpdater.NET compared with Squirrel

Squirrel is the alternative people most often weigh against this library, and the two take different approaches to the same problem. Squirrel is an installation and update framework: it packages your app, manages versions on disk, and swaps releases in place, so the update mechanism owns the install layout. AutoUpdater.NET does not own any of that. It reads an XML file, downloads a file, and hands control to an installer or extracts a zip. Your existing installer and directory layout stay exactly as they are.

That difference decides most adoption questions. If you already ship an MSI or an Inno Setup installer and just want a version check with a download prompt, AutoUpdater.NET adds one line to your form and one XML file to your server. If you want the framework to manage side-by-side versions and roll back by switching directories, AutoUpdater.NET does not do that, and the README does not document rollback at all. The lighter model is also the less capable one, and there is no way to configure your way past that boundary.

## Maintenance, licensing, and what an upgrade costs

The repository is not archived, and the last push was on 2026-07-28, which is also the date of the v1.9.3 release. The previous release, v1.9.2, landed on 2024-08-02, so the gap between v1.9.2 and v1.9.3 is roughly two years. That cadence matters for planning: this is a library that gets attention in bursts rather than a steady stream of patches. The source tree is small, with AutoUpdater.NET/, AutoUpdaterTest/, and ZipExtractor/ as the main project directories, so reading the code before adopting it is realistic.

Upgrade cost is low by design. The public surface described in the README is essentially AutoUpdater.Start plus the XML schema, and the XML schema is additive: checksum, executable, args, and the mandatory attributes are all optional. A project using only version, url, and changelog has little to change when the library moves forward.

The licence is MIT, which permits commercial and closed-source use. That is a statement about the licence text, not legal advice; if your organisation has specific redistribution or attribution requirements, have counsel read the LICENSE file in the repository rather than relying on a summary.

## Conclusion

Adopt AutoUpdater.NET if you ship a WinForms or WPF desktop app with an installer or a zip and you already control a web server that can host one XML file. Do not adopt it if you need cross-platform updates, delta patching, or a full installation framework, since the README scopes it to WinForms and WPF and hands the actual install to your installer. Before you commit, verify three things: your Assembly version is set the way the README describes, your XML version is higher than that Assembly version, and the Install-Package Autoupdater.NET.Official package resolves for your target framework.

## FAQ

### Does AutoUpdater.NET update a .NET application automatically?

It can. By default it shows an update dialog and waits for the user to press the update button, but setting the mandatory element to true with mode="2" in the XML makes it skip the dialog and start downloading and updating automatically.

### How do I install AutoUpdater.NET in a WinForms or WPF project?

Install the Autoupdater.NET.Official NuGet package, add using AutoUpdaterDotNET to your form, and call AutoUpdater.Start with the URL of your XML file from the UI thread.

### Which .NET and Windows versions does AutoUpdater.NET support?

The README lists .NET Framework 4.6.2 or above, .NET Core 3.1, and .NET 5.0 or above, running on Windows 8 or above. Windows versions below 8 need .NET Framework 4.5 or above for ZipExtractor, or you can ship an installer instead of a zip.

### Why does AutoUpdater.NET not show an update dialog?

The version in your XML file must be higher than the Assembly version of the installed application. If it is equal or lower, no dialog appears, so check the Assembly version first.

## Sources

- [Issues](https://github.com/ravibpatel/AutoUpdater.NET/issues)
- [License: MIT](https://github.com/ravibpatel/AutoUpdater.NET/blob/master/LICENSE)
- [ravibpatel/AutoUpdater.NET on GitHub](https://github.com/ravibpatel/AutoUpdater.NET)
- [README](https://github.com/ravibpatel/AutoUpdater.NET/blob/master/README.md)
- [Releases](https://github.com/ravibpatel/AutoUpdater.NET/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/ravibpatel-autoupdater-net
