Thoughts about setup and deployment issues, WiX, XNA, the .NET Framework and Visual Studio
All postings are provided AS IS
with no warranties, and confer no rights. Additionally, views expressed
herein are my own and not those of my employer, Microsoft.
A few days ago, I wrote a blog post describing how to create an MSI-based installer for a Windows game created with XNA Game Studio 3.0. In that post, I described how to create custom actions in the MSI to check for system-level prerequisites (the .NET Framework and the XNA Framework Redistributable) and block the MSI from installing if they are not installed on the user's system.
Adding a bootstrapper to your game installer
The next thing I want to demonstrate is how to expand on the steps in that blog post to create an installer that will do all of the following:
Visual Studio includes a bootstrapper that can do all of the above, and XNA Game Studio 3.0 includes a prerequisite package for the XNA Framework Redistributable 3.0 that integrates with the Visual Studio bootstrapper. As a result, you can use the Visual Studio 2008 or Visual C# 2008 Express Edition IDE to create an installer for your game for both ClickOnce packages and VS setup/deployment projects, and I have previously posted steps for doing this in this blog post.
If you want to create an installer that uses the Visual Studio bootstrapper along with an MSI built with WiX instead of an MSI build with a VS setup/deployment project, you need to perform a couple of additional steps:
Updated sample that builds an MSI and a bootstrapper
I have posted a sample at http://cid-27e6a35d1a492af7.skydrive.live.com/self.aspx/Blog%7C_Tools/WiX%20Samples/wix%7C_sample%7C_xgs30%7C_game%7C_with%7C_bootstrapper.zip that extends my previous sample so you can use it to create a bootstrapper in addition to an MSI. It includes the following additions/changes from the previous sample:
How to use the updated sample
To try out this updated sample, you can use the following steps:
After doing the above, you can copy setup.exe and wix_sample_xgs30_game.msi from the Setup sub-directory to a server and run setup.exe to install your game and its prerequisites on another computer.
Advanced scenario - building an MSI with WiX by using a .wixproj file
Note - it is also possible to create an MSBuild project file to build an MSI using WiX instead of using a batch file that calls the WiX tools directly. I have included a sample MSBuild project file named wix_sample_xgs30_game.wixproj in the new sample that I have posted. It was created by using the Votive Visual Studio package that is a part of the WiX toolset, and it can be built by invoking msbuild.exe directly or by opening the .wixproj file in Visual Studio 2005 or 2008 standard edition or higher on a system that also has WiX v3.0 installed. Keep in mind that Votive is a Visual Studio add-in package, so it can only be installed for use in Visual Studio standard edition or higher. You cannot use it if you only have Visual C# 2008 Express Edition. You can create and build .wixproj files by hand outside of Visual Studio if you only have an Express Edition installed though.
<update date="3/21/2009"> Fixed broken link to sample installer files. </update>
PingBack from http://blogs.msdn.com/astebner/archive/2008/10/31/9027445.aspx
We're back from stuffing ourselves with...well...stuffing and turkey and the like for Thanksgiving and
Aaron Stebner が XNA Game Studio 3.0 を用いた Windows ゲーム 用 インストーラーの作成 に関する記事 ( 英語 ) を 2 つ投稿しています。 Shawn Hargreaves
Great post, exactly what I need. I've had this bookmarked for a while, and I'm finally implementing it for my game's ("Air Legends") Windows installer.
I am stumped by one bizzare problem though. I'm using Winzip Self-extractor to package the bootstrap EXE & MSI into a single downloadable install file.
I have done this before with good success, but for some reason I am now having a problem I've not seen before. After the bootstrapper finishes and launches my MSI, I am finding the Temporary extracted files are often getting removed before the MSI is complete so the install fails.
I can reliably make it fail by simply taking a few seconds before clicking through the first of the MSI setup pages.
What puzzles me the most is I am using exactly the same version of Winzip Self-extractor as in a previous project which never seemed to have this problem.
Has something changed about the newer versions of Wix 3 that might cause this? e.g. for instance, would older versions have had the running MSI file locked so it didn't prematurely get deleted from Temp?
Hi Sharky - Thanks for the feedback on this blog post. I'm glad to hear it has been helpful so far. I think the behavior difference is the result of a change in the VS bootstrapper setup.exe itself (as opposed to anything in WiX). I talked to some folks who work on the VS bootstrapper, and they indicated that there was a launching behavior change in the VS bootstrapper setup.exe introduced in VS 2008 that is intended to make it work better with UAC on Vista but that inadvertantly breaks the self-extracting EXE scenario that you're trying to implement.
Overall, they didn't intend to specifically support a self-extracting EXE scenario but it happened to work up until VS 2008. They intend for web download scenarios to use just the setup.exe and have the setup developer author their package to download all payload from the Internet. They intend for CD or UNC file share scenarios to include the package payload in relative paths instead of packaging them into a single EXE.
That would certainly explain it, though I really don't like the new behaviour.
For the full version of my game I definitely don't want the MSI part of my installer available for FREE download.
I had planned on putting the single-exe (self-extractor) install behind a password protected part of my blog. Only people that donate would get the password.
Is it possible to have the bootstrapper download the MSI from a password protected location?
Hi Sharky - The bootstrapper does not support authentication-based downloads. There are a couple of options you could explore as workarounds:
1. Write a lightweight .exe that is launched by the self-extracting process and that in turn will launch the VS bootstrapper setup.exe. It can be made to monitor both the setup.exe process and the MSI that setup.exe will spawn. You can make that lightweight .exe return only when both processes are complete.
2. Use VS 2005 instead of VS 2008 to create the bootstrapper setup.exe. You would still need to use VS 2008 to create your game since it is based on XNA Game Studio 3.0, but you could follow the steps in this blog post on VS 2005 instead of 2008 and it will produce a setup.exe that does not have the behavior problem that you've been experiencing. WiX 3.0 will work in VS 2005 or 2008, and you can create the setup.exe in the free VC# 2005 Express Edition, so you wouldn't need to buy an additional copy of VS to accomplish this.
Hopefully one of these will help!
Thanks for the suggestions Aaron.
I'm guessing the option #1 lightweight .exe could not be done in C# .NET - because if the PC running it doesn't have the framework installed it simply wouldn't work. It's a chicken and egg situation. ;)
So I'm going to have a go with the #2 option.
Do you think this is something Microsoft will address in the future, because it seems kind of ridiculous to have to go to these lengths? There must be a huge number of installers out there that use the self-extracting+bootstrapper approach. And if they move to VS 2008 they're going to get a rude surprise when their setups fail to work.
Most of us can't afford big-name installer packages like InstallShield, Wises etc...
Plus I really like WiX.
p.s. I found some discussion and more possible workarounds here...
Interestingly, I can no longer find VS 2005 C# Express available for download on the Microsoft site. It seems to have been replaced with 2008 express.
Fortunately I found the installer on my drive somewhere. Phew.
Hi Sharky - You're right - you would need to write the simple EXE in C++ so that it won't depend on the .NET Framework.
It looks like this self-extracting behavior bug in the VS bootstrapper will be fixed in the next version of Visual Studio. There is a comment in the Connect bug at https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=369138 that states that it is fixed in Dev10.
Also, in case you need it in the future, the download location for the VS 2005 Express Editions is located at http://www.microsoft.com/express/2005/download/default.aspx.
A while back, I posted a set of steps that you can use to create an MSI with WiX and combine it with
Hi Aaron, thanks for our off-line email exchange... have now managed to log into msdn blogs! And I did find the files. Thank you!
I'm really just starting out with Wix and I'm wondering if I can tell you what I'm trying to do, and you can say if Wix is a good tool for it.
I want to create a Windows installer for a XNA game with the following characteristics:
(1) The installer should check that the user's graphics card supports the required shader model - at least 1.1 if not 2.0.
If this condition is not met it should advise the user not to proceed.
(2) The installer should check the O.S. is sufficient version of XP or Vista to even bother starting the install.
(3) The installer should check to see if .net 3.5 SP1 is installed.
If it is not installed it should install it with the minimum of fuss / user prompts... "yes I really want to's" "yes I really did mean it's" - as few of those as possible! 8-)
(4) The installer should check to see if XNA framework 3.0 is installed.
(5) Although I don't want to be bothering the user with unnecessary confirmation prompts, license agreements which they never read and which we can assume they agree to (other wise they wouldn't have said yes to the previous question) etc. , although I don't want to be bothering users with that, I do want to be giving the users feedback about progress.
So with each of the 2 frameworks (.net and XNA) a nice progress bar showing how we are doing in installing that framework would be nice.
(6) All of this I would like to package up inside a single .exe file that the user can download to their local machine and execute to start the installation.
Many thanks for your advice.
Hi Business Software Dorset - I'm glad you were able to find the sample files - sorry for the hassles with my old file server being dead.
You can do items 1 and 2 directly in your MSI by using WiX. I posted some info about how to check pixel shader and vertex shader versions at http://blogs.msdn.com/astebner/archive/2008/06/05/8576818.aspx. Checking OS version is straightforward in an MSI, and there is information in the WiX docs for that.
For items 3 and 4, you'll need a bootstrapper that will install the required prerequisites and then run your MSI afterwards. The VS bootstrapper can do that, but you have limited flexibility in terms of what UI it can show. If you want to use the VS bootstrapper, the information in this blog post will help you achieve that. The file wix_sample_xgs30_game_bootstrapper_netfx35.proj includes the .NET Framework 3.5, but you can easily change that to .NET 3.5 SP1 if you want to. Let me know if you have any trouble figuring out how to do that.
If you want fancier UI than what is offered by the VS bootstrapper, then your best bet will be to write your own bootstrapper UI and have it chain .NET 3.5 SP1, XNA Framework 3.0 and then your product MSI.
#6 is problematic for the VS bootstrapper. I described that in item 1 at http://blogs.msdn.com/astebner/archive/2009/02/20/9436778.aspx. If you want to support a self-extracting package with no web downloading of packages, you'll probably need to create a stub EXE that stays alive in the background (because the other option listed in that blog post of using the VS 2005 bootstrapper won't work for you since you want to include .NET 3.5 SP1 and the XNA Framework 3.0 redist as prerequisites and those VS bootstrapper packages are only installed for use with VS 2008's bootstrapper).
Hopefully this helps. Let me know if you have any questions as you get started with your packaging/setup work.
I’ve previously written a few posts about how to get started with Windows game deployment for games created
Is there any possibility that the source code for the setup.bin would be available? I would like to be able to control the UI (suppress or show), be able to pass on command line information and have the ability to embed prerequisites and the msi. With the ability to customize the prerequisites using the generateBootstrapper task, it seems a bit strange to not distribute the source to the stub. Especially since the source for the downloading bootstrapper (MSI SDK 4.5) is available.