<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-24178245</id><updated>2011-12-14T19:16:28.592-08:00</updated><title type='text'>Derek Cicerone Installing...</title><subtitle type='html'>WiX, Setup, and trying to make it all easy, not just easier</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://installing.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://installing.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Derek Cicerone</name><uri>http://www.blogger.com/profile/07593077976542191522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-24178245.post-115776195588363321</id><published>2006-09-15T17:25:00.000-07:00</published><updated>2006-09-18T01:49:33.460-07:00</updated><title type='text'>Retiring from the WiX community</title><content type='html'>After over 3 years of working on WiX, I've decided its time to pursue other interests. It has been a true pleasure to work with this incredible community of volunteers. In fact, I likely would have stopped working on WiX a very long time ago if not for all your support. Thank you all for the good memories and I wish you the best of luck for the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24178245-115776195588363321?l=installing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://installing.blogspot.com/feeds/115776195588363321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24178245&amp;postID=115776195588363321' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/115776195588363321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/115776195588363321'/><link rel='alternate' type='text/html' href='http://installing.blogspot.com/2006/09/retiring-from-wix-community.html' title='Retiring from the WiX community'/><author><name>Derek Cicerone</name><uri>http://www.blogger.com/profile/07593077976542191522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24178245.post-115776221001660147</id><published>2006-09-08T17:32:00.000-07:00</published><updated>2006-09-15T12:03:21.533-07:00</updated><title type='text'>Automatically generating component GUIDs</title><content type='html'>&lt;p class="MsoNormal"&gt;Yes, this change is exactly what you think it is: automatically generating component GUIDs. We believe that we may have come up with a safe way to automatically generate component GUIDs each build and ensure that component rules will not be broken (easily). If this idea works, it will obviously have a huge impact on the way that setup is authored for Windows Installer since it may become possible to generate authoring each build instead of maintaining it by hand.&lt;/p&gt;&lt;?xml:namespace prefix = o /&gt;&lt;o:p&gt;&lt;/o:p&gt;Due to the nature of this feature, I’d like to ask the community for help. If you can do any of the following, it would be greatly appreciated: &lt;ul&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size:+0;"&gt;&lt;span style="font-size:+0;"&gt;1.&lt;span style="font-family:';font-size:7;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Review the overall design for this feature. Do you see any scenarios in which it will allow the component rules to be violated?&lt;/li&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size:+0;"&gt;&lt;span style="font-size:+0;"&gt;2.&lt;span style="font-family:';font-size:7;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Try it out. Are you able to accidentally cause component rule violations? Do shared components properly share their component guids as well?&lt;/li&gt;&lt;/ul&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;b&gt;A component with a generated component GUID will look like this (note the asterisk in the Guid value):&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="COLOR: rgb(0,176,80)"&gt;&amp;lt;Component Id="MyComponent" &lt;b&gt;Guid="*"&lt;/b&gt;&lt;/span&gt;&lt;span style="COLOR: rgb(0,176,80);font-family:'Calibri','sans-serif';font-size:11;"  &gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="TEXT-INDENT: 0.5in"&gt;&lt;span style="COLOR: rgb(0,176,80)"&gt;&amp;lt;File Id="MyFile" Name="myFile.txt" KeyPath="yes" Source="myFile.txt" /&lt;/span&gt;&lt;span style="COLOR: rgb(0,176,80);font-family:'Calibri','sans-serif';font-size:11;"  &gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="COLOR: rgb(0,176,80);font-family:'Calibri','sans-serif';font-size:11;"  &gt;&amp;lt;/Component&amp;gt;&lt;/span&gt; &lt;p class="MsoNormal" style="TEXT-INDENT: 0.5in"&gt;&lt;span style="COLOR: rgb(0,176,80)"&gt;&lt;file id="MyFile" name="myFile.txt" source="myFile.txt" keypath="yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/file&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="COLOR: rgb(0,176,80)"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;Here’s how it works:&lt;/b&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:';font-size:7;"&gt;&lt;/span&gt;Canonicalize the &lt;i&gt;target&lt;/i&gt; path to the key path file by:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Lowercasing all the characters in the path except for the standard directory identifier which must start all paths (since the file system is case-insensitive).&lt;/li&gt;&lt;li&gt;Ignore any blank directory entries (those with “.” in the DefaultDir column). This prevents paths like “Root\.\file.txt” and “Root\file.txt” from getting different component guids.&lt;/li&gt;&lt;li&gt;Always begin a path with a standard directory identifier (such as “ProgramFilesFolder”). This eliminates differences in how source images are laid out in various products.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Create a version 3 UUID based on a pre-determined WiX namespace Guid and the path to the file.&lt;/li&gt;&lt;/ol&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;Why these are legal guids?&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;This implementation follows the RFC 4122 specification for a version 3 MD5-based UUID (you can verify this because the first number of the third set of hex digits in the guid will always be ‘3’, like this: {xxxxxxxx-xxxx-3xxx-xxxx-xxxxxxxxxxxx}). In case you are wondering, guidgen creates version 4 UUIDs (based on randomly pseudo-randomly generated data). There is also a version 5 UUID which uses SHA-1 hashing, but I chose MD5 because it had an example implementation which allowed me to verify that my port of the code is correct.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;Limitations:&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Symbol;"&gt;&lt;/span&gt;Only supports one file per component, which must be the key path.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Symbol;"&gt;&lt;/span&gt;No ODBCDataSource children allowed (but there can be registry values and any other type of child).&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Symbol;"&gt;&lt;/span&gt;Does not support multiple components installing the same file – a collision of the component guids will occur (this is caught by ICE validation).&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Symbol;"&gt;&lt;/span&gt;Guids cannot be generated until the binder because that’s when all localization and wix variables are resolved.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Symbol;"&gt;&lt;span style="font-size:+0;"&gt;&lt;/span&gt;&lt;/span&gt;Files must be rooted under a well-known Windows Installer standard directory (such as “ProgramFilesFolder”).&lt;/li&gt;&lt;/ul&gt;&lt;!--[if !supportLists]--&gt;&lt;!--[endif]--&gt; &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;Here is an example of a canonicalized path which is hashed to create the component GUID:&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="COLOR: rgb(0,176,80)"&gt;ProgramFilesFolder\my product\some file.exe&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24178245-115776221001660147?l=installing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://installing.blogspot.com/feeds/115776221001660147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24178245&amp;postID=115776221001660147' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/115776221001660147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/115776221001660147'/><link rel='alternate' type='text/html' href='http://installing.blogspot.com/2006/09/automatically-generating-component.html' title='Automatically generating component GUIDs'/><author><name>Derek Cicerone</name><uri>http://www.blogger.com/profile/07593077976542191522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24178245.post-115776147736532415</id><published>2006-09-08T17:11:00.000-07:00</published><updated>2006-09-15T12:02:37.206-07:00</updated><title type='text'>Torch and Pyro</title><content type='html'>Although the WiX toolset has been out for quite a while now, one very elusive area which has not been tackled is transform and patch support. With the addition of a new tool called "Torch", WiX will now have transform creation support.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;How is the tool used?&lt;/span&gt;&lt;br /&gt;Here's a sample command line: "torch.exe target.msi updated.msi -out transform.mst". This command will create a transform.mst file which will transform target.msi into updated.msi.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Does torch support special WiX xml file formats like the .wixout file format?&lt;/span&gt;&lt;br /&gt;Yes, the .wixout file format has been extended for transform support. This provides full round-tripping support in conjunction with dark's new -xo command line option. You could create a transform with torch, then "decompile" it with dark into a .wixout file, then re-build the transform file by passing the .wixout file into torch. Although this is a pretty impractical series of tasks, there are likely scenarios in which an advanced user would want to examine a transform in an xml format (you could easily diff two transforms) or build a transform solely from xml.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;What features would likely be added in the future?&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create a transform from two .wixout files.&lt;/li&gt;&lt;li&gt;Create a transform from two .wxl files (and a .wixout file) in order to create a language transform.&lt;/li&gt;&lt;/ul&gt;&lt;span style="FONT-WEIGHT: bold"&gt;What about patch creation support?&lt;/span&gt;&lt;br /&gt;Although it won't be supported at this time, the transform support is a key piece of the infrastructure needed to make progress towards patch creation support.  There is a new tool called "Pyro" which contains the engine for patch creation but not the nice user-interaction necessary to make it usable.  With a bit more work, Pyro should one day be the WiX tool for creating patches.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24178245-115776147736532415?l=installing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://installing.blogspot.com/feeds/115776147736532415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24178245&amp;postID=115776147736532415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/115776147736532415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/115776147736532415'/><link rel='alternate' type='text/html' href='http://installing.blogspot.com/2006/09/torch-and-pyro.html' title='Torch and Pyro'/><author><name>Derek Cicerone</name><uri>http://www.blogger.com/profile/07593077976542191522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24178245.post-115078119120084311</id><published>2006-06-21T09:00:00.000-07:00</published><updated>2006-08-28T22:05:28.356-07:00</updated><title type='text'>NGen support in WiX</title><content type='html'>I'm very happy to announce that we're releasing a new extension today which will allow you to easily run &lt;a href="http://msdn2.microsoft.com/en-us/library/6t9t5wcf.aspx"&gt;NGen &lt;/a&gt;as part of your WiX-based setup.  This functionality will be part of the newly created WiX NetFx Extension which can now be found in the latest weekly builds at &lt;a href="http://wix.sourceforge.net/releases"&gt;http://wix.sourceforge.net/releases&lt;/a&gt;.  Although the NGen support looks simple, it was actually sizable project for the WiX team and was only possible due to the significant contributions and insights of members from the NGen and Visual Studio teams.  I'd like to thank Surupa Biswas, Sameer Garde, and &lt;a href="http://blogs.msdn.com/pmarcu/"&gt;Peter Marcu&lt;/a&gt;, for all their effort in designing and reviewing this extension and Scott Kurtzeborn for doing the coding of the Windows Installer custom actions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Will the .Net Framework 1.1 be supported?&lt;br /&gt;&lt;/span&gt;No.  Unfortunately, at this time we will only support the .Net Framework 2.0+.  There is actually a very simple reason for why 1.1 support was left out - it's much more difficult to support for rollback.  The NGen update feature really was key to properly supporting NGen inside of Windows Installer's transaction model.  It enables robust rollback behavior by supporting the capability to rebuild native images that may have existed on the machine prior to an installation failure (in the case of collisions).  Unfortunately, since this feature wasn't available in the first version of NGen, it would make handling rollback much more difficult.  If there is enough demand, we could look at adding support for the .Net Framework 1.1, however, it would likely be less than the usual quality you've come to expect from WiX due to the limitations mentioned above.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Will this work with WiX 2.0?&lt;/span&gt;&lt;br /&gt;Yes.  Unlike most recent WiX toolset improvements, since this is a new extension, we were able to provide it for both WiX 2.0 and WiX 3.0.  However, you will need to update to the latest WiX 2.0 build in order to use the extension.  This is necessary because the &amp;lt;File&amp;gt; element previously did not allow extension child elements.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How do I use it?&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;Inform Candle, Lit, and Light of the new extension.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;In WiX 2.0, you need to specify the following for each tool:&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;ul&gt;&lt;li&gt;candle -ext "Microsoft.Tools.WindowsInstallerXml.Extensions.NetFxCompiler, WixNetFxExtension" ...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;lit -ext "Microsoft.Tools.WindowsInstallerXml.Extensions.NetFxCompiler, WixNetFxExtension" ...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;light -ext "Microsoft.Tools.WindowsInstallerXml.Extensions.NetFxCompiler, WixNetFxExtension" &amp;lt;path to netfx.wixlib&amp;gt; ...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;In WiX 3.0, its much simplier:&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;ul&gt;&lt;li&gt;candle -ext WixNetFxExtension ...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;lit -ext WixNetFxExtension ...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;light -ext WixNetFxExtension ...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;li&gt;Add the extension namespace to your WiX source file:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi" &lt;span style="font-weight: bold;"&gt;xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"&lt;/span&gt;&amp;gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Add a &amp;lt;NativeImage&amp;gt; element under each &amp;lt;File&amp;gt; you'd like to NGen:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;File Id="MyAssembly"&amp;gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    &amp;lt;netfx:NativeImage Id="MyNGenImage" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/File&amp;gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;That's it - just build everything and it should work.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Is NGen 2.0 queuing supported?&lt;br /&gt;&lt;/span&gt;Absolutely.  For those who are not aware of this great new feature - with NGen 2.0, you can now queue an assembly to be NGen'ed at a later time.  This is great for setups because it allows the installation to happen very quickly without typing up the user's machine doing expensive NGen operations.  Then, after the install is complete, the NGen service will detect when the computer is idle and automatically begin performing the queued NGen tasks.  By default, all NGen operations performed by WiX recieve the lowest priority, NGen on idle, to ensure the quickest setup experience.  However, this is fully configurable via the NativeImage/@Priority attribute.  Values range from 0 (NGen syncronously - this does not use queuing, the assembly is NGen'ed immediately) to 3 (NGen on idle).  You can use these settings to very granularly control the NGen behavior of your setup.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Are other NGen options like /AppBase, /Debug, ... supported?&lt;br /&gt;&lt;/span&gt;Most NGen 2.0 options are also supported, please see the documentation for the &amp;lt;NativeImage&amp;gt; element for more details on how to use them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Where can I find the documentation for the NGen functionality?&lt;br /&gt;&lt;/span&gt;The NGen functionality is documented under the "NativeImage Element" topic of WiX.chm.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How does the NGen functionality actually work?&lt;br /&gt;&lt;/span&gt;Is actually very simple.  There are two main custom actions: NetFxScheduleNativeImage and NetFxExecuteNativeImageCommit (NetFxExecuteNativeImage merely provides support for scenarios in which rollback is disabled).  The first custom action is the scheduler.  It looks at the NetFxNativeImage table to determine which actions need to be performed.  It then builds up a list of command lines for calling NGen.exe (which must be installed on the machine prior to installation).  The second custom action then calls the NGen.exe command lines.  So basically, all the WiX custom actions do are wrap up calls to the NGen.exe tool.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why is the extension called WixNetFxExtension?&lt;/span&gt;&lt;br /&gt;The word "NetFx" is the codename for the group that works on the .Net Framework technologies.  This extension was given a very broadly applicable name because we'd like it to support much more than just NGen in the future.  Already, you may have noticed that the extension contains some very useful locators for finding the .Net Framework 1.1 and 2.0 installation directories and SDK directories.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How do I use the new .Net Framework locators?&lt;/span&gt;&lt;br /&gt;The locators can be used by simply creating a reference to the appropriate &amp;lt;Property&amp;gt; which you would like to use in your setup.  For example, to get the directory in which the .Net Framework 1.1 SDK is installed on the user's machine during setup, add &amp;lt;PropertyRef Id="NETFRAMEWORK11SDKDIR"&amp;gt; to your authoring and use the property as you would any other.  Check out the file NetFxExtension.wxs in the WiX sources to see what other properties are supported.  Please note that these property names are subject to change as this support is very new.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Where can I find more information about using NGen?&lt;br /&gt;&lt;/span&gt;To find out more information on using NGen (which will help with using the WiX functionality as well), please see the following article by Surupa: &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/05/CLRInsideOut/default.aspx"&gt;http://msdn.microsoft.com/msdnmag/issues/06/05/CLRInsideOut/default.aspx&lt;/a&gt;.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24178245-115078119120084311?l=installing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://installing.blogspot.com/feeds/115078119120084311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24178245&amp;postID=115078119120084311' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/115078119120084311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/115078119120084311'/><link rel='alternate' type='text/html' href='http://installing.blogspot.com/2006/06/ngen-support-in-wix.html' title='NGen support in WiX'/><author><name>Derek Cicerone</name><uri>http://www.blogger.com/profile/07593077976542191522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24178245.post-114498461583444732</id><published>2006-04-21T13:38:00.000-07:00</published><updated>2006-08-31T03:43:28.293-07:00</updated><title type='text'>MSI Validation in WiX</title><content type='html'>One of the most frequently overlooked steps in building a Windows Installer setup is validation.  Validation is very important; it finds all sorts of problems with per-user installations, collisions between installed files, and other common authoring mistakes that are hard to catch until the complete MSI or MSM file is built.  Often, when debugging a setup problem, I've found that just running validation would quickly find the mistake(s).&lt;br /&gt;&lt;br /&gt;Ok, so if validation is so important, why doesn't everyone run it?  There's a few reasons: some people simply aren't aware of MSI validation, others are lazy, and the grand majority of people simply just forget because its an optional step.&lt;br /&gt;&lt;br /&gt;With WiX 3.0, running validation is now easier than ever because its integrated directly into Light.exe.  Just keep using the WiX tools like you always have in the past.  If Light finds any validation problems while linking your MSI or MSM file, it will simply display a warning or error message.  It's really that simple.  Best of all, Light will even display source line information about where an ICE error or warning came from when it's available.&lt;br /&gt;&lt;br /&gt;With the addition of the validation infrastructure to Light in WiX 3.0, we thought it would also be useful for the users of WiX 2.0 and other installation creation programs to have a simple way to run validation on their MSI or MSM files from the command line.  So, we're also releasing a new tool called Smoke which can run validation on any MSI or MSM file and reports errors and warnings in the same convenient command-line format as the other WiX tools.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What if I don't want to run validation?&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;If you would like to suppress validation, simply supply the option -sval to light.exe.  However, this is strongly discouraged since it means that you won't automatically get validation coverage on your setup.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Can I suppress an individual Internal Consistency Evaluator (ICE)?&lt;br /&gt;&lt;/span&gt;Absolutely, just pass -sice:&lt;ice&gt; on the command line.  For instance, to suppress ICE33, you would pass -sice:ICE33.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Are there any downsides to running validation in Light?&lt;/span&gt;&lt;br /&gt;Yes, running validation will make your builds a bit slower.  However, due to the benefits, the time spent validating is a very good trade-off in comparision to time wasted debugging issues that could have been caught simply by keeping validation on.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Do I really need to run validation?&lt;/span&gt;&lt;br /&gt;Running validation is a very important step in insuring that you are creating a quality setup experience for your users.  With this new validation feature, we were finally able to test our own MSI packages and we were shocked at the number of issues it found (since we'd like to consider ourselves somewhat experts in the setup area).  This resulted in several improvements to Candle and some of the extensions, but even with these improvements, we'll never be able to guarantee the coverage provided by simply running validation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Is there any documention on validation from the Windows Installer team?&lt;/span&gt;&lt;br /&gt;There are several good articles on MSDN about using validation:&lt;br /&gt;&lt;/ice&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/internal_consistency_evaluators_ices.asp"&gt;Internal Consisteny Evaluators&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/ice_reference.asp"&gt;ICE Reference&lt;/a&gt; - very useful for finding out what a particular ICE does&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/merge_module_ice_reference.asp"&gt;Merge Module ICE Reference&lt;/a&gt; - for finding out about merge module ICEs&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Where do ICEs come from?&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;ICEs are nothing more than custom actions which run against a database and display warnings and errors based on what they find.  Since they are merely custom actions, they are not surprisingly packaged into special Windows Installer database files with a .cub extension.  The extension may seem a bit arbitrary until you learn one vital piece of information: the true extension of these files is "cube" - "cub" is merely an 8.3 compliant name.  It's a play on words because the tests are called ICEs (ice cubes - get it?).&lt;br /&gt;&lt;br /&gt;The Windows Installer team distributes several cube files.  The two most notable files are darice.cub and mergemod.cub.  These cube files contain, respectively, the ICEs for MSI and MSM files.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;Which ICEs will WiX run against my MSI or MSM file?&lt;br /&gt;&lt;/span&gt;For MSI files, WiX will run all the ICE tests found in darice.cub.  For MSM files, WiX runs mergemod.cub.  Please note that ICE33 has been disabled by default because it forces authors to use the advertised COM tables instead of normal registry keys whenever possible.  Due to problems with using advertised COM registration in certain scenarios (like repair), the WiX team does not suggest this practice and thus has disabled the ICE by default.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;How does WiX run validation?&lt;/span&gt;&lt;br /&gt;WiX uses the method outlined &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/using_internal_consistency_evaluators.asp"&gt;here&lt;/a&gt;.  Basically, Light takes your MSI file, merges a .cub file into it, registers an external UI handler (like its going to run an installation), and then runs the custom action sequence found in the _ICESequence table (ignoring the ICEs you chose to suppress of course).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So, if an ICE is nothing more than a custom action, can I make my own?&lt;/span&gt;&lt;br /&gt;You can create your own ICE custom action and package it into a cube file, just like the standard cube files.  However, at this time, Light and Smoke do not support passing custom cube files into the validation engine.  If you would like this feature to be added, please open a request on &lt;a href="https://sourceforge.net/tracker/?group_id=105970&amp;atid=642717"&gt;SourceForge&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why is Smoke called "Smoke"?&lt;/span&gt;&lt;br /&gt;It's another play on words.  Because the smoke program essentially tests an MSI or MSM file for problems, its like a "smoke test".&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24178245-114498461583444732?l=installing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://installing.blogspot.com/feeds/114498461583444732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24178245&amp;postID=114498461583444732' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/114498461583444732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/114498461583444732'/><link rel='alternate' type='text/html' href='http://installing.blogspot.com/2006/04/msi-validation-in-wix.html' title='MSI Validation in WiX'/><author><name>Derek Cicerone</name><uri>http://www.blogger.com/profile/07593077976542191522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24178245.post-114425035507077434</id><published>2006-04-05T08:18:00.000-07:00</published><updated>2006-11-30T06:38:35.153-08:00</updated><title type='text'>heat.exe - making setup easier</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Today is April 5, 2006 – the 2 year anniversary of the WiX Open Source Project!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;What better way to celebrate the anniversary of the WiX Toolset than by releasing a new tool?  Today, I'm proud to announce the availability of Heat in WiX 3.0.  Heat is very similar in functionality to Tallow or the engine inside of ClickThrough: it has the capability to quickly capture files and directories from a computer and turn them into WiX authoring.  However, the functionality of heat goes well beyond what either of these tools could provide for capturing WiX authoring.  &lt;/span&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;A big thanks goes to Reid for helping me make Heat a reality - he came up with a lot of the original ideas for this project and was a huge help with the harder design and naming issues.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Heat is our attempt to create an entire ecosystem of what we're calling "harvesters" and "mutators" (more on the mutators later).  Harvesters are essentially WiX extensions which enable a developer to "harvest" any information into WiX authoring.  For example, we've just released a new WiX extension called the WixUtilExtension.  This extension contains a harvester that enables you to very quickly harvest an entire directory of files and any self-registration inside of those files.  So if you have an entire directory of DLL files which each use self-reg for their COM registration, you no longer need to run Tallow on each individual file.  You can now just run "heat.exe dir C:\directory -out sourceFile.wxs" and do this all automatically.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Unlike Tallow, Heat is optimized for working with WiX 3.0.  This means that it does not create Id attributes on Registry elements and doesn't set short file names.  Instead it relies on the auto-generation capabilities of Candle wherever possible.  When Heat cannot rely on Candle to generate an identifier, it does its best to create a unique one based on the name of the file or directory that is being harvested.  So if you harvest a file called "foo.dll", unless there is a collision with other files captured at the same time, its File/@Id will be "foo.dll" and the name of the component containing that file will be "foo.dll".  This should make it much, much easier to capture individual parts of your setup and paste them together into your product with minimal identifier collisions.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Heat makes creating simple setup authoring faster than ever before with a templating capability.  In the past, each time you create a new setup, you also had to create new Product, Package, etc... elements.  Or if you're like me, I'm guessing you just copied another WiX source file and tweaked it to make your setup.  With Heat, this is no longer necessary.  Just run Heat with the "template" command line option like this: "&lt;/span&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;heat.exe dir C:\directory -out sourceFile.wxs &lt;span style="font-style: italic;"&gt;-template:product&lt;/span&gt;".  This will do the normal harvesting, but then wrap the output up in a Product element.  Additionally, it will hook up your root directories under TARGETDIR and put your components under a default feature.  All you need to do is replace a few placeholders like "PUT-PRODUCT-NAME-HERE" with the actual values for your product and compiler/link.  It's literally that easy.  Just in case you are wondering, we still support auto-generation of guids - just use the -gg option.  It will even generate the ProductCode.  Of course, if you'd like to create a merge module quickly, you can just run with the -template:module option.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;If you've read this far, there's a very good chance that you're either excited by all the new functionality in Heat or a bit disappointed because nothing in there seems to be ground-breaking.  Well of course, I've saved the best part for last.  Heat is not a super-tallow or command line version of ClickThrough.  It's an engine for harvesting information into WiX authoring.  Although all my examples so far have dealt with files and directories, there's nothing about how Heat works that prevents it from capturing more interesting things.  Although its a bit under construction, Heat has the capability, today, to capture IIS web sites.  Simply run 'heat.exe website "My WebSite Name" -out sourceFile.wxs' to harvest a web site and all its files.  You can then compile and link with the WixIIsExtension to create an entire web site setup in minutes!  Please note: there are currently a few missing bits for this feature, like it doesn't set all the Id attributes yet (I'll try to get this done for next week).  Once this feature is completely finished, since Heat can set all the identifiers for you uniquely, generate all the guids, and wrap everything in a Product element with the nececessary ComponentRef elements, all you have to do is fill in a few placeholders like "PUT-PRODUCT-NAME-HERE"&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;I mentioned the idea of mutators earlier but didn't really go into what it meant.  Mutators are a new class of functionality within WiX similar to the compiler or linker.  A mutator is simply a class which takes a  WiX CodeDOM object as its input and mutates it.  Mutating is essentially like running a transform on XML, but since its a WiX CodeDOM, its strongly-typed and much easier to work with versus XML transforms.  Mutators are the secret behind why Heat is so simple and powerful.  In the past, if a harvesting tool (like Tallow) had options for tweaking its output by using fragments or wrapping the output in a Product element, the code doing the actual harvesting needed to be aware of those settings.  This made adding new functionality very cumbersome because each new extension had to be aware of all the options it should be support.  Even in Tallow, you may notice that depending upon how registry keys are harvested (from a .reg file or a self-reg capture), the output may differ.  In Heat this is not a problem - harvesters just capture the very simplest information possible, then rely upon the mutators to mutate the output to reflect the specific options the user wants.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;In later posts, I'll go into the details about how Heat works and how you can very easily write your own extensions to harvest whatever you find interesting.  As you might imagine, Heat can do much, much more than I'd want to talk about in this introductory post.  I hope to more fully explain its capabilities in later posts.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;How does this affect ClickThrough?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;ClickThrough will be refactored to use the harvesters and mutators of Heat as its new engine for capturing files from your machine.  There are currently a few issues with the internal WiX authoring created by ClickThrough - this will address those issues and ensure that future versions of ClickThrough remain more in-sync with any changes made to the WiX source schema.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;How does this affect Tallow?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Tallow will no longer exist in WiX 3.0.  Tallow will continue to be released as part of WiX 2.0.  The code for Tallow in WiX 2.0 and 3.0 is identical, so if you prefer to use Tallow instead of Heat, you can simply grab it from WiX 2.0.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;Why doesn't Heat allow me to specify the text for the placeholders on the command line so that I can generate my setup every time?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Heat is designed to allow a setup author to very quickly generate their setup authoring the first time.  From then onward, the authoring should be maintained manually to ensure that guids and identifiers remain stable and component rules are not broken.  In order to use Heat to generate setup every time, it would be necessary to create a database which tracks the components, their guids &amp; identifiers, and their files for every release of your product.  We call this a component catalog.  Heat does not provide a component cataloging capability - however - it does expose the necessary functionality so that anyone could write a component catalog, hook it into heat as an extension, and generate their setup automatically without breaking component rules.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;Where should I mail Heat bug reports or feature requests?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Please submit &lt;a href="https://sourceforge.net/tracker/?group_id=105970&amp;atid=642714"&gt;bug reports&lt;/a&gt; or &lt;a href="https://sourceforge.net/tracker/?group_id=105970&amp;amp;atid=642717"&gt;feature requests&lt;/a&gt; to the WiX site on SourceForge.  I've created new categories for Heat/harvester - please use them to ensure the bugs or feature requests are properly assigned.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;Are there any other planned features for Heat right now?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Sure, I think it would be nice to harvest a SQL database.  There have also been a lot of ideas floating around about working with Visual Studio projects.  I'm sure people will come up with lots of cool new things to do with Heat.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24178245-114425035507077434?l=installing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://installing.blogspot.com/feeds/114425035507077434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24178245&amp;postID=114425035507077434' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/114425035507077434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/114425035507077434'/><link rel='alternate' type='text/html' href='http://installing.blogspot.com/2006/04/heatexe-making-setup-easier.html' title='heat.exe - making setup easier'/><author><name>Derek Cicerone</name><uri>http://www.blogger.com/profile/07593077976542191522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24178245.post-114250233276258431</id><published>2006-02-13T01:45:00.000-08:00</published><updated>2006-08-31T05:36:57.446-07:00</updated><title type='text'>Auto-generation of short file and directory names</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;Auto-generation of short file and  directory names has finally been checked into WiX 3.0.  This feature should be  available in the very next release! &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Wingdings;font-size:100%;"  &gt;&lt;span style="font-family:Wingdings;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;Will this feature  be ported back to WiX 2.0?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;Unfortunately, this feature will not  be ported back to WiX 2.0.  It is simply too disruptive (it modifies the schema  for &lt;file&gt; and &lt;directory&gt; elements) and dangerous for the stable  2.0 codebase.&lt;o:p&gt;&lt;/o:p&gt;&lt;/directory&gt;&lt;/file&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;Should I upgrade  to WiX 3.0 to take advantage of this feature?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;This is a decision that each  individual team should make for themselves, but we do have some recommendations  based on what features your group is using and when you expect to  ship.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;First off, if your product is  shipping in 2006, please do not use WiX 3.0.  We simply cannot guarantee with  any certainty that WiX will be stable and bug-free enough in time for you to  ship your product.  We also reserve the right to continue deprecating and  replacing certain functionality in WiX 3.0 as well as create incompatibilities  between versions of WiX 3.0.  For example, so far we’ve deprecated FragmentRef,  deprecated all src attributes (in favor of more descriptive attributes like  SourceFile), broken backwards compatibility for wixout files, completely  re-vamped the WiX extensions and how they are packaged,  etc…&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;If you are shipping in 2007 or  later, then WiX 3.0 may be appropriate for your group.  We hope to have WiX 3.0  entering lockdown sometime near the middle to end of this year (more likely at  the end).  For comparison, WiX 2.0 entered lockdown in the fall of 2005, so we  like to spend about a year on stabilization.  Some of the things to look at for  your group are whether you can tolerate the need to infrequently update your  source code whenever features are deprecated or re-named.  We have a tool called  WixCop which will automatically update most wix source code the latest schemas,  however, it currently also re-formats code to a very strict standard of 2-space  indentation and double-quotes for attribute values.  For groups willing to adopt  this standard, wixcop makes it trivial to keep up-to-date and also police the  style of source code in your organization.  Sometimes features are deprecated with no replacement (like  FragmentRef).  In these cases, significant re-design by hand may be needed  (currently we only anticipate one more breaking change like this: we will no  longer support nested &lt;registry&gt; elements, instead, this functionality  will be replaced by &lt;registrykey&gt;, &lt;registryvalue&gt;, … elements with  much more explicit usage). &lt;o:p&gt;&lt;/o:p&gt;&lt;/registryvalue&gt;&lt;/registrykey&gt;&lt;/registry&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;I’m using WiX  3.0, how do I migrate my authoring to the new  schema?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;If your group can use WixCop, that  is definitely the preferred route since it will automatically update all your  sources (hopefully) without mistakes.  As I mentioned before, the downside is  that it also re-formats code to 2 space indenting.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;To migrate &lt;file&gt; elements  manually, do the following:&lt;o:p&gt;&lt;/o:p&gt;&lt;/file&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;Change this: &lt;span style="color:green;"&gt;&lt;span style="color:green;"&gt;&lt;file id="”fileId”" name="”short.txt”" longname="”This"&gt;&lt;/file&gt;&lt;/span&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;To this: &lt;span style="color:green;"&gt;&lt;span style="color:green;"&gt;&lt;file id="”fileId”" shortname="”short.txt”" name="”This"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/file&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;Change:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;Name -&gt;  ShortName&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;LongName -&gt;  Name&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;color:red;"   &gt;&lt;span style=";font-family:Arial;color:red;"  &gt;LongName is now  deprecated.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;Migration of &lt;directory&gt;  elements is a bit more complicated.&lt;o:p&gt;&lt;/o:p&gt;&lt;/directory&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;Change:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;Name -&gt;  ShortName&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;LongName -&gt;  Name&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;SourceName -&gt;  ShortSourceName&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;LongSource -&gt; SourceName (note  that this is a bit weird because the old name was missing  “Name”)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;color:red;"   &gt;&lt;span style=";font-family:Arial;color:red;"  &gt;LongName and LongSource  are now deprecated.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;I’m using WiX 3.0  how do I take advantage of this feature and stop specifying short  names?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;For existing authoring, after  migrating to the new schema as outlined above, remove the Short* attributes.   WiX will then automatically generate the short names for  you.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;For new authoring, just stop  specifying the Short* attributes.  So for a file, just specify File/@Name.  For  a directory, just specify Directory/@Name (and the optional  Directory/@SourceName if necessary).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;How do I specify  a file name that is already short?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;If you have a file name that is  already short and 8.3-compliant, like file.txt or example.doc, you just specify  this file name in the Name attribute (not the ShortName attribute).  WiX will  automatically determine that you’ve specified a valid short file name and  suppress generating a short name.  The idea here is that you should never have  to specify anything other than the Name attribute, regardless of whether the  desired name is long or short.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;How does WiX  create the short file and directory names?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;The short file names are created  using the following algorithm:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;ol style="margin-top: 0in;" type="1"&gt;&lt;li class="MsoNormal"  style="color:gray;"&gt;&lt;span style=";font-family:Arial;font-size:100%;color:black;"   &gt;&lt;span style="color: rgb(0, 0, 0);font-family:Arial;" &gt;Create a string  by concatenating “File” + ‘|’ + &amp;lt;parent&amp;gt; + ‘|’ +  &amp;lt;lowercase filename&amp;gt;.  &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;The pipe characters (‘|’) are  necessary for canonicalization.  The “File” at the front allows us to expand  this feature in the future to cover &lt;removefile&gt; or other short file names  we’d like to generate under components.  The parent component identifier is used  instead of the file identifier because someday I’d like to add the feature of  automatically generating the file identifier as well.  The long file name is  lowercased for canonicalization purposes.  Canonicalization for short file names  basically means that we’d like to see a collision of generated short file names  whenever we can expect to see a collision of long file names within a single  component.&lt;o:p&gt;&lt;/o:p&gt;&lt;/removefile&gt;&lt;/span&gt;&lt;/span&gt;  &lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;MD5 hash the string  into a 128-bit hash.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;  &lt;/li&gt;&lt;li class="MsoNormal"  style="color:gray;"&gt;&lt;span style=";font-family:Arial;font-size:100%;color:black;"   &gt;&lt;span style="color: rgb(0, 0, 0);font-family:Arial;" &gt;Convert the hash  into a base64 string and replace illegal file name characters with appropriate  alternatives.  &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;Specifically, we replace ‘/’ with  underscore (‘_’) and ‘+’ with dash (‘-‘).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;  &lt;/li&gt;&lt;li class="MsoNormal"  style="color:gray;"&gt;&lt;span style=";font-family:Arial;font-size:100%;color:gray;"   &gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Lowercase the entire base64 string  and truncate it to 8 characters in length.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;  &lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;If an extension existed  for the original long file name, append up to 3 characters from that extension  onto the end of the new string from the last step.  &lt;span style="color:gray;"&gt;&lt;span style="color:gray;"&gt;For example, if the long file name was “sources”, then no  extension is added, if the long file name was “text.txt”, append “.txt”, and if  the long file name was “my project.csproj”, append  “.csp”.&lt;/span&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;The algorithm for creating short  directory names is very similar.  The only differences are that we use the  directory’s identifier instead of the parent file identifier in step 1 and there  is no extension handling for step 5.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;How will using  generated short file and directory names affect  patching?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;Since the generated short file and  directory names are actually hashes of the user-specified long file and  directory names, these names should remain consistent as long as the file names  and relevant identifiers included in the hash (see previous question for more  info about which identifiers are included in the hash) do not  change.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;What happens if I  move a file containing a generated short file name to another  component?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;The generated short file name will  likely change since the parent component identifier is part of the hash which  defines the generated short file name.  This is expected behavior and by  design.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;What if I use the  same long file names in many components; will the generated short file names  collide?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;We’ve tried very hard not to prevent  short file names for colliding when appropriate.  The only time that we’d like  generated short file names to collide is when the same long file name is  duplicated in a single component (since this makes the installer attempt to  install multiple files to the same file name on the target machine).  Since the  hash used to generate the short file names includes the parent component  identifier of the file, theoretically, re-using the same long file name in  multiple components should not be a problem.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;What happens when  a generated short file name collides with another generated short file  name(s)?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;Light.exe has now been updated to  detect collisions of generated short file names across all files in a single  msi/msm file.  It does not take into account directories since it’s possible to  re-map almost any directory to any path on the target  machine.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;If a collision is detected before  you ship your product for the first time, you can update any or all of the  colliding files by manually specifying the ShortName attribute.  Unfortunately,  it’s not possible for WiX to automatically resolve collisions since that would  not result in 100% stable generated short file names (depending upon whatever  else you compiled with, names may differ across products or merge modules).  So  these collisions must always be resolved by hand.  In testing, we found  collisions to be quite rare (in fact we were never able to create  one).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;If a collision is detected while  patching an older product or while creating a minor product update, it is very  important to only specify ShortName on the newly added files for the patch or  update.  This will keep the previously shipped file names consistent.  Please  remember that although you may not anticipate your customer ever installing to  short file names, it is almost always possible that they  did.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;What happens when  a generated short directory name collides with another generated short directory  name(s)?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;Currently: nothing.  If this is a  problem, we can attempt to detect this scenario in the  future.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;When will the  File/@LongName and other deprecated attributes be removed from  WiX?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;We usually keep deprecated features  in for about a year or so to allow everyone time to update.  The deprecated  attributes will likely work until at least 2007.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-weight: bold;font-family:Arial;" &gt;I’m using WiX  3.0, do I have to update my schema?  Do I have to use the auto-generated short  names?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;No and no.  As long as support for  the deprecated attributes remains (until 2007), you don’t need to update.   However, we strongly encourage updating since the deprecated attributes will  eventually be removed entirely.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style=";font-family:Arial;font-size:100%;"  &gt;&lt;span style="font-family:Arial;"&gt;You never need to use the new  auto-generated short names feature if you don't want to use it.  Simply begin specifying the new ShortName  attributes to continue manually specifying short file  names.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24178245-114250233276258431?l=installing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://installing.blogspot.com/feeds/114250233276258431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24178245&amp;postID=114250233276258431' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/114250233276258431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/114250233276258431'/><link rel='alternate' type='text/html' href='http://installing.blogspot.com/2006/02/auto-generation-of-short-file-and.html' title='Auto-generation of short file and directory names'/><author><name>Derek Cicerone</name><uri>http://www.blogger.com/profile/07593077976542191522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24178245.post-114250066886289364</id><published>2006-01-09T01:16:00.000-08:00</published><updated>2006-05-09T09:37:36.176-07:00</updated><title type='text'>Candle (part 1)</title><content type='html'>The core of the WiX toolset primarily consists of a compiler and a linker. The compiler is called candle and the linker is called light (here's an explanation of how these names came about).  The functionality provided in each of these tools seems to be a source of constant debate by many users of WiX.  I've even been confused about whether a certain operation was performed in the compiler or linker from time-to-time.  For this post, I'd like to talk about candle. Parsing The guts of candle are basically implemented in two classes: preprocessor.cs (the preprocessor) and compiler.cs (the compiler).  Let's leave a discussion of preprocessor.cs for another time.  The class Microsoft.Tools.WindowsInstallerXml.Compiler in compiler.cs is nothing more than a simple recursive-decent parser.  Although the formal definition seems to make this seem complicated, it really isn't.  An example will probably be the easiest way to illustrate how simple the parsing code is.  Here's the contents of a simple WiX source file (let's call it example.wxs):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The compiler will begin parsing this file by looking at the  element first.  This is done by calling ParseWixElement.  Inside the method ParseWixElement (which can be found in compiler.cs), there is a foreach loop for processing each of the child elements under a Wix element.  In fact, here's a simplied version of what that code looks like:         ///&lt;br /&gt;     /// Parses a Wix element.&lt;br /&gt;     ///&lt;br /&gt;     /// Element to parse.&lt;br /&gt;     private void ParseWixElement(XmlNode node)&lt;br /&gt;     {&lt;br /&gt;         foreach (XmlNode child in node.ChildNodes)&lt;br /&gt;         {&lt;br /&gt;             if (XmlNodeType.Element == child.NodeType)&lt;br /&gt;             {&lt;br /&gt;                 switch (child.LocalName)&lt;br /&gt;                 {&lt;br /&gt;                     case "Fragment":&lt;br /&gt;                         this.ParseFragmentElement(child);&lt;br /&gt;                         break;&lt;br /&gt;                     case "Product":&lt;br /&gt;                         this.ParseProductElement(child);&lt;br /&gt;                         break;&lt;br /&gt;                     default:&lt;br /&gt;                         this.core.UnexpectedElement(node, child);&lt;br /&gt;                         break;&lt;br /&gt;                 }&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;     } Since the first child element of the  element is a  element, the compiler will then call ParseFragmentElement.  This method would then call ParsePropertyElement.  There is a Parse*Element method for each of the elements supported by WiX in its source files.  Each element roughly corresponds to a particular table in an MSI file.  So, in the example above, we'd be creating a single row in the Property table by writing a  element. To be continued...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24178245-114250066886289364?l=installing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://installing.blogspot.com/feeds/114250066886289364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24178245&amp;postID=114250066886289364' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/114250066886289364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24178245/posts/default/114250066886289364'/><link rel='alternate' type='text/html' href='http://installing.blogspot.com/2006/01/candle-part-1.html' title='Candle (part 1)'/><author><name>Derek Cicerone</name><uri>http://www.blogger.com/profile/07593077976542191522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>
