Keith Elder has some good points. If you're delivering your app across an Enterprise and need to install updates quickly, then following his advice is probably best.
If you're distributing your apps to customers and want a more traditional "all user" install then you should use installer software (NSIS, InnoSetup, WiX, etc.) and either a 3rd party updater or build your own updater.
Let me start by saying we offer a complete updating solution which includes:
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
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.