<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>You had me at "Hello World" : Setup Project</title><link>http://blogs.msdn.com/helloworld/archive/tags/Setup+Project/default.aspx</link><description>Tags: Setup Project</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>How to Add Command Line Support with Your .MSI</title><link>http://blogs.msdn.com/helloworld/archive/2009/02/06/how-to-add-command-line-support-with-your-msi.aspx</link><pubDate>Fri, 06 Feb 2009 21:23:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9402677</guid><dc:creator>HelloWorld</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/helloworld/comments/9402677.aspx</comments><wfw:commentRss>http://blogs.msdn.com/helloworld/commentrss.aspx?PostID=9402677</wfw:commentRss><description>&lt;p&gt;One of the requirements in building setups was to allow the Operations team to execute the .msi file from the command line. GUI is not for expert! :)&lt;/p&gt;  &lt;p&gt;If you are familiar with Visual Studio setup, each of the UI element has a property, and you pass this property to your custom action, or use it as condition in your setup (whether to install the documentation, help, or whether to install to the gac or not, etc.).&lt;/p&gt;  &lt;p&gt;msiexec.exe allows you to pass some parameters to override those properties. Unfortunately the .msi file that Visual Studio generates always set the default values, default value being the values that the developers set during design time.&lt;/p&gt;  &lt;p&gt;After inspecting the .msi, there are some custom actions that will set the property value to the default. This custom actions are always executed, whether the users sets the property via command line parameter or not. That means, if the user pass some parameters to override the property, the setup will execute the custom action, reassign the property value to the original default value.&lt;/p&gt;  &lt;p&gt;So what needs to be done is to prevent the custom action from executing when the property is overridden by the user. This can be done quite easily with text box dialogs, checkbox dialogs are a little bit more difficult, I will cover it in other post.&lt;/p&gt;  &lt;p&gt;The property has blank value/null in the beginning, if the user overrides the property via command line parameter, this value will not be null. By giving custom actions a condition, to execute only if the property is blank, the value that the user gave via command line will not be overridden.&lt;/p&gt;  &lt;p&gt;You need to set the conditions in two different tables in your .msi file, InstallExecuteSequence and InstallUISequence. One to support GUI mode (interactive) and the other to support quiet/passive mode.&lt;/p&gt;  &lt;p&gt;This is the example on how to do it, repeat the steps for every property that you want to be able to override:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Identify the property that you want to override. From within Visual Studio, writes down the property that you want to be able to override. For example, you set a property &lt;strong&gt;SERVERNAME&lt;/strong&gt;, related to &lt;strong&gt;Edit1Property&lt;/strong&gt; on &lt;strong&gt;Textboxes (A)&lt;/strong&gt;, and the default value is 'DefaultServerName'.      &lt;br /&gt;&lt;a href="http://blogs.msdn.com/blogfiles/helloworld/WindowsLiveWriter/HowtoAddCommandLineSupportwithYour.MSI_80FA/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/helloworld/WindowsLiveWriter/HowtoAddCommandLineSupportwithYour.MSI_80FA/image_thumb_2.png" width="244" height="85" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;Check the InstallUISequence and InstallExecuteSequence tables in the .msi using Orcas, you should see something like this:     &lt;br /&gt;&lt;a href="http://blogs.msdn.com/blogfiles/helloworld/WindowsLiveWriter/HowtoAddCommandLineSupportwithYour.MSI_80FA/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/helloworld/WindowsLiveWriter/HowtoAddCommandLineSupportwithYour.MSI_80FA/image_thumb_1.png" width="661" height="62" /&gt;&lt;/a&gt;       &lt;br /&gt;You know this is the action that you want from the Action name, it is CustomTextA, corresponds to the Textboxes (A), and it is the Edit1 control. If you check the CustomAction table, you will see something like this:      &lt;br /&gt;&lt;a href="http://blogs.msdn.com/blogfiles/helloworld/WindowsLiveWriter/HowtoAddCommandLineSupportwithYour.MSI_80FA/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/helloworld/WindowsLiveWriter/HowtoAddCommandLineSupportwithYour.MSI_80FA/image_thumb_3.png" width="664" height="43" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;To prevent the custom action from executing, add this condition on both &lt;u&gt;InstallUISequence and InstallExecuteSequence tables&lt;/u&gt;, &lt;strong&gt;SERVERNAME = &amp;quot;&amp;quot;&lt;/strong&gt;.      &lt;br /&gt;&lt;a href="http://blogs.msdn.com/blogfiles/helloworld/WindowsLiveWriter/HowtoAddCommandLineSupportwithYour.MSI_80FA/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/helloworld/WindowsLiveWriter/HowtoAddCommandLineSupportwithYour.MSI_80FA/image_thumb_4.png" width="663" height="56" /&gt;&lt;/a&gt;       &lt;br /&gt;This tells, if the SERVERNAME is blank (the user did not override), execute the custom action to assign the default value. Please pay attention that the condition is for an empty string (two double quotes).&lt;/li&gt;    &lt;li&gt;Save the .msi and close Orcas.&lt;/li&gt;    &lt;li&gt;Execute the .msi using this command:     &lt;br /&gt;msiexec /i [The msi name].msi SERVERNAME=&amp;quot;HELLOWORLDSERVER&amp;quot;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;After executing those steps, the UI will show HELLOWORLDSERVER in the text box.&lt;/p&gt;  &lt;p&gt;To set this condition automatically as part of your build process, we need to use a script to modify the setup. This can be done by setting the post build event for your project.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create a .js script. Call it CommandLineSupport.js, repeat the update statement for every property that you want to be able to override.     &lt;br /&gt;&lt;span style="color: green"&gt;//This script adds command-line support for MSI build with Visual Studio 2008.        &lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;msiOpenDatabaseModeTransact = 1;      &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(WScript.Arguments.Length != 1)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WScript.StdErr.WriteLine(WScript.ScriptName + &lt;span style="color: #a31515"&gt;&amp;quot; file&amp;quot;&lt;/span&gt;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WScript.Quit(1);      &lt;br /&gt;}      &lt;br /&gt;      &lt;br /&gt;WScript.Echo(WScript.Arguments(0));      &lt;br /&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;filespec = WScript.Arguments(0);      &lt;br /&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;installer = WScript.CreateObject(&lt;span style="color: #a31515"&gt;&amp;quot;WindowsInstaller.Installer&amp;quot;&lt;/span&gt;);      &lt;br /&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);      &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;sql      &lt;br /&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;view      &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: blue"&gt;try       &lt;br /&gt;&lt;/span&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//Update InstallUISequence to support command-line parameters in interactive mode.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;sql = &lt;span style="color: #a31515"&gt;&amp;quot;UPDATE InstallUISequence SET Condition = 'SERVERNAME=\&amp;quot;\&amp;quot;' WHERE Action = 'CustomTextA_SetProperty_EDIT1'&amp;quot;&lt;/span&gt;;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; view = database.OpenView(sql);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; view.Execute();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; view.Close();      &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//Update InstallExecuteSequence to support command line in passive or quiet mode.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;sql = &lt;span style="color: #a31515"&gt;&amp;quot;UPDATE InstallExecuteSequence SET Condition = 'SERVERNAME=\&amp;quot;\&amp;quot;' WHERE Action = 'CustomTextA_SetProperty_EDIT1'&amp;quot;&lt;/span&gt;;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; view = database.OpenView(sql);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; view.Execute();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; view.Close();      &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; database.Commit();      &lt;br /&gt;}      &lt;br /&gt;&lt;span style="color: blue"&gt;catch&lt;/span&gt;(e)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WScript.StdErr.WriteLine(e);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WScript.Quit(1);      &lt;br /&gt;}      &lt;br /&gt;&lt;/li&gt;   &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;    &lt;li&gt;Save the CommandLineSupport.js in the same folder with your setup project file, and set PostBuildEvent for the setup project.     &lt;br /&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/helloworld/WindowsLiveWriter/HowtoAddCommandLineSupportwithYour.MSI_80FA/image_16.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/helloworld/WindowsLiveWriter/HowtoAddCommandLineSupportwithYour.MSI_80FA/image_thumb_7.png" width="639" height="41" /&gt;&lt;/a&gt;       &lt;br /&gt;Make sure .msi name matches your .msi file name.&lt;/li&gt;    &lt;li&gt;Build the project. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Standard disclaimer applies, no warranty, use it at your own risk, always test the changes. Wow, this post is longer than what I thought it would be.... &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9402677" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/helloworld/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/helloworld/archive/tags/Setup+Project/default.aspx">Setup Project</category></item><item><title>CustomActionData and User Defined Path</title><link>http://blogs.msdn.com/helloworld/archive/2008/04/08/customactiondata-and-user-defined-path.aspx</link><pubDate>Tue, 08 Apr 2008 06:11:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8367430</guid><dc:creator>HelloWorld</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/helloworld/comments/8367430.aspx</comments><wfw:commentRss>http://blogs.msdn.com/helloworld/commentrss.aspx?PostID=8367430</wfw:commentRss><description>&lt;p&gt;When designing a setup project, you can define text boxes dialog to input a file system path. To process the input that the user has entered, usually a custom action is created to handle the user input, and the user input is passed through CustomActionData property. Unfortunately, there are several problems when dealing with path.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Spaces in the path      &lt;br /&gt;A space is a valid character for a path. If the user passes a path with a space in it, you should enclose the input with double-quotes, for example, this is a CustomActionData property value: /USERDEFINEDDATA=&amp;quot;[USERPATH]&amp;quot;.       &lt;br /&gt;This leads to a different problem below. &lt;/li&gt;    &lt;li&gt;Backslashes trimmed.      &lt;br /&gt;When the user enters a UNC path starting with &amp;quot;\\&amp;quot;, if the value property is enclosed with double-quotes, the string that is passed to the custom action contains only one '\'. Not really a problem, you have to check if the path is a UNC path and make sure there are two '\'. &lt;/li&gt;    &lt;li&gt;Trailing backslash caused an exception.      &lt;br /&gt;This is an interesting problem. As soon as the user enters a path, either absolute path or a UNC path and ended the path with a backslash, the user will get this error when running the setup.&amp;#160; &lt;br /&gt;&lt;strong&gt;       &lt;br /&gt;&lt;/strong&gt;Error 1001: Exception occurred while initializing the installation:      &lt;br /&gt;System.IO.FileNotFoundException. Could not load file or assembly:      &lt;br /&gt;'file:///C:\WINNT\[Your assembly name here]' or one of its dependencies.      &lt;br /&gt;The system could not find the file specified.      &lt;br /&gt;      &lt;br /&gt;This error happens only when the CustomActionData inside double-quotes.       &lt;br /&gt;      &lt;br /&gt;If you check my previous &lt;a href="http://blogs.msdn.com/helloworld/archive/2008/03/11/did-you-know-how-to-correctly-pass-targetdir-to-a-custom-action.aspx"&gt;post&lt;/a&gt; about passing [TARGETDIR] to custom action, you notice that you have to pass a backslash at the end. You can do the same with a user defined path, something like this /USERDEFINEDDATA=&amp;quot;[USERPATH]\&amp;quot;. This code works great if the user enters a path with a trailing backslash, and there will be only ONE trailing backslash. The problem is if the user did not supply the trailing backslash, the user will get the same 1001 error again.       &lt;br /&gt;      &lt;br /&gt;My solution is this, set CustomActionData with a character that you know is not a valid path character, for example a Pipe character ('|'). Assign your CustomActionData like this /USERDEFINEDDATA=&amp;quot;[USERPATH]&lt;strong&gt;|&lt;/strong&gt;&amp;quot;. With this, a user defined path with trailing backslash will come to the custom action as &amp;quot;C:\some Path\some path\|&amp;quot;, and user defined path without a trailing backslash will come to the custom action as &amp;quot;C:\Some Path\Some Path|&amp;quot;. What you have to do now is to trim the '|' character, and you are good. Now you have a code that can handle user input with or without trailing backslash. &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8367430" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/helloworld/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/helloworld/archive/tags/.Net+Framework/default.aspx">.Net Framework</category><category domain="http://blogs.msdn.com/helloworld/archive/tags/Setup+Project/default.aspx">Setup Project</category><category domain="http://blogs.msdn.com/helloworld/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>How to Build TFS Build Locally?</title><link>http://blogs.msdn.com/helloworld/archive/2008/03/11/how-to-build-tfs-build-locally.aspx</link><pubDate>Tue, 11 Mar 2008 12:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8140090</guid><dc:creator>HelloWorld</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/helloworld/comments/8140090.aspx</comments><wfw:commentRss>http://blogs.msdn.com/helloworld/commentrss.aspx?PostID=8140090</wfw:commentRss><description>&lt;P&gt;If you need to test your TFS build after playing around with the TFSBuild.proj, you can do that by do the following:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Synchronize the source control to your workspace.&lt;/LI&gt;
&lt;LI&gt;Open Visual Studio 2005 Command Prompt (or Visual Studio 2008 Command Prompt), located under Start&amp;gt;Microsoft Visual Studio 2005&amp;gt;Visual Studio Tools.&lt;/LI&gt;
&lt;LI&gt;Change the directory into your TFSBuild.proj.&lt;/LI&gt;
&lt;LI&gt;Call MSBuild by passing several parameters as follow: MSBuild TFSBuild.proj /p:SolutionRoot=..\..&lt;/LI&gt;
&lt;LI&gt;If you need to test how the build will drop the binaries, pass an extra parameter, for example: MSBuild /p:SolutionRoot=..\.. /p:BinariesRoot=d:\Drop\Binaries\BuildTest&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;This post was created to help people who search for this information using different keywords, for more detail, MSDN link is &lt;A href="http://msdn2.microsoft.com/en-us/library/ms181723.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms181723.aspx"&gt;here&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8140090" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/helloworld/archive/tags/.Net+Framework/default.aspx">.Net Framework</category><category domain="http://blogs.msdn.com/helloworld/archive/tags/Setup+Project/default.aspx">Setup Project</category><category domain="http://blogs.msdn.com/helloworld/archive/tags/How+to/default.aspx">How to</category></item><item><title>How to Make Sure InstallState Files Are Removed After Uninstall?</title><link>http://blogs.msdn.com/helloworld/archive/2008/03/11/how-to-make-sure-installstate-files-are-removed-after-uninstall.aspx</link><pubDate>Tue, 11 Mar 2008 02:39:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8139894</guid><dc:creator>HelloWorld</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/helloworld/comments/8139894.aspx</comments><wfw:commentRss>http://blogs.msdn.com/helloworld/commentrss.aspx?PostID=8139894</wfw:commentRss><description>&lt;p&gt;If you are building setup using Visual Studio and you have several custom actions and you noticed you see one or more .InstallState files in the target path after uninstall, most likely you have added your custom action to the Install custom action, but nothing else.&lt;/p&gt;  &lt;p&gt;What you should do is to add the same custom action to the Uninstall custom action, those InstallState files will be gone.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8139894" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/helloworld/archive/tags/.Net+Framework/default.aspx">.Net Framework</category><category domain="http://blogs.msdn.com/helloworld/archive/tags/Setup+Project/default.aspx">Setup Project</category><category domain="http://blogs.msdn.com/helloworld/archive/tags/How+to/default.aspx">How to</category></item><item><title>How to Correctly Pass TARGETDIR to A Custom Action?</title><link>http://blogs.msdn.com/helloworld/archive/2008/03/11/did-you-know-how-to-correctly-pass-targetdir-to-a-custom-action.aspx</link><pubDate>Tue, 11 Mar 2008 02:26:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8139721</guid><dc:creator>HelloWorld</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/helloworld/comments/8139721.aspx</comments><wfw:commentRss>http://blogs.msdn.com/helloworld/commentrss.aspx?PostID=8139721</wfw:commentRss><description>&lt;p&gt;If you have a custom action setup, passing TARGETDIR to the custom action, and suddenly you are experiencing weird error, you may have incorrectly passed the TARGETDIR. Sometimes the Event Viewer have this entry:&lt;/p&gt;  &lt;p&gt;The description for Event ID ( 11001 ) in Source ( MsiInstaller ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer. You may be able to use the /AUXSOURCE= flag to retrieve this description; see Help and Support for details. The following information is part of the event: Product: Your Product -- Error 1001. Error 1001. Exception occurred while initializing the installation:    &lt;br /&gt;System.IO.FileNotFoundException: Could not load file or assembly 'file:///some path' or one of its dependencies. The system cannot find the file specified.., (NULL), &lt;/p&gt;  &lt;p&gt;The correct way to pass TARGETDIR is by enclosing it in double-quotes and added a backslash at the end. For example: /param=&amp;quot;[TARGET]\&amp;quot;. MSDN link &lt;a href="http://msdn2.microsoft.com/en-us/library/2w2fhwzz(VS.80).aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8139721" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/helloworld/archive/tags/Setup+Project/default.aspx">Setup Project</category><category domain="http://blogs.msdn.com/helloworld/archive/tags/How+to/default.aspx">How to</category></item><item><title>Having Fun with VS Setup Project - Database Deployment</title><link>http://blogs.msdn.com/helloworld/archive/2008/01/30/having-fun-with-vs-setup-project-database-deployment.aspx</link><pubDate>Wed, 30 Jan 2008 21:08:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7331123</guid><dc:creator>HelloWorld</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/helloworld/comments/7331123.aspx</comments><wfw:commentRss>http://blogs.msdn.com/helloworld/commentrss.aspx?PostID=7331123</wfw:commentRss><description>&lt;p&gt;I was given a new task, to create an installer for internal use. I wrote installer before, but it was three years ago, a lot of things have changed.&lt;/p&gt;  &lt;p&gt;One of the installer task is to create a sql server db using a script. After much reading, searching, and testing, I got into this msdn article. &lt;a title="http://msdn2.microsoft.com/en-us/library/49b92ztk.aspx" href="http://msdn2.microsoft.com/en-us/library/49b92ztk.aspx"&gt;http://msdn2.microsoft.com/en-us/library/49b92ztk.aspx&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The article was good enough to get me started, the only thing is, the source code was in VB instead of C#. If you decided to follow that example above using C#, there is a chance that you may asked yourself about C# equivalent of VB's My.Settings. Don't worry too much, it just a strong-typed application setting. Just use ConfigurationManager, if you are more comfortable with it.&lt;/p&gt;  &lt;p&gt;If you have done database deployment using msi in the past, I will appreciate some feedback or information.&lt;/p&gt;  &lt;p&gt;Stay tuned, I am planning to add more stuff that I learned from building setup project using VS 2005. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7331123" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/helloworld/archive/tags/.Net+Framework/default.aspx">.Net Framework</category><category domain="http://blogs.msdn.com/helloworld/archive/tags/Setup+Project/default.aspx">Setup Project</category><category domain="http://blogs.msdn.com/helloworld/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item></channel></rss>