Aaron Stebner's WebLog

Thoughts about setup and deployment issues, WiX, XNA, the .NET Framework and Visual Studio

Mailbag: How can I customize an MSI in the Visual Studio setup/deployment project?

Mailbag: How can I customize an MSI in the Visual Studio setup/deployment project?

Rate This

Question:

I am using the Visual Studio setup/deployment project to create an MSI to install my application.  I would like to add some functionality to this MSI that does not appear to be supported in the Visual Studio IDE (such as modifying the default install path based on a registry value on the system).  I know how to do this by directly editing the MSI, but I don't want to have to manually edit the MSI each time I build.  Are there any other options I can use in this scenario?

Answer:

There is a limited set of customizations you can make to an MSI in the Visual Studio IDE UI for a setup/deployment project.  By limited, I mean that there are a lot of features that are natively supported in Windows Installer MSI format that are not exposed for customization in the Visual Studio IDE.  Examples include changing the default install path based on a registry value, advanced setup UI features such as updated banner text or a "launch my product" checkbox on the final screen, creating custom actions that reference external executable files, or setting various custom action attributes (among other things).

If you would like to automate the ability to customize an MSI that is built by the Visual Studio setup/deployment project in a way that is not currently supported by the UI in the Visual Studio IDE, you can write a script that accesses the Windows Installer object model to perform these customizations.  Then you can create a post-build step in your Visual Studio setup/deployment project to run your script after the MSI has been built so that the final result each time you build will be an MSI package with your additional customizations made to it.

As an example, you can use the sample script at this location to add a checkbox to your MSI's setup UI that will let the user choose whether or not to launch your product after setup finishes.

If you would like to include this script as a post-build step in a Visual Studio setup/deployment project, you can use the following steps:

  1. Download the sample script and extract the contents to the directory that contains the Visual Studio setup project you are working on.

    Note: You should end up with the file EnableLaunchApplication.js in the same directory as the .vdproj file for your setup project.  The rest of these steps will not work correctly if you do not put EnableLaunchApplication.js in the correct location, so be careful about this step.

  2. Open the file EnableLaunchApplication.js in a text editor such as notepad, locate the variable at the top of the file that is set to the value WindowsApplication1.exe, and change it to the name of the EXE that is in your setup that you want to launch when the MSI is done installing
  3. Open the project in Visual Studio
  4. Press F4 to display the Properties window
  5. Click on the name of your setup/deployment project in the Solution Explorer
  6. Click on the PostBuildEvent item in the Properties window to cause a button labeled "..." to appear
  7. Click on the "..." button to display the Post-build Event Command Line dialog
  8. Copy and paste the following command line into the Post-build event command line text box:

    cscript.exe "$(ProjectDir)EnableLaunchApplication.js" "$(BuiltOuputPath)"


  9. Save your project
  10. Build your project in Visual Studio

Note that the quotation marks in the command line in step 8 are very important because the script will not work correctly without them.  Make sure to double-check that you have put quotes in the proper places.

You can find another example script that will update the MSI setup UI banner text in this MSDN forum post.

<update date="8/23/2006"> Updated the steps needed to configure post-build commands in the Visual Studio UI because they are different for setup projects than for other Visual Studio project types </update>

<update date="5/31/2007"> Updated steps to mention the need to rename WindowsApplication1.exe to the name of the EXE in each project that you want to launch.  Also fixed a typo in the variable BuiltOuputPath. </update>

<update date="8/26/2008"> Updated steps to be more specific about what folder to save EnableLaunchApplication.js to </update>

<update date="3/15/2009"> Fixed broken link to the sample script </update>

<update date="7/26/2012"> Fixed bad HTML formatting and misnumbered steps </update>

 

  • I've never seen a Build Events tab in the property pages of a setup/deployment project.  Am I missing something?
  • Hi JocularJoe - You are right, the setup/deployment project does not have the same MSBuild format as the other project types in Visual Studio, so the steps I posted won't work exactly as listed.  You could create a multi-project solution and have a stub project that builds last and contains a post-build step to modify the MSI.  I am also trying to figure out if there are any other options for adding post-build steps to a setup project, and I will post an update if/when I find anything else that will work here.
  • Hi JocularJoe - I've figured out how to configure post-build events in a setup/deployment project.  This is a new feature added in Visual Studio 2005.  I've updated the steps in this blog post to reflect the correct way to do this.  I'm sorry for any confusion I caused previously.
  • How to configure post-build events for setup/deployment projects in Visual Studio 2005 Aaron Stebner's
  • Mailbag: How can I customize an MSI in the Visual Studio setup/deployment project? Aaron Stebner's WebLog
  • First off, an apology for the lack of posts.&amp;nbsp; As you may recall from last time, Mike Sampson has...
  • First off, an apology for the lack of posts. As you may recall from last time, Mike Sampson has left

  • Question: I have built an installer using the Visual Studio 2005 setup project wizard. It installs correctly

  • Im getting an error coping in the exact cscript command.  Any Idea's?

    cscript.exe "$(ProjectDir)EnableLaunchApplication.js" "$(BuiltOutputPath)"

    The error is Error 1 'PostBuildEvent' failed with error code '1' 'Unspecified error' C:\Documents and Settings\jerry\My Documents\Visual Studio 2005\Projects\svcAdminLanMonitor\AdminLanMonitorSetup\AdminLanMonitorSetup.vdproj AdminLanMonitorSetup

  • Hi Boomport - Can you double check that you copied the EnableLaunchApplication.js file into the project directory for the project that you are trying to build?  You may have copied it to a different folder location.  Hopefully this helps.  If that doesn't help, I suggest posting a question on the MSDN Forums at http://forums.microsoft.com and hopefully someone there can suggest another possible workaround.

  • As a special treat to all of you, we are going to mostly step away from the signing example for a little

  • I'm getting this same error:

    -------

    The error is Error 1 'PostBuildEvent' failed with error code '1' 'Unspecified error'

    -------

    I put the .js file in the same folder as my project file and even in the folder above, just to eliminate all issues. My setup project is VERY simple (for testing only). It has one EXE and nothing else (no custom actions, etc.).

    If I remove the PostBuildEvent, the project compiles fine. However, it will not build with the following text:

    -------------

    cscript.exe "$(ProjectDir)EnableLaunchApplication.js" "$(BuiltOutputPath)"

    -------------

    I've dug around on the forums link you posted but I see no solution there to this problem.

    Any other ideas? Any chance you could post a simple project with this working? Perhaps something strange about my system's configuration (though my system is pretty standard - VS2005, XP, etc.).

  • Hi JohnMAndre - I'm sorry for the hassles here.  There were a few small problems causing these steps to not work.  

    First, I incorrectly spelled the variable BuiltOuputPath (the wrong spelling of ouput is actually right, but I fixed it when I wrote the blog and VS doesn't recognize the variable BuiltOutputPath).  I did the same thing in my blog post at http://blogs.msdn.com/astebner/archive/2007/01/22/updated-steps-for-setting-the-noimpersonate-flag-for-a-custom-action-in-visual-studio-2005.aspx.

    Second, the .js file inside of the zip file on my file server (http://astebner.sts.winisp.net/Tools/EnableLaunchApplication.zip) was named EnableLaunchApplication js (without a . before js).  If you extracted the file but didn't rename it, VS won't be able to find it to run it.

    Third, there is a modification you have to make to the contents of the .js file for it to run correctly.  You have to provide the name of the application that you want to be launched at the end of installation.  It is hard-coded to WindowsApplication1.exe in the .js file currently.  You'll need to change that to meet your needs before rebuilding your MSI.

    After all of the above fixes, I was able to get this example to work for a simple setup project.  Hopefully it will work for you as well.  If it works, you will see dialogs indicating the steps it is taking.  You can remove the dialogs after you make sure it is working so it won't interrupt your build process.

    I have updated the zip file to correctly name the file EnableLaunchApplication.js inside the zip file, and I will also update the text of this blog post with the correctly named variable BuiltOuputPath.

    Please let me know if you have any further issues.

  • Yeah! I got it to work.

    Unfortunately, I cannot get "$(BuiltOutputPath)" to work - I have to pass in the literal path of the msi file. Not ideal but it works.

    I tried several versions around this but nothing worked. It just passes in an empty string.

    Still, thanks for this. I'm glad I have a solution.

  • One more question related to this.

    Do you have any idea how I could launch the installed application without prompting the user with a checkbox? That is, I don't want to give them a choice, I simply want to launch it after the installation is complete.

Page 1 of 8 (108 items) 12345»
Leave a Comment
  • Please add 7 and 5 and type the answer here:
  • Post