The Paint.NET install experience — Part 2, version 4.0

In my previous post I detailed the epic adventure of a normal user installing Paint.NET v3.xx on a "fresh" XP SP2 computer. I also said that I’ve made it a lot easier in Paint.NET v4. Let’s check it out:

Again, from the top, the user has excitedly downloaded the Paint.NET installer, and goes to double click on it …

The first thing we get is a dialog telling the user what’s going to be installed. Since this is a fresh XP SP2 box with no updates installed yet, they will need Windows Installer 3.1, .NET Framework 3.5 SP1, and of course Paint.NET. Compare this to the old dialog that tells the user what they need, and barely helps them to get it all.

Once the user clicks OK, the Windows Installer 3.1 package will be installed in automatic ("passive") mode. Installation will begin immediately, and the user will not need to click on any "Next" or "Finish" buttons. It will close once it’s done.

It installs fairly fast, and that’s good because most people will have no clue what any of the stuff on the dialog means.

Next, the .NET Client Profile package will also be installed in automatic ("passive") mode. Installation begins immediately — there’s no need to futz with buttons saying Accept, Next, or Finish, and it closes once it’s done.

This part can take awhile depending on your Internet connection, and I really wish they had a better UI to indicate this. The alternative is to add tens of megabytes to the download ZIP. I haven’t customized the graphics in the .NET Framework Client Profiler installer yet, but I plan to in order to make it more apparent that this is part of the Paint.NET install flow.

Finally, the Paint.NET v4 installer is launched! Ok, now the user finally has to worry about buttons saying Next, Accept, and Finish.

Note that the header graphics are just placeholders, I’m still figuring out what exactly I want there. I need a good "night" picture to put behind the white-text version of the logo šŸ™‚

The installation progresses …

By the way, the "optimizing" portion of installation is much faster now with .NET 3.5 SP1 because of improvements to NGEN.

Once the user clicks "Finish" on the last page of the installer, they will be asked to reboot. This is because Windows Installer 3.1 requires it. (Remember, this blog post details installation on a "fresh" XP SP2 system! Most users will not have to worry about this rebooting nonsense.) I’ve written my install flow to only require a reboot at the very end of all the installations. Rebooting in the middle causes a lot of continuity problems and is a horrible user experience. Most systems won’t have to reboot though, as Microsoft has done a pretty good job of not requiring it for .NET itself. The v3.xx releases of Paint.NET actually cheat here and simply tell the user they should restart. Most people don’t see this, or ignore it, and it actually causes crashes and whatnot. So, yes, a new feature of Paint.NET v4: a reboot dialog! You heard it hear first! šŸ™‚

And there you have it. Once the user has their hands on the Paint.NET v4 installer, that’s all they have to figure out. The rest is done for them. Once they restart, they’ve got Paint.NET installed. No ifs, ands, or buts. The barrier to entry for Paint.NET has been dramatically reduced.

So far the Paint.NET v4 download is about 3.7MB and includes Windows Installer 3.1, .NET Framework 3.5 SP1 Client Profile bootstrapper, Visual C++ 2008 SP1 runtimes (x86 and x64)*, the OpenMP redistributable (x86 and x64), and of course Paint.NET. I’ve done a lot of work and experimenting to figure out the best way to pack things together to get the smallest download possible — that 3.7MB actually expands to over 20MB in the temp directory!

Anyway that’s enough on the installer for now. My next chunk of work on Paint.NET v4 is in the guts of the rendering engine with the goal of dramatically reducing the memory footprint, and increasing rendering throughput on many-core (4x and up) systems.

* Version 3.xx uses the static versions of the runtime. Using the DLL version is preferred, for various reasons, and so I decided that Paint.NET v4 would finally switch to it.

33 thoughts on “The Paint.NET install experience — Part 2, version 4.0

  1. Mathias says:

    It would still be nice to offer a clean installer without WI 3.1 and .Net bootstrapper as both are getting more popular with Vista and regular updates and such.
    And I would be a little worried if pdn told me to reboot my computer, so I would like to read that its WI 3.1 that needs the reboot.

  2. Rick Brewster says:

    Mathias — I do have ‘install’ and ‘update’ flavors for the ZIP, the latter of which excludes Windows Installer and the .NET bootstrapper. Right now I’m planning to only offer the ‘install’ ZIP through the website, and use the second one for the built-in updater to save bandwidth. I’m not convinced it’s worth adding confusion to save some people 2MB on their download. If it were a 20MB difference, then yes of course.

  3. MiguelPereira says:

    Rick this is amazing, your work on the installer will help lots of people, and the troubleshooting forum on PdN Forums will dramatically decrease the number of posts “OMG!!!1 paint.net won’t install. HELP :(” , etc… Whatever.

    Anyways thanks for letting us know how the development of v4 is going :), and an idea would be to throw around the forums one or two contests for the design of the new banner and stuff for Paint.NET, or ask Helio or Ash or usedHONDA for ideas… I’m mean… Just a thought anyways.

  4. Mathias says:

    Not that I care anyway as I will use the updater most of the time (and I never expected you to put them into the update), but I like having the choice at install time. Usually a “recommended” and a “only if you know what youre doing” download (the latter in small letters and a little hidden) fixes the confusion joe average has.

  5. Nidonocu says:

    According to the stuff on the schema here: http://msdn.microsoft.com/en-us/library/cc656920.aspx
    There is some way of giving the UI some download information. I’m yet to work out quite how to do this (and the only way I’ve found to customize the installer at all is to start the redistributable file, extract all the files from the tempfolder in C and then fiddle with all the extracted xml files).

  6. Francis GagnƩ says:

    I’m sure it’s not quite in its final state, but the first message box should have a little more information. Looking at it with only this information, the user might ask “Why does it install all that? I don’t want that.” and click Cancel instead of installing the application. I think it should say “Paint.NET needs additional components in order to function.” Also, there should be a mention somewhere (probably in this same message box) that Internet access is required, so the user knows if he can install it right away. Also, as Mathias, telling the user what requires the reboot might reassure the user that it’s for something the user probably doesn’t care about updating.

  7. Rick Brewster says:

    Francis — I agree with you in principal that the first dialog should be more descriptive, and state that an Internet connection is required.

    However, there are two caveats to doing that.

    First, not many people will really read the dialog anyway (and more text = less chance), so it probably won’t matter šŸ™‚ (However, the effort to add this information is small, making this relatively moot…)

    Second, I don’t have a good way to localize the content of that dialog because of the way *my* setup bootstrapping works. That dialog is from a small exe written in C, and I don’t have a localization process set up for that right now, nor have I really written my own localization for non-.NET code.

    As it currently is, the dialog is very succinct and at least stands a chance of being slightly parseable (“hey it’s a bulleted list, and Paint.NET is at the end of it”) or ignorable for non-English users. (I could be grossly wrong though.)

    As for informing the user ahead of time about the reboot … technically, I don’t know for a fact that a reboot will be required until after any of the installers has completed (error code 3010 gets returned). There’s also the salesman in me that would rather the user install and then find out about the reboot, instead of deciding up front that the reboot will prevent them from wanting to install it at all. I’m not sure it warrants adding yet more text to the dialog, especially when only a small number of users will be affected by it (remember: fresh XP SP2 installations!).

  8. miechu says:

    This is nice, but the need of a full download (as in packed everything in it) is a must since people are sometimes behind proxies or whatever that block for eg. download.microsoft.com (I’ve seen this a lot of times), so having a ‘redistributable’ šŸ˜‰ (imho) is a must.

  9. Rick Brewster says:

    miechu — I’m not putting a 200MB download on my website. Many people end up going for the “safest” download, and will always grab that one instead of the more sensibly sized ones.

  10. Fleet Command says:

    About system restart requirement. You wrote:
    >> Once the user clicks “Finish” on the last page of the installer, they will be asked to reboot. This is because Windows Installer 3.1 requires it.

    I find this restart dialog box completely unnecessary. You see, Windows Installer 3.1 requires a restart so that if Windows Installer files were in use during update and could not be replaced, they’d be replaced during the restart.

    However, the important point is: Since .NET Framework 3.5 requires Windows Installer 3.1, if you manage to successfully install it, then it means that Windows Installer 3.1 is already installed perfectly and never needed a restart. Since Paint.NET itself doesn’t need a restart, your users just get to see a restart prompt that is never necessary.

    Bottom line is: The system may need to be restarted right after Windows Installer 3.1 and before installation of .NET Framework 3.5.

  11. Rick Brewster says:

    miechu — We’ll see what type of feedback I get. I just don’t want people to get confused, which I have seen in the past with that sort of multiple download inventory. “Why do I need to download 200 MB?!?!” If there’s only 1 zip available, then there’s no possibility for ambiguity.

    Fleet — Well, some parts of the documentation talk about running multiple installers in a row and suppressing reboot prompts. So, it seems that it’s aware of the changes made by previous MSI’s, and can handle them…

    … In any case, even though WI3.1 states it needs a restart, and .NET states it needs it as a dependency, it does *work*. So, unless I start getting a ton of weird bug reports, I think I’d like to stay with this install flow rather than have a restart in the middle of it!

  12. Michael Ragsdale says:

    Rebooting and MSI 3.1:

    I was playing around with the trial of InstallShield (don’t really like but that’s off topic) and one of the options you can do:
    Suppress Windows Installer Reboot AND Suppress .NET Framework reboot, deferring both reboots until the end of your complete install

    So, yes it’s possible šŸ™‚

  13. miechu says:

    heh, yes I understand what you are saying… but this is the same with vs express, to get the full cd you’ve got to dig deep… so… maybe… a really… really… small link? in gray? light gray? šŸ˜‰

    It’s just a suggestion…

  14. Rick Brewster says:

    miechu — The effort is not proportional to the size of the link on the website … it’s not going to happen. I would rather link to Microsoft’s site, if you really want to burn it on a CD or something.

  15. Michael Ragsdale says:

    No problem šŸ™‚

    Through further testing, I found out that it’s possible – even if your app wants a reboot – to suppress everything until one at the end. Of course, being cheap, I decided to use Inno Setup (but that’s off topic again)

  16. Tony says:

    Running the same Client Profile setup.exe on XP with no Framework and XP with Framework 2.x preinstalled I get these download and installation times:

    XP no Framework:15 minutes
    XP with Framework 2.x: 54 minutes

    Shouldn’t download and install when 2.x is already there be even faster?
    Am I missing something simple about Clinet Profile bootstrapper?

  17. Nidonocu says:

    @Tony: Because you already have a version of the ‘Full Framework’ installed, the installer must perform an update of that, which is a larger download. The jump from 2.0 to 3.5 SP1 Full is actually rather big compared to None to 3.5 SP1 Client, thanks to all those ASP and server parts which aren’t part of Client.

    XP No Framework > 3.5 SP1 Client Framework installed
    XP Framework 2.0/3.0/3.5 > Upgrade to 3.5 SP1 Full Framework
    Vista Framework 3.0/3.5 > Upgrade to 3.5 SP1 Full Framework

  18. Tony says:

    @Nidonocu

    I understand that full Framework update is larger. However, if I am doing Client Profile install, presumably I could live without those ASP and server parts version 2.0, so I can live also without them at version 3.5 SP1.

    Stated in another way, how do you explain that to a nontechnical user?

    Thus I guess that the real problem may be in difficulty of installing and running Framework with different pieces having different major versions.

    Hopefully Client Profile developers will find some ways around it.

  19. Nidonocu says:

    @Tony: Sadly, the way stuff works, this isn’t possible. Because otherwise you’d still have 2.0 server and ASP libraries (from the existing 2.0 install) and 3.5 SP1 Client libraries. This would make existing programs very confused, thinking they were getting one thing and ending up with something else. The only way to install just the client parts this would be to completely uninstall 2.0 Full first.
    The best thing Paint.net and other applications can do is try to detect which state the system is in before it starts the install and provide a good guess about how long the process will take.

  20. Tony says:

    @Nidonocu: or wait for a couple of months since, according to Scott Hanselman, quote Over the next several months, machines with .NET 2.0 and up will start updating to the latest .NET 3.5SP1 using Windows Update. endquote

  21. pencil_ethics says:

    Since the minimum required OS is Windows XP SP2 anyway, why don’t you bundle Windows Installer 4.5 instead of 3.1? Just a thought šŸ˜›

  22. Bruce says:

    A couple suggestions:

    #1 ask all your questions up front. its a pain to start a big download, then come back later and discover it didn’t finish because some questions still need to be answered. I suggest that as soon as you run the installer, at the point where you say “will install bits X, Y, and Z” you also ask the questions about “quick or custom” and language. The user runs the installer, answers questions, and comes back later to a running paint.net. Which leads me to point #2:

    #2 after rebooting, give some kind of indication that the install was successful. You could start paint.net, or pop a dialog, but those feel kind of heavyweight. How about a balloon popup after the reboot saying “paint.net successfully installed, get the hot bits from your start menu now!”

  23. Rick Brewster says:

    Bruce — I can’t ask everything up front because the setup wizard is written in C#. Chicken and egg, eh?

    But I like the idea of starting Paint.NET after the required reboot. I just filed a bug on it. I can put PaintDotNet.exe into the “RunOnce” key, that’ll work out perfectly.

  24. Bruce says:

    Fair enough, although you are already planning to provide a non-C# setup dialog – just a really, really simple one. It would be an opportunity to develop your C++ skills by adding some input and logic, and writing to a file. *grin*

  25. Rick Brewster says:

    “…although you are already planning to provide a non-C# setup dialog…”
    No, I’m not. That’s just a MessageBox() up there.

    “It would be an opportunity to develop your C++ skills…”
    I’ve written and worked on UI in C/C++ enough to know that I very very strongly prefer doing it in C# instead šŸ™‚ It’s not like C# is the only language I’ve worked in.

  26. Deraj says:

    I’m curious, what if someone already has the framework 3.5 SP1 installed, forgot they installed it, and run the installer? Or the Windows Installer 3.1? Will your setup file detect it, and skip those portions of the installation, or will it just cause a big mess?

Comments are closed.