I coded an updater for an app I worked on in C++, but the general structure would be the same.
- App checks an URL for version number or other identifier change
- App pulls down new updater app from network
- App runs new updater app (which could include code for unforseen changes in update process), and then app exits
- New updater waits for app to exit, then downloads and installs new "stuff", etc.
This worked pretty well for us, and as it always downloaded a new "updater" as the first thing it did, we could handle some funky new things that might not work otherwise.