WiX is the least-bad installer option

Published on Monday, July 7, 2014

Photo by Jan Loyde Cabrera on Unsplash

I've got a Windows application I've been working on which used to use the old Visual Studio Setup Projects. If you've never had the joy of working with VS setup projects, for most people it can probably be best summed up by Douglas Adams's comparison to Macbeth: "initial doubts, followed by cautious enthusiasm and then greater and greater alarm at the sheer scale of the undertaking and still no end in sight." They work wonderfully well at first when all you want to do is put some files in a folder and maybe make a shortcut. But as soon as you venture into more complicated territory (say, installing a service, or running an initialization script) you enter a world of pain in the form of conflicting (or non-existent) documentation, corrupted installs, non-reproducible behavior, and other nonsense1.

Regardless, as of VS 2012 they were given the boot; Microsoft had clearly never given a lot of thought or effort toward maintaining the toolset and seemed very happy to simply wash their hands of it. Of course, there was wailing and gnashing of teeth - no one likes seeing a feature they use get cut, even if it's a feature they largely hate.

But by way of appeasement, or something, in what felt like a throwback to 2002 Visual Studio started (sort of) shipping with InstallShield Limited Edition. Basically, you could convert your old setup project into this new format and get a shiny InstallShield installer, as long as you didn't need any complex features. If you did need complex features, well, you could always upgrade to a much pricier version of InstallShield.

Now, I used the full-fledged professional version of InstallShield a bunch back in 2005 or so, and it was pretty darn good. So when I decided that the instability I was seeing in VS 2010 while working on this project was just too much2, I was kind of excited to make the forced change to another installer.

So here's the thing: the InstallShield experience within Visual Studio was appallingly bad. I'm not sure if it was an attempt to make VS Setup Project users more comfortable or simply mass brain trauma at Flexera, but the product is only marginally more usable than the old setup projects. And to make things more fun, it happily generated about 10,000 files of junk in as many directories when all I wanted was an .msi file.

I considered just biting the bullet and upgrading to a paid edition, but Flexera committed two sins which stopped me:

  1. No prices on the website, just a bunch of options for "contacting sales". No thanks, guys. I want another software salesman constantly "reaching out" to me like I want a bullet to the head.

  2. Hey, there's some sort of "online store" link, let's try that:

Flexera HTTPS Error

Yeah, these guys are not getting my credit card.

To make a long story short3, I decided to give WiX another shot.

I tried this once before with a client who wanted to move some projects to VS 2012. They needed a way to build their installers and I saw this open-source toolset that could do it so I gave it a shot. The experience was not good. But that was a few years ago, and given the progress they've made (especially with documentation) and the alternatives, I can happily say that I'll probably use WiX for all future installers.

Like I said, the documentation has gotten better and there's a lot of help available on Stack Overflow. I was able to muddle through a basic installer with some dialogs and a Start Menu shortcut pretty quickly. The only major hurdle was getting all of my project output into the installer. This post is already kind of long, so I'll cover that in the next one.

  1. For instance, you couldn't build them with msbuild.exe. You want continuous integration? You have to install VS on your build server. That's just ridiculous. 
  2. It's a WPF app, and the XAML designer in VS 2010 was never all that speedy. But now it was occasionally just giving up entirely, and in general VS 2013 is just a lot snappier. 
  3. Too late.