I've been running some tests this morning on how to do this, since I want to do it with Comicster and I think it'll come in handy with work projects as well. For my own reference, and in case anyone else needs it, I thought I'd document it here.

Let's say you have an application already installed on users' desktops, but you're making a pretty major change and want to roll out a beta version before you give everyone the next update.

In this example I'll use 1.0.1.0 as the version that everyone's currently running, and they all installed that version from http://example.com/install.

Your beta version, then, will be version 1.0.1.1. You don't want it showing up in your users' "check for updates" procedures, so you publish it to http://example.com/beta. Don't forget to use that URL as the "update location" (or don't specify one, in which case it'll use that anyway)! You then contact the users you want to beta test this version and give them the new install location.

Because the beta version has the same application name and is signed with the same code-signing certificate, ClickOnce knows that it's the same app and doesn't install it side-by-side with 1.0.1.0. Instead, it updates your beta testers to version 1.0.1.1.

Your testers might find a few bugs in this version, so you put out version 1.0.1.2. Again, you publish this version to http://example.com/beta and your beta testers will automatically pick this version up.

Things are rocking along now, and you're up to version 1.0.1.8 and ready to go live with all your users. Here's what you do:

  1. Publish version 1.0.1.9 to your original install location, http://example.com/install, so your old users get it in their automatic updates.
  2. Now bump the ClickOnce version back to 1.0.1.9 again, and change the publish destination to http://example.com/beta, but (and here's the trick), set the update location to http://example.com/install.

Your beta users now will run their existing beta version, and it'll see that there's a new 1.0.1.9 version at http://example.com/beta. However, when it attempts to install this, it'll actually grab the 1.0.1.9 "live" version from http://example.com/install! Your beta users are now back on the main branch of the ClickOnce tree!

Hope all these version numbers and URLs don't make this post too confusing. This little trick should serve me well in future versions of Comicster and other ClickOnce-deployed applications, and I hope it works for you too.