We are in a process of developing a really complex system consisting of several WCF services, ASP.NET MVC applications, administration tools (Windows Forms apps)... Some of those, will have instances running on several servers. We are looking for a good auto update solution for such a system. Most likely, we would need a separate auto update application (service) that will do the job, or some centralized admin application that will know about versions of all installed instances and do the update remotely. Is there any good product/library, made for this purpose, that you know about or had experience with?
Personally I'm using a very simple methodology for any kind of auto-update:
- Have an installer
- Check the new version (simple WebClient and compare numbers with your current AssemblyVersion)
- If the version is higher download the latest installer (should be over SSL for security reasons)
- Run the downloaded installer and close the application. (in this stage you need to admin privileges if your installer requires to be admin)
Installer should take care of the rest. This you'll always have the latest version and an installer with a latest version.
We investigated a handful of options and decided to use the AppLife Update library for our enterpise project.
AppLife Update can quickly and easily add auto update functionality for your .NET apps but is also flexible because of it's comprehensive API.
See the full list of features and some demo videos on their website.
For simple WPF applications, those that maybe use Xcopy install, you can use this AppUpdater module. It's one source module, just a few lines of code, to add update capability to a simple WPF app.
It's free.
Let me start by saying we offer a complete updating solution which includes:
- An open source updater, wyUpdate, written in C#
- The free AutomaticUpdater control that you can just add to your .NET app's form
- wyBuild is used to build patches and manage your versions
wyUpdate handles all of the Vista/Windows 7 UAC problems and all the file permission problems that inevitably pop up when you're trying to update complex software.
That being said, if you want to build your own updater here are some tips:
Building your own updater
A good place to start is the wyUpdate C# source code I mentioned above. You can cannibalize it and use it for your own purposes. Some of the algorithms it contains:
- Full Windows Vista / Windows 7 UAC support
- Ability for limited users to check and then update if they have credentials
- Support for wonky corporate inernet. (If you've ever worked with a corporation this is a real problem).
- Quick extracting, patching, and installing of files.
- Registry support.
- Roll back files & registry on error or cancellation by the user
- Self-update (no files left behind)
We also have the file specifications here.
Automatic updating
Since being automatic is a requirement let me tell you how we do it with our AutomaticUpdater control.
We use named pipes to communicate between the standalone updater (wyUpdate) and the Automatic Updater control sitting on your program's form. wyUpdate reports progress to the Automatic Updater, and the Automatic Updater can tell wyUpdate to cancel progress, to start downloading, start extracting, etc.
This keeps the updater separate from your application.
In fact, the exact named pipes C# code we use is included in an article I wrote a little while back: Multi-process C# app like Google Chrome.
Hello vucetica,
I want to recommend you BitsUpdater. It is simple and extendable library for automatic update process using BITS (technology used by Windows Update).
There is a sample for processes (special project called ApplicationLauncher) and you can extend library with your own solution for updating WCF or any other services (database, ASP.NET application).
Here's an open-source solution I wrote to address specific needs we had for WinForms and WPF apps. The general idea is to have the greatest flexibility, at the lowest overhead possible.
So, integration is super-easy, and the library does pretty much everything for you, including synchronizing operations. It is also highly flexible, and lets you determine what tasks to execute and on what conditions - you make the rules (or use some that are there already). Last by not least is the support for any updates source (web, BitTorrent, etc) and any feed format - whatever is not implemented you can just write for yourself.
Cold updates (requiring an application restart) is also supported, and done automatically unless "hot-swap" is specified for the task.
This boild down to one DLL, less than 70kb in size.
More details at http://www.code972.com/blog/2010/08/nappupdate-application-auto-update-framework-for-dotnet/
Code is at http://github.com/synhershko/NAppUpdate (Licensed under the Apache 2.0 license)
I plan on extending it more when I'll get some more time, but honestly you should be able to quickly enhance it yourself for whatever it currently doesn't support.
Auto-updating WCF services and ASP.NET websites should be possible to do as well with it, using "hot-swap" of files and "iisreset" task where necessary.