<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.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:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-9537945</id><updated>2009-07-11T20:13:58.026-05:00</updated><title type="text">DeploymentEngineering.com - The Blog</title><subtitle type="html">A panel of experts discuss cutting edge ideas related to the Source Control, Build Automation, Setup Authoring and Automated Application Deployment.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.deploymentengineering.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default?start-index=26&amp;max-results=25" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>265</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/DeploymentEngineering" type="application/atom+xml" /><entry><id>tag:blogger.com,1999:blog-9537945.post-3696013152252810775</id><published>2009-07-10T18:55:00.003-05:00</published><updated>2009-07-10T19:18:57.748-05:00</updated><title type="text">Austin meets Heat</title><content type="html">&lt;a href="http://4.bp.blogspot.com/_28H3HFywulA/SlfaCYtl-hI/AAAAAAAAANU/bJPnI4IU3v0/s1600-h/Austin.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 117px;" src="http://4.bp.blogspot.com/_28H3HFywulA/SlfaCYtl-hI/AAAAAAAAANU/bJPnI4IU3v0/s400/Austin.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5356990016308771346" /&gt;&lt;/a&gt;&lt;br /&gt;Whew it's been hot in Texas lately.  AFAIK it's been 100f+ for the last several weeks with no end in sight.  Accordign to weather data, the max temp for last month was 106f with an average of 99f and a min of 90f.   This month we are tracking for 106f, 102f and 93f.    Whew.&lt;br /&gt;&lt;br /&gt;So what does this have to do with setup?  Well, I've been playing with WiX's Heat a lot lately.  I got tired of running heat from a command prompt and then repeating my same cleanup tasks over and over so I decided to automate it a little with a C# winforms application.  While I was at it, I added an interesting feature that I thought was a bit gimmicky at first until I started getting feedback on how cool it was.&lt;br /&gt;&lt;br /&gt;What did I add?  Simple: a FileSystemWatcher that monitors a directory for updates and then dynamically regenerates the wix document, cleans it up and then refreshes the display to show the new WiX code.  With multiple monitors you just stage the dirctory on one screen while watching the program write the code for you on the other screen.&lt;br /&gt;&lt;br /&gt;It's really a simple concept but everyone finds it quite informative. Once you have what you want you just cut and paste it into your Votive project.&lt;br /&gt;&lt;br /&gt;So I was going to call this new tool "Blow Torch" but when I asked a coworker who is also named Chris how he liked the name he just said that he'd call it Austin.&lt;br /&gt;&lt;br /&gt;Austin? Hmmm....  Sure, Why not?  I like the sound of it.&lt;br /&gt;&lt;br /&gt;So the hear finally destroyed our HVAC plant at work and everyone was sent home for the weekend early.  This gave me a few hours to work and now I have Austin built and packaged.   For now I'm just going to tease everyone with a screenshot but hopefully in a week or so I'll pass all of quality checks and release this tool for others to play with.   That process might go faster if people actually bug me for a copy. ( Hint Hint! )&lt;br /&gt;&lt;br /&gt;BTW, in case your wondering why the screenshot has a refresh button, I'm working on making it a feature to scan automatically or manually.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-3696013152252810775?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/LSoppA5bl50" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/3696013152252810775/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=3696013152252810775" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/3696013152252810775" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/3696013152252810775" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/LSoppA5bl50/austin-meets-heat.html" title="Austin meets Heat" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_28H3HFywulA/SlfaCYtl-hI/AAAAAAAAANU/bJPnI4IU3v0/s72-c/Austin.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/07/austin-meets-heat.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-5952153036221200650</id><published>2009-07-04T14:41:00.004-05:00</published><updated>2009-07-05T08:50:17.222-05:00</updated><title type="text">WiX 3.0 Ships</title><content type="html">Wix 3.0.5419 has been promoted to Production Stable quality on SourceForge.net and can be downloaded &lt;a href="http://sourceforge.net/projects/wix/files/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've been fairly critical of WiX over the years but today marks a turning point in that believe. With the release of 3.0, many features are now in place that begin to make a really strong case for seriously considering the use of WiX over legacy tools. While WiX still lacks a 1st class bootstrapper/chainer and proper IDE GUI design tools that other tools have, I believe that the core foundation of WiX is much better positioned for the future. &lt;br /&gt;&lt;br /&gt;Hopefully we'll see WiX 3.5 ( featuring Burn )in 6-12 months to address these concerns. I also hope to see Votive explode into a fully featured visual studio add-in.  Finally, I expect a market of WiX based designer tools to appear.  Hopefully WiXAware 3.0 will be released ( and even more hopefully that it actually work! ) and I also anticipate InstallShield will eventually bring tools to market based on WiX.  IMO it is inevitable and the InstallShield brand as a packaging tool will not survive if they do not.&lt;br /&gt;&lt;br /&gt;So there it is: WiX 3.0 is shipped and I now see the road that I will travel towards over the coming months.  With dozens of installers composed from hundreds of merge modules and tens of thousands of files, it'll take us awhile to get there from sure.  But I am no convinced that the effort will be worthwhile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-5952153036221200650?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/6Ca2X0jZDII" height="1" width="1"/&gt;</content><link rel="related" href="http://robmensching.com/blog/posts/2009/7/4/WiX-v3.0-released" title="WiX 3.0 Ships" /><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/5952153036221200650/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=5952153036221200650" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/5952153036221200650" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/5952153036221200650" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/6Ca2X0jZDII/wix-30-ships.html" title="WiX 3.0 Ships" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/07/wix-30-ships.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-7044849351018497430</id><published>2009-06-25T09:45:00.002-05:00</published><updated>2009-06-25T09:53:16.472-05:00</updated><title type="text">Two Blog Articles on Windows 7 Compatibility Shims Every Install Developer Should Be Aware Of</title><content type="html">Both of these were referenced on Stefan's InstallSite blog but I thought I'd reference them too.  Both blog articles are on &lt;a href="http://blogs.msdn.com/cjacks/default.aspx"&gt;Chris Jackson's Semantic Consonance blog&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/cjacks/archive/2009/05/06/why-custom-actions-get-a-windows-vista-version-lie-on-windows-7.aspx"&gt;Why Custom Actions get a Windows Vista Version Lie on Windows 7&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/cjacks/archive/2009/06/18/pca-changes-for-windows-7-how-to-tell-us-you-are-not-an-installer-take-2-because-we-changed-the-rules-on-you.aspx"&gt;PCA Changes for Windows 7: How To Tell Us You are Not an Installer, Take 2 (because we changed the rules on you)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-7044849351018497430?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/coc94WB-bb0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/7044849351018497430/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=7044849351018497430" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/7044849351018497430" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/7044849351018497430" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/coc94WB-bb0/two-blog-articles-on-windows-7.html" title="Two Blog Articles on Windows 7 Compatibility Shims Every Install Developer Should Be Aware Of" /><author><name>Colby</name><uri>http://www.blogger.com/profile/08696301684260588101</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09104302108733971174" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/06/two-blog-articles-on-windows-7.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-8729874996162293731</id><published>2009-06-24T15:07:00.002-05:00</published><updated>2009-06-24T15:14:08.567-05:00</updated><title type="text">DRM Activation Question</title><content type="html">ShadowWolf recently commented:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;blockquote&gt;Activation ( and reactivation ) are pretty par for the course in the business tool world from what I've seen. I don't know that anyone really "likes" it, but it definitely serves a legitimate purpose.&lt;/blockquote&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;This comment made me wonder, is this true? I work in an environment with airgaps around our network connections for security purposes and I can't think of a single tool that we use besides InstallShield that requires activation and/or reactivation.&lt;br /&gt;&lt;br /&gt;Sure, Windows does (once) but they also offer a volume license key that doesn't require activation. Microsoft Office works the same way. Visual Studio, TFS and so on. Even our IBM/Rational products don't give us this problem and trust me, those are some pretty darn expensive tools. The only product that we use that I can think of is Robohelp.&lt;br /&gt;&lt;br /&gt;So I'm curious, what are some of the products my readers use that require activation?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-8729874996162293731?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/Fk-d18jti1Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/8729874996162293731/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=8729874996162293731" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/8729874996162293731" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/8729874996162293731" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/Fk-d18jti1Y/drm-activation-question.html" title="DRM Activation Question" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/06/drm-activation-question.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-7995412096058399317</id><published>2009-06-18T22:56:00.002-05:00</published><updated>2009-06-19T21:33:11.213-05:00</updated><title type="text">InstallShield 2010 vs WiX 3.0</title><content type="html">It's been no secret that I've favored InstallShield over WiX for many years.  I've used InstallShield products since 1997 and I've shipped hundreds of installers using this versatile tool.   InstallScript, XML Locator, Setup Prerequisites, Multiple Instance Support, COM Extraction, MySQL, Dialog/Control editors, Product/Release configurations and Component authoring wizards/views have made me a very productive and profitable person over the years.&lt;br /&gt;&lt;br /&gt;Unfortunatly, there are also things I dislike about InstallShield.  The DRM activation ( and now reactivation with IS2010 ) is horrible, difficulty in trying to get updates in an offline scenario (which we always are for security purposes), the random crashes, the horrible DTD/XML transformation, sequenced primary keys and of course, the removal of the stand alone build from Professional and totally useless collaboration tool combined with the really high price of the product.&lt;br /&gt;&lt;br /&gt;If I'm hurting anyones feelings, I'm sorry.  It's hard for me too since I've used this tool for so long and I do believe it's still a very good tool for many development shops.  Just not for mine.&lt;br /&gt;&lt;br /&gt;At my day job, I lead a team of 4 ( going on 6! ) setup developers.  We collectively maintain dozens of installs that generate and consume hundreds of merge modules from a software product line.  Our typical installer ships 10,000 - 15,000 files and includes countless databases, services, webservices and many chained packages of programs that we integrate with.   All of this occurs on many active branches.&lt;br /&gt;&lt;br /&gt;Unfortunatly InstallShield with it's DTD XML and incremented primary keys just doesn't work well in this environment.   Merging branches back together in clearcase is a nightmare since you always end up with unresolved conflicts.  Enter WiX.   The XSD XML is 95% smaller then DTD XML and is way more expressive.   Also thanks to deterministically unique primary keys and guids,  changes done on multiple branches can actually merge back together easily.&lt;br /&gt;&lt;br /&gt;The problem with WiX of course is the lack of gui designer abstractions and visualizations.  Fortunatly I finally have a solution for that.  I've recently had an internal tools developer assigned to me to come up with our own collaboration tools to sit on top of votive.   Once complete we are hoping to once again try decentralized setup development.   I'm not sure it'll work ( it didn't last time ) but we are going to give it a try again.    The reality is our environment is growing so fast that we need to retool and try new strategies to keep up.  Hiring more and more people just doesn't seem to work anymore.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-7995412096058399317?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/kYBFqGC866s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/7995412096058399317/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=7995412096058399317" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/7995412096058399317" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/7995412096058399317" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/kYBFqGC866s/installshield-2010-vs-wix-30.html" title="InstallShield 2010 vs WiX 3.0" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/06/installshield-2010-vs-wix-30.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-8486935352674431407</id><published>2009-05-28T21:39:00.003-05:00</published><updated>2009-05-28T21:47:51.936-05:00</updated><title type="text">Now Hiring - Austin, TX</title><content type="html">I'm looking for an experienced InstallShield / MSI / WiX / BuildForge / TFS / C# software engineer to join my team in Southwest Austin, TX.   The engineer will be part of a Build and Install team that currently consists of 8 members with 3 more on the way to meet our ever growing needs.&lt;br /&gt;&lt;br /&gt;Please contact me at chrpai@deploymentengineering.com if you are interested.  &lt;br /&gt;&lt;br /&gt;Please note, due to customer requirements, all applicants must be a US citizen. Ability to obtain and maintain a US Security Clearance is required; an active clearance is highly desirable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-8486935352674431407?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/nG3gldFNzyo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/8486935352674431407/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=8486935352674431407" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/8486935352674431407" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/8486935352674431407" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/nG3gldFNzyo/now-hiring-austin-tx.html" title="Now Hiring - Austin, TX" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/05/now-hiring-austin-tx.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-4431663172950411831</id><published>2009-04-27T22:23:00.005-05:00</published><updated>2009-04-29T21:58:12.138-05:00</updated><title type="text">Trip Down Memory Lane</title><content type="html">&lt;a href="http://1.bp.blogspot.com/_28H3HFywulA/SfZ5HQefXaI/AAAAAAAAANM/PfAwSNBjtMQ/s1600-h/chrismarine.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 135px; height: 220px;" src="http://1.bp.blogspot.com/_28H3HFywulA/SfZ5HQefXaI/AAAAAAAAANM/PfAwSNBjtMQ/s400/chrismarine.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5329580374628457890" /&gt;&lt;/a&gt;&lt;br /&gt;I don't talk about this much these days, but before my career in computers I was once a musician. From 1993 to 1996, I was assigned for duty with "&lt;a href="http://drumcorps.mbw.usmc.mil/"&gt;The Commandant's Own&lt;/a&gt;" United States Marine Drum and Bugle Corps. It was quite an honor to have earned the privilege to tour with such an outstanding group. &lt;br /&gt;&lt;br /&gt;Those were some really great years of my life. Thanks to Facebook, I'm able to keep in touch with my &lt;a href="http://drumcorps.mbw.usmc.mil/former.htm"&gt;former fellow Marines&lt;/a&gt; and in June we'll be having a 75th anniversary reunion in Washington, DC.&lt;br /&gt;&lt;br /&gt;So turn up your speakers and press play for a trip down memory lane.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/MuRm81XPig0&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/MuRm81XPig0&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-4431663172950411831?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/CXSk8AHI21Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/4431663172950411831/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=4431663172950411831" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/4431663172950411831" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/4431663172950411831" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/CXSk8AHI21Y/trip-down-memory-lane.html" title="Trip Down Memory Lane" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_28H3HFywulA/SfZ5HQefXaI/AAAAAAAAANM/PfAwSNBjtMQ/s72-c/chrismarine.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/04/trip-down-memory-lane.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-7565699039927204609</id><published>2009-04-17T20:04:00.002-05:00</published><updated>2009-04-17T20:37:58.639-05:00</updated><title type="text">WiX DTF Mystery Solved</title><content type="html">Last October a (then) former ( and now current ) coworker also named Chris asked me the following in an email:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;blockquote&gt;I am running into a problem with a DTF custom action.  When the action tries to run I get:&lt;br /&gt; &lt;br /&gt;"SFXCA: Failed to create new CA process via RUNDLL32."  &lt;br /&gt;&lt;br /&gt;This on is weird because I am using the exact same module in another product on the same machine and it works like a champ. Bizarre.&lt;br /&gt;&lt;/blockquote&gt;&lt;/em&gt;&lt;br /&gt;My initial reply was:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;blockquote&gt;Are any CA's running before it?&lt;/blockquote&gt;&lt;/em&gt;&lt;br /&gt;I hadn't seen this error before and I was a little concerned because I was such a proponent of DTF and managed custom actions I was afraid that perhaps DTF had an Achilles' heel.   I also knew that where my friend worked was the home of a very restrictive environment so if anyone would find a problem with DTF, it would be him!  &lt;br /&gt;&lt;br /&gt;I introduced Chris to the creator of DTF, Jason Ginchereau, and the two attempted to troubleshoot the problem with little progress.  I didn't really follow up on it because at the time I was busy cranking through sprints for a new product at Multimedia Games.&lt;br /&gt;&lt;br /&gt;Fast forward five months and I'm working with Chris again refactoring build automation, creating installation tools and writing custom actions for installs.  Suddenly the ugly RUNDLL problem rears it's head again only this time it's MY problem because I'm now the install team lead and I'm always saying how good DTF is.&lt;br /&gt;&lt;br /&gt;Rats.&lt;br /&gt;&lt;br /&gt;So I email Jason again and log a bug (&lt;a href="http://sourceforge.net/tracker/?func=detail&amp;atid=642714&amp;aid=2710297&amp;group_id=105970"&gt;SF210297&lt;/a&gt;) at SourceForge to make sure it gets proper attention this time.    This time Jason sees some problems on the unmanaged side of DTF.   He was assuming that the current working directory of the recycled process hadn't been mucked with ( remember my comment about other CA's scheduled prior? ) when he made his call to RUNDLL32.&lt;br /&gt;&lt;br /&gt;So to make a long story short, I just completed an effort with the build team today to update 30 some virtual machines to have WiX 3.0.5210.0.  Between this bug fix and many others related to DTF,  I really suggest that anyone using DTF custom actions in builds prior to 5210 upgrade ASAP and don't ship your product until you do.   You might never come across this problem but I know I sleep better knowing I won't either now also.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-7565699039927204609?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/d7xJT2rrSqM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/7565699039927204609/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=7565699039927204609" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/7565699039927204609" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/7565699039927204609" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/d7xJT2rrSqM/wix-dtf-mystery-solved.html" title="WiX DTF Mystery Solved" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/04/wix-dtf-mystery-solved.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-8660321505543469389</id><published>2009-04-15T22:14:00.003-05:00</published><updated>2009-04-15T22:27:38.134-05:00</updated><title type="text">InstallAware Email Thread ... Is this for real?</title><content type="html">I came across a very interesting email thread that is really far out there.  I almost want to believe it's a fake but having dealt with InstallAware and Michael Nesmith in the past, I can only conclude that it's legit.&lt;br /&gt;&lt;br /&gt;You can read the exchange &lt;a href="http://www.codeproject.com/Lounge.aspx?msg=2994975#xx2994975xx"&gt;here&lt;/a&gt; at CodeProject.com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-8660321505543469389?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/GWDgNqjP76I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/8660321505543469389/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=8660321505543469389" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/8660321505543469389" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/8660321505543469389" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/GWDgNqjP76I/installaware-email-thread-is-this-for.html" title="InstallAware Email Thread ... Is this for real?" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/04/installaware-email-thread-is-this-for.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-4769167162666877254</id><published>2009-04-01T07:10:00.008-05:00</published><updated>2009-04-01T07:42:39.941-05:00</updated><title type="text">When You Wish Upon A Star</title><content type="html">&lt;a href="http://1.bp.blogspot.com/_28H3HFywulA/SdNgZAtL35I/AAAAAAAAAMg/SXyuJ4CRFPc/s1600-h/girlsgrowingup.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_28H3HFywulA/SdNgZAtL35I/AAAAAAAAAMg/SXyuJ4CRFPc/s400/girlsgrowingup.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5319701567657205650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;When you wish upon a star&lt;br /&gt;Makes no difference who you are&lt;br /&gt;Anything your heart desires&lt;br /&gt;Will come to you&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Wow, have they grown fast! It seems like just yesterday that Ashley and Emma was born.&lt;br /&gt;&lt;br /&gt;When you have a 4 year old and a 6 year old who both are princesses, there's only place you can go for vacation... it's simply time to visit the mouse.&lt;br /&gt;&lt;br /&gt;Anyone have tips for a first-timer? We'll be going in May before Memorial day.&lt;br /&gt;&lt;br /&gt;Wish me luck! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-4769167162666877254?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/r5GhUb-KH5k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/4769167162666877254/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=4769167162666877254" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/4769167162666877254" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/4769167162666877254" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/r5GhUb-KH5k/when-you-wish-upon-star.html" title="When You Wish Upon A Star" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_28H3HFywulA/SdNgZAtL35I/AAAAAAAAAMg/SXyuJ4CRFPc/s72-c/girlsgrowingup.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/04/when-you-wish-upon-star.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-4948884954290408565</id><published>2009-03-27T16:35:00.003-05:00</published><updated>2009-03-27T16:41:00.352-05:00</updated><title type="text">Interesting Tweet</title><content type="html">I just saw this &lt;a href="http://twitter.com/jnoellsch/statuses/1388656912"&gt;tweet&lt;/a&gt; on Twitter:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_28H3HFywulA/Sc1HWWoKC9I/AAAAAAAAAMA/74SDgwmqM7Y/s1600-h/tweet.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 273px;" src="http://3.bp.blogspot.com/_28H3HFywulA/Sc1HWWoKC9I/AAAAAAAAAMA/74SDgwmqM7Y/s400/tweet.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5317985184351128530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I don't know the whole back story, and I'm sorry Jim feels that his work is going down the drain, but I only have one thing to say to this:&lt;br /&gt;&lt;br /&gt;Hip Hip Hooray!!!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-4948884954290408565?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/WKf_JrS1ql4" height="1" width="1"/&gt;</content><link rel="related" href="http://twitter.com/jnoellsch/statuses/1388656912" title="Interesting Tweet" /><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/4948884954290408565/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=4948884954290408565" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/4948884954290408565" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/4948884954290408565" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/WKf_JrS1ql4/interesting-tweet.html" title="Interesting Tweet" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_28H3HFywulA/Sc1HWWoKC9I/AAAAAAAAAMA/74SDgwmqM7Y/s72-c/tweet.PNG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/03/interesting-tweet.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-3237486348373722078</id><published>2009-03-20T08:24:00.004-05:00</published><updated>2009-03-20T10:19:53.606-05:00</updated><title type="text">SQL Server 2005 SP3 Horrible Setup Experience Results in BSOD</title><content type="html">I maintain a bootstrapper at work and recently we were asked to update SQL Server 2005 SP2 to SQL Server 2005 SP3.&lt;br /&gt;&lt;br /&gt;Not a big deal, right?&lt;br /&gt;&lt;br /&gt;Wrong!&lt;br /&gt;&lt;br /&gt;When installing SQL 2005 SP3 the setup just blows chunks and reboots the computer via blue screen of death!&lt;br /&gt;&lt;br /&gt;Worse, the machine goes into an infinite reboot because the installation is an incomplete state and everytime the SQL services try to start the machine BSODS again.&lt;br /&gt;&lt;br /&gt;You can boot safe mode and disable the services and then reboot again.  But if you attempt to uninstall SQL server you get an error message saying it can't be accomplished.&lt;br /&gt;&lt;br /&gt;Wow, thank you Microsoft, you've outdone yourself yet again.&lt;br /&gt;&lt;br /&gt;So in digging into this problem it seems that the SQL team is &lt;a href="http://blogs.msdn.com/petersad/archive/2009/01/20/sql-server-2005-sp3-sql-server-2005-sp2-cus-or-sql-server-2008-may-cause-xp-sp2-to-restart.aspx"&gt;punting&lt;/a&gt; to the Windows team.   They are saying that they manifested PE files for Vista/2008 in SP3 and that due to a bug in Windows SXS on SP2 ( hotfix available for SP2 or otherwise update to SP3 ) that there is nothing the SQL team can due to solve this.&lt;br /&gt;&lt;br /&gt;Um, they could at least put an AppSearch/LaunchCondition into their install so that my machine doesn't turn into a burning pile of dung!&lt;br /&gt;&lt;br /&gt;Anyways here's my official warning.  Avoid SP3 like the plague and if you must go there, make sure you provide your own prereq check for SP3 or SxS hotfix level in and as always make sure you integration test your installs on the lowest platform configuration possible.    I'd hate for some ISV to test on SP3, never see this problem and then ship a product that embeds SQL to a customer.  I'd hate even more to have to be taking that BSOD support call.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-3237486348373722078?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/YmeaYnqE9SI" height="1" width="1"/&gt;</content><link rel="related" href="http://blogs.msdn.com/petersad/archive/2009/01/20/sql-server-2005-sp3-sql-server-2005-sp2-cus-or-sql-server-2008-may-cause-xp-sp2-to-restart.aspx" title="SQL Server 2005 SP3 Horrible Setup Experience Results in BSOD" /><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/3237486348373722078/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=3237486348373722078" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/3237486348373722078" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/3237486348373722078" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/YmeaYnqE9SI/sql-server-2005-sp3-horrible-setup.html" title="SQL Server 2005 SP3 Horrible Setup Experience Results in BSOD" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/03/sql-server-2005-sp3-horrible-setup.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-5437632789561237941</id><published>2009-03-09T11:14:00.003-05:00</published><updated>2009-03-16T10:56:46.160-05:00</updated><title type="text">Records Being Dropped From Merge Module Projects When Built Using the InstallShield 2009 Standalone Build</title><content type="html">---------------------------------------------------------------&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#3366ff;"&gt;[Update/Retraction 3/16/09]&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#3366ff;"&gt;I like to think I'm a big enough man to admit when I'm wrong, so here goes...&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#3366ff;"&gt;The problem reported in this post is fixed by updating to the SP2 version of IS 2009 Standalone Build.  Now in my defense, I didn't &lt;em&gt;know&lt;/em&gt; there was an SP2 until I reported this problem because the Software Manager doesn't properly identify the update (so I thought I already had "Standalone Build" installed).  Anyway, I'm going to leave the original post up (below) in case any readers have the same problem.&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;---------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;I thought I'd post information about another bug I found in InstallShield 2009 merge module projects that I found while comparing output from a merge module project built using the standalone builds for IS 12 and IS 2009.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;Records entered into the ProgId or Registry tables in the merge module source project do not get created in the output merge module file (.msm).&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Acresso support has duplicated this behavior and I am currently working with them to find a work around (my incident number is SIOA-000143195).&lt;br /&gt;&lt;br /&gt;This can be a serious issue if you are not using [or &lt;em&gt;cannot use&lt;/em&gt;] the "COM Extract At Build" option to populate the appropriate MSI tables with COM interfaces when the module contains COM binaries. An example of this (that I'm stuck with at the moment) is if the install contains 64-bit COM binaries but is actually built on an x86 machine. In this case, the "COM Extract At Build" option doesn't work so we use the "REG File To Merge At Build" option to add the required interfaces directly to the MSI Registry table.&lt;br /&gt;&lt;br /&gt;I &lt;em&gt;suspect&lt;/em&gt; (but have not confirmed) that this may also occur for any records added to the Class or TypeLib tables in a merge module source project file. There may also be others.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-5437632789561237941?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/q0OOwk4rsVQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/5437632789561237941/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=5437632789561237941" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/5437632789561237941" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/5437632789561237941" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/q0OOwk4rsVQ/records-being-dropped-from-merge-module.html" title="Records Being Dropped From Merge Module Projects When Built Using the InstallShield 2009 Standalone Build" /><author><name>Colby</name><uri>http://www.blogger.com/profile/08696301684260588101</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09104302108733971174" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/03/records-being-dropped-from-merge-module.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-7602378089142224973</id><published>2009-02-19T06:27:00.004-06:00</published><updated>2009-02-19T06:55:38.813-06:00</updated><title type="text">MSI Tip: How to Reuse a CustomAction for Deferred and Rollback</title><content type="html">&lt;a href="http://neilsleightholm.blogspot.com/"&gt;Neil Sleightholm&lt;/a&gt; recently asked how to tell if your in a rollback custom action using C#/DTF.  The answer is simple.&lt;br /&gt;&lt;br /&gt;Let's suppose we want to export one custom action method and make it multipurposed.  In other words, if we call into while deferred execution we should do one thing but if we call into it for rollback execution we should do another.   &lt;br /&gt;&lt;br /&gt;How would we do that? The answer is in the BOOL MsiGetMode( __in  MSIHANDLE hInstall, __in  MSIRUNMODE iRunMode) Windows Installer function exposed by the Session.GetMode( InstallRunMode installRunMode ) DTF method.&lt;br /&gt;&lt;br /&gt;Consider the following WiX Code: &lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;style type="text/css"&gt; .csharpcode, .csharpcode pre {  font-size: small;  color: black;  font-family: Consolas, "Courier New", Courier, Monospace;  background-color: #ffffff;  /*white-space: pre;*/ }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt { background-color: #f4f4f4;  width: 100%;  margin: 0em; }  .csharpcode .lnum { color: #606060; } &lt;/style&gt; &lt;div class="csharpcode"&gt; &lt;pre class="alt"&gt;    &amp;lt;Binary Id=&lt;span class="str"&gt;"CustomActionModeTest"&lt;/span&gt;&lt;/pre&gt; &lt;pre&gt;            SourceFile=&lt;span class="str"&gt;"PATH_TO_DLL.CA.dll "&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;    &amp;lt;/Binary&amp;gt;&lt;/pre&gt; &lt;pre&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre class="alt"&gt;    &amp;lt;CustomAction Id=&lt;span class="str"&gt;"RollbackCA"&lt;/span&gt;&lt;/pre&gt; &lt;pre&gt;                  BinaryKey=&lt;span class="str"&gt;"CustomActionModeTest"&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;                  DllEntry=&lt;span class="str"&gt;"CustomAction1"&lt;/span&gt;&lt;/pre&gt; &lt;pre&gt;                  Execute=&lt;span class="str"&gt;"rollback"&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;                  Impersonate=&lt;span class="str"&gt;"yes"&lt;/span&gt;&amp;gt;&lt;/pre&gt; &lt;pre&gt;    &amp;lt;/CustomAction&amp;gt;&lt;/pre&gt; &lt;pre class="alt"&gt;    &amp;lt;CustomAction Id=&lt;span class="str"&gt;"DeferredCA"&lt;/span&gt;&lt;/pre&gt; &lt;pre&gt;                  BinaryKey=&lt;span class="str"&gt;"CustomActionModeTest"&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;                  DllEntry=&lt;span class="str"&gt;"CustomAction1"&lt;/span&gt;&lt;/pre&gt; &lt;pre&gt;                  Execute=&lt;span class="str"&gt;"deferred"&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;                  Impersonate=&lt;span class="str"&gt;"yes"&lt;/span&gt;&amp;gt;&lt;/pre&gt; &lt;pre&gt;    &amp;lt;/CustomAction&amp;gt;&lt;/pre&gt; &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre&gt;    &amp;lt;InstallExecuteSequence&amp;gt;&lt;/pre&gt; &lt;pre class="alt"&gt;      &amp;lt;Custom Action=&lt;span class="str"&gt;"RollbackCA"&lt;/span&gt; &lt;/pre&gt; &lt;pre&gt;              After=&lt;span class="str"&gt;"InstallInitialize"&lt;/span&gt;&amp;gt;&lt;/pre&gt; &lt;pre class="alt"&gt;      &amp;lt;/Custom&amp;gt;&lt;/pre&gt; &lt;pre&gt;      &amp;lt;Custom Action=&lt;span class="str"&gt;"DeferredCA"&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;              After=&lt;span class="str"&gt;"RollbackCA"&lt;/span&gt;&amp;gt;&lt;/pre&gt; &lt;pre&gt;      &amp;lt;/Custom&amp;gt;&lt;/pre&gt; &lt;pre class="alt"&gt;    &amp;lt;/InstallExecuteSequence&amp;gt;&lt;/pre&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You'll notice we have 2 custom actions pointing to the same exported function in the binary table.   Also notice that one custom action is scheduled as deferred and the other rollback.    The deferred is scheduled right after the rollback. This results in Windows Installer scheduling RollbackCA after InstallInitialize and DeferredCA after RollbackCA.&lt;br /&gt;&lt;br /&gt;Now let's look at the code inside of that Custom Action.&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;style type="text/css"&gt; .csharpcode, .csharpcode pre {  font-size: small;  color: black;  font-family: Consolas, "Courier New", Courier, Monospace;  background-color: #ffffff;  /*white-space: pre;*/ }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt { background-color: #f4f4f4;  width: 100%;  margin: 0em; }  .csharpcode .lnum { color: #606060; } &lt;/style&gt; &lt;div class="csharpcode"&gt; &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt; &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;/pre&gt; &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Deployment.WindowsInstaller;&lt;/pre&gt; &lt;pre&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; CustomActionModeTest&lt;/pre&gt; &lt;pre&gt;{&lt;/pre&gt; &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CustomActions&lt;/pre&gt; &lt;pre&gt;    {&lt;/pre&gt; &lt;pre class="alt"&gt;        [CustomAction]&lt;/pre&gt; &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; ActionResult CustomAction1(Session session)&lt;/pre&gt; &lt;pre class="alt"&gt;        {&lt;/pre&gt; &lt;pre&gt;            ActionResult result = ActionResult.Success;&lt;/pre&gt; &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (session.GetMode(InstallRunMode.Scheduled))&lt;/pre&gt; &lt;pre class="alt"&gt;            {&lt;/pre&gt; &lt;pre&gt;                MessageBox.Show(&lt;span class="str"&gt;"I'm not in rollback, let's cause one to occur!"&lt;/span&gt;);&lt;/pre&gt; &lt;pre class="alt"&gt;                result = ActionResult.Failure;&lt;/pre&gt; &lt;pre&gt;            }&lt;/pre&gt; &lt;pre class="alt"&gt;            &lt;/pre&gt; &lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (session.GetMode(InstallRunMode.Rollback))&lt;/pre&gt; &lt;pre class="alt"&gt;            {&lt;/pre&gt; &lt;pre&gt;                MessageBox.Show(&lt;span class="str"&gt;"We are now in a rollback."&lt;/span&gt; );&lt;/pre&gt; &lt;pre class="alt"&gt;            }&lt;/pre&gt; &lt;pre&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre class="alt"&gt;            &lt;/pre&gt; &lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; result;&lt;/pre&gt; &lt;pre class="alt"&gt;        }&lt;/pre&gt; &lt;pre&gt;    }&lt;/pre&gt; &lt;pre class="alt"&gt;}&lt;/pre&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;At runtime, RollbackCA is skipped and DeferredCA is executed.  The CustomAction1 method will be executed by the DeferredCA and it will detect that it's scheduled in deferred mode and display a message saying that it's not in rollback and that it'll cause one.   It does so by returning a failure to Windows Installer.   Now MSI starts walking the script backwards executing any rollback CA it finds.  This causes it to run RollbackCA and once again we are inside of the CustomAction1 method.&lt;br /&gt;&lt;br /&gt;This time we will evaluate that we are in rollback, display a message stating so and quit gracefully.    At this point the product is not installed.&lt;br /&gt;&lt;br /&gt;This pattern can be extended so that CustomAction1 also handles immediate execution, implicit scheduling of the deferred custom actions and CustomActionData serialization/deserialization.   But I'll leave that for another blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-7602378089142224973?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/ZuJTgx7XORE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/7602378089142224973/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=7602378089142224973" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/7602378089142224973" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/7602378089142224973" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/ZuJTgx7XORE/msi-tip-how-to-reuse-customaction-for.html" title="MSI Tip: How to Reuse a CustomAction for Deferred and Rollback" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/02/msi-tip-how-to-reuse-customaction-for.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-2447250426099737829</id><published>2009-02-15T15:16:00.008-06:00</published><updated>2009-02-16T08:29:22.230-06:00</updated><title type="text">MSI Tip: Authoring an ICE using C# / DTF</title><content type="html">I once wrote an article for InstallShield entitled "MSI Tip: Authoring a Custom ICE using InstallShield 2008". The article can be found &lt;a href="http://www.acresso.com/webdocuments/PDF/msi_ice.pdf"&gt;here&lt;/a&gt;. [Warning: PDF]&lt;br /&gt;In the article, I demonstrated how to write a unit test that could find evil script custom actions.  While there is value and humor in doing so, the real point of the article was to demonstrate how InstallShield's refactored InstallScript language could be used to write ICEs.&lt;br /&gt;&lt;br /&gt;While InstallScript is certainly an improvement over C++ in terms of cutting down on the line noise and complexity, the difference between C++/InstallScript and C# is nothing short of amazing.  As such, I've created a sample project demonstrating how to author ICE's using C#/DTF and Stefan Krueger of InstallSite.org is kind enough to host it for me &lt;a href="http://www.installsite.org/pages/en/msi/tips.htm#DTF_ICE"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Consider the following snippet from an MSDN &lt;a href="http://msdn.microsoft.com/en-us/library/aa371379(VS.85).aspx"&gt;sample&lt;/a&gt; demonstrating how to write an ICE in C++:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;style type="text/css"&gt; .csharpcode, .csharpcode pre {  font-size: small;  color: black;  font-family: Consolas, "Courier New", Courier, Monospace;  background-color: #ffffff;  /*white-space: pre;*/ }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt { background-color: #f4f4f4;  width: 100%;  margin: 0em; }  .csharpcode .lnum { color: #606060; } &lt;/style&gt; &lt;div class="csharpcode"&gt; &lt;pre class="alt"&gt;#include &amp;lt;windows.h&amp;gt;&lt;/pre&gt; &lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/pre&gt; &lt;pre class="alt"&gt;#include &amp;lt;tchar.h&amp;gt;&lt;/pre&gt; &lt;pre&gt;#include &amp;lt;strsafe.h&amp;gt;&lt;/pre&gt; &lt;pre class="alt"&gt;#include &amp;lt;MsiQuery.h&amp;gt;&lt;/pre&gt; &lt;pre&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre class="alt"&gt;&lt;span class="rem"&gt;///////////////////////////////////////////////////////////&lt;/span&gt;&lt;/pre&gt; &lt;pre&gt;&lt;span class="rem"&gt;// ICE01 - simple ICE that does not test anything&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;UINT __stdcall ICE01(MSIHANDLE hInstall)&lt;/pre&gt; &lt;pre&gt;{&lt;/pre&gt; &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// setup the record to describe owner and date created&lt;/span&gt;&lt;/pre&gt; &lt;pre&gt;PMSIHANDLE hRecCreated = ::MsiCreateRecord(1);&lt;/pre&gt; &lt;pre class="alt"&gt;::MsiRecordSetString(hRecCreated, 0, TEXT(&lt;span class="str"&gt;"ICE01\t3\tCreated 04/29/1998 by &amp;lt;insert author's name here&amp;gt;"&lt;/span&gt;));&lt;/pre&gt; &lt;pre&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// post the owner message&lt;/span&gt;&lt;/pre&gt; &lt;pre&gt;::MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_USER), hRecCreated); &lt;/pre&gt; &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// setup the record to describe the last time the ICE was modified&lt;/span&gt;&lt;/pre&gt; &lt;pre&gt;::MsiRecordSetString(hRecCreated, 0, TEXT(&lt;span class="str"&gt;"ICE01\t3\tLast modified 05/06/1998 by &amp;lt;insert author's name here&amp;gt;"&lt;/span&gt;));&lt;/pre&gt; &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre&gt;&lt;span class="rem"&gt;// post the last modification message&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;::MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_USER), hRecCreated);&lt;/pre&gt; &lt;pre&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// setup the record to describe what the ICE evaluates&lt;/span&gt;&lt;/pre&gt; &lt;pre&gt;::MsiRecordSetString(hRecCreated, 0, TEXT(&lt;span class="str"&gt;"ICE01\t3\tSimple ICE illustrating the ICE concept"&lt;/span&gt;));&lt;/pre&gt; &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre&gt;&lt;span class="rem"&gt;// post the description of evaluation message&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;::MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_USER), hRecCreated);&lt;/pre&gt; &lt;pre&gt;&lt;span class="rem"&gt;// time value to be sent on&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;TCHAR szValue[200];&lt;/pre&gt; &lt;pre&gt;DWORD cchValue = &lt;span class="kwrd"&gt;sizeof&lt;/span&gt;(szValue)/&lt;span class="kwrd"&gt;sizeof&lt;/span&gt;(TCHAR);&lt;/pre&gt; &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre&gt;&lt;span class="rem"&gt;// try to get the time of this call&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (MsiGetProperty(hInstall, TEXT(&lt;span class="str"&gt;"Time"&lt;/span&gt;), szValue, &amp;amp;cchValue) != ERROR_SUCCESS)&lt;/pre&gt; &lt;pre&gt;StringCchCopy(szValue,  &lt;span class="kwrd"&gt;sizeof&lt;/span&gt;(&lt;span class="str"&gt;"(none)"&lt;/span&gt;)/&lt;span class="kwrd"&gt;sizeof&lt;/span&gt;(TCHAR)+1, TEXT(&lt;span class="str"&gt;"none"&lt;/span&gt;));&lt;span class="rem"&gt;// no time available&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre&gt;&lt;span class="rem"&gt;// setup the record to be sent as a message&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;PMSIHANDLE hRecTime = ::MsiCreateRecord(2);&lt;/pre&gt; &lt;pre&gt;::MsiRecordSetString(hRecTime, 0, TEXT(&lt;span class="str"&gt;"ICE01\t3\tCalled at [1]."&lt;/span&gt;));&lt;/pre&gt; &lt;pre class="alt"&gt;::MsiRecordSetString(hRecTime, 1, szValue);&lt;/pre&gt; &lt;pre&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// send the time&lt;/span&gt;&lt;/pre&gt; &lt;pre&gt;::MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_USER), hRecTime);&lt;/pre&gt; &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; ERROR_SUCCESS; &lt;span class="rem"&gt;// allows other ICEs will continue&lt;/span&gt;&lt;/pre&gt; &lt;pre class="alt"&gt;}&lt;/pre&gt; &lt;/div&gt;&lt;br /&gt;With DTF and a little OOP ( Object Oriented Programming ) this can be reduced to the following snippet in C# / DTF:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;style type="text/css"&gt; .csharpcode, .csharpcode pre {  font-size: small;  color: black;  font-family: Consolas, "Courier New", Courier, Monospace;  background-color: #ffffff;  /*white-space: pre;*/ }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt { background-color: #f4f4f4;  width: 100%;  margin: 0em; }  .csharpcode .lnum { color: #606060; } &lt;/style&gt; &lt;div class="csharpcode"&gt; &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; DE.TestFramework;&lt;/pre&gt; &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Deployment.WindowsInstaller;&lt;/pre&gt; &lt;pre class="alt"&gt; &lt;/pre&gt; &lt;pre&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; DE.Tests&lt;/pre&gt; &lt;pre class="alt"&gt;{&lt;/pre&gt; &lt;pre&gt;    &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ICE01 : TestBase&lt;/pre&gt; &lt;pre class="alt"&gt;    {&lt;/pre&gt; &lt;pre&gt;        [ICETest]&lt;/pre&gt; &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TestExample()&lt;/pre&gt; &lt;pre&gt;        {&lt;/pre&gt; &lt;pre class="alt"&gt;            Publish( ICELevel.Information, &lt;span class="str"&gt;"Created 04/29/1998 by &amp;lt;insert author's name here&amp;gt;"&lt;/span&gt;);&lt;/pre&gt; &lt;pre&gt;            Publish( ICELevel.Information, &lt;span class="str"&gt;"Last modified 05/06/1998 by &amp;lt;insert author's name here&amp;gt;"&lt;/span&gt;);&lt;/pre&gt; &lt;pre class="alt"&gt;            Publish( ICELevel.Information, &lt;span class="str"&gt;"Simple ICE illustrating the ICE concept"&lt;/span&gt;);&lt;/pre&gt; &lt;pre&gt;            Publish( ICELevel.Information, &lt;span class="str"&gt;"Called at "&lt;/span&gt; + Session[&lt;span class="str"&gt;"Time"&lt;/span&gt;] );&lt;/pre&gt; &lt;pre class="alt"&gt;        }&lt;/pre&gt; &lt;pre&gt;    }&lt;/pre&gt; &lt;pre class="alt"&gt;}&lt;/pre&gt; &lt;pre&gt;&amp;nbsp;&lt;/pre&gt; &lt;/div&gt;That may not seem like a big deal but consider the flexibity a few overloads can provide:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;style type="text/css"&gt; .csharpcode, .csharpcode pre {  font-size: small;  color: black;  font-family: Consolas, "Courier New", Courier, Monospace;  background-color: #ffffff;  /*white-space: pre;*/ }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt { background-color: #f4f4f4;  width: 100%;  margin: 0em; }  .csharpcode .lnum { color: #606060; } &lt;/style&gt; &lt;div class="csharpcode"&gt; &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Publish(ICELevel iceLevel, &lt;span class="kwrd"&gt;string&lt;/span&gt; Description)&lt;/pre&gt; &lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Publish(ICELevel iceLevel, &lt;span class="kwrd"&gt;string&lt;/span&gt; Description, &lt;span class="kwrd"&gt;string&lt;/span&gt; HelpLocation )&lt;/pre&gt; &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Publish(ICELevel iceLevel, &lt;span class="kwrd"&gt;string&lt;/span&gt; Description, &lt;span class="kwrd"&gt;string&lt;/span&gt; HelpLocation, &lt;span class="kwrd"&gt;string&lt;/span&gt; Table, &lt;span class="kwrd"&gt;string&lt;/span&gt; Column, &lt;span class="kwrd"&gt;string&lt;/span&gt; PrimaryKey)&lt;/pre&gt; &lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Publish(ICELevel iceLevel, &lt;span class="kwrd"&gt;string&lt;/span&gt; Description, &lt;span class="kwrd"&gt;string&lt;/span&gt; HelpLocation, &lt;span class="kwrd"&gt;string&lt;/span&gt; Table, &lt;span class="kwrd"&gt;string&lt;/span&gt; Column, &lt;span class="kwrd"&gt;string&lt;/span&gt;[] PrimaryKeys)&lt;/pre&gt; &lt;/div&gt;&lt;br /&gt;Of course the real power comes from DTF's awesome interop classes.  Going back to example the of detecting script custom actions in InstallScript, here is what it would look like in C# / DTF:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;style type="text/css"&gt; .csharpcode, .csharpcode pre {  font-size: small;  color: black;  font-family: Consolas, "Courier New", Courier, Monospace;  background-color: #ffffff;  /*white-space: pre;*/ }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt { background-color: #f4f4f4;  width: 100%;  margin: 0em; }  .csharpcode .lnum { color: #606060; } &lt;/style&gt; &lt;div class="csharpcode"&gt; &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; DE.TestFramework;&lt;/pre&gt; &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Deployment.WindowsInstaller;&lt;/pre&gt; &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt; &lt;pre&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; DE.Tests&lt;/pre&gt; &lt;pre&gt;{&lt;/pre&gt; &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ICE_DE_10&lt;/pre&gt; &lt;pre&gt;    {&lt;/pre&gt; &lt;pre class="alt"&gt;        [ICETest]&lt;/pre&gt; &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TestForScriptCustomActionsAreEvil()&lt;/pre&gt; &lt;pre class="alt"&gt;        {&lt;/pre&gt; &lt;pre&gt;            Publish(ICELevel.Information, &lt;span class="str"&gt;"Searching for Evil Script Custom Actions..."&lt;/span&gt;);&lt;/pre&gt; &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (View view = Session.Database.OpenView(&lt;span class="str"&gt;"SELECT `CustomAction`.`Action`, `CustomAction`.`Type` FROM `CustomAction`"&lt;/span&gt;))&lt;/pre&gt; &lt;pre class="alt"&gt;            {&lt;/pre&gt; &lt;pre&gt;                view.Execute();&lt;/pre&gt; &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var record &lt;span class="kwrd"&gt;in&lt;/span&gt; view)&lt;/pre&gt; &lt;pre&gt;                {&lt;/pre&gt; &lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;string&lt;/span&gt; customActionName = record.GetString(&lt;span class="str"&gt;"Action"&lt;/span&gt;);&lt;/pre&gt; &lt;pre&gt;                    &lt;span class="kwrd"&gt;int&lt;/span&gt; type = record.GetInteger(&lt;span class="str"&gt;"Type"&lt;/span&gt;) &amp;amp; 0x00000007;&lt;/pre&gt; &lt;pre class="alt"&gt;                    CustomActionTypes customActionType = (CustomActionTypes)type;&lt;/pre&gt; &lt;pre&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt; &lt;pre&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (customActionType.Equals(CustomActionTypes.VBScript) || customActionType.Equals(CustomActionTypes.JScript))&lt;/pre&gt; &lt;pre class="alt"&gt;                    {&lt;/pre&gt; &lt;pre&gt;                        Publish(ICELevel.Error, &lt;/pre&gt; &lt;pre class="alt"&gt;                            &lt;span class="str"&gt;"Found Evil "&lt;/span&gt; + customActionType.ToString() + &lt;span class="str"&gt;" Custom Action "&lt;/span&gt; + customActionName,&lt;/pre&gt; &lt;pre&gt;                            &lt;span class="str"&gt;"http://blogs.msdn.com/robmen/archive/2004/05/20/136530.aspx"&lt;/span&gt;,&lt;/pre&gt; &lt;pre class="alt"&gt;                            &lt;span class="str"&gt;"CustomAction"&lt;/span&gt;,&lt;/pre&gt; &lt;pre&gt;                            &lt;span class="str"&gt;"Action"&lt;/span&gt;,&lt;/pre&gt; &lt;pre class="alt"&gt;                            customActionName ); &lt;/pre&gt; &lt;pre&gt;                    }&lt;/pre&gt; &lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt; &lt;pre&gt;                    {&lt;/pre&gt; &lt;pre class="alt"&gt;                        Publish(ICELevel.Information, &lt;span class="str"&gt;"Found Nice Custom Action: "&lt;/span&gt; + customActionName + &lt;span class="str"&gt;" Type: "&lt;/span&gt; + customActionType.ToString());&lt;/pre&gt; &lt;pre&gt;                    }&lt;/pre&gt; &lt;pre class="alt"&gt;                }&lt;/pre&gt; &lt;pre&gt;            }&lt;/pre&gt; &lt;pre class="alt"&gt;        }&lt;/pre&gt; &lt;pre&gt;    }&lt;/pre&gt; &lt;pre class="alt"&gt;}&lt;/pre&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-2447250426099737829?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/peGVkicDdqI" height="1" width="1"/&gt;</content><link rel="related" href="http://www.installsite.org/pages/en/msi/tips.htm#DTF_ICE" title="MSI Tip: Authoring an ICE using C# / DTF" /><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/2447250426099737829/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=2447250426099737829" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/2447250426099737829" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/2447250426099737829" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/peGVkicDdqI/msi-tip-authoring-ice-using-c-dtf.html" title="MSI Tip: Authoring an ICE using C# / DTF" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/02/msi-tip-authoring-ice-using-c-dtf.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-1531232275413065396</id><published>2009-01-22T11:02:00.002-06:00</published><updated>2009-01-22T11:22:13.569-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MSI" /><category scheme="http://www.blogger.com/atom/ns#" term="acresso" /><category scheme="http://www.blogger.com/atom/ns#" term="installshield" /><category scheme="http://www.blogger.com/atom/ns#" term="bug" /><category scheme="http://www.blogger.com/atom/ns#" term="IS2009" /><category scheme="http://www.blogger.com/atom/ns#" term="CAB" /><title type="text">IS 2009 Bug - Patch Optimization &amp; Custom CAB Names Mutually Exclusive</title><content type="html">I realize this is a very unique scenario, but I thought I would post it in case you find yourself in this scenario.  The bug only applies if you use InstallShield 2009 to build a ‘Basic MSI’ installation and you use ALL of the build options specified below:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You specify custom CAB names (by editing the ISFeatureCabName column of the custom InstallShield Feature table).&lt;/li&gt;&lt;li&gt;You specify the “One .cab per Feature” option on the Custom Compression Settings dialog of the Release Wizard.&lt;/li&gt;&lt;li&gt;You sync file IDs with a previous build using the “Previous package” option on the Advanced Settings dialog of the Release Wizard.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you do build under the scenario described above, then you should be aware that the options appear to be mutually exclusive and the custom CAB names you specified will NOT be generated correctly by InstallShield at build time.&lt;br /&gt;&lt;br /&gt;Below is a description of the problem I reported to Acresso support yesterday (incident #SIOA-000140045):&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;I have a serious problem with the IsCmdBld.exe in InstallShield 2009 Premier that I need a fix for ASAP.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;We are in the process of upgrading our build environment to use IS 2009 to build our primary application installation and are seeing different behavior during the build between the IsSABld.exe we used with previous versions of IS (both IS 12 Premier and IS 2008 Premier) and the behavior seen using IsCmdBld.exe in IS 2009 Premier.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;Our primary application installation is a very complex and large MSI installation. Since we must control the names of the CAB files we generate at build time, we use the InstallShield Direct Editor to modify the Feature table in the InstallShield source project and specify a different CAB name for each defined feature (using the ISFeatureCabName field). Using the Release Wizard, we also set the Release Configuration to 'Custom' and select the "One .cab per Feature" option ("Custom Compression Settings" dialog of the Release Wizard). In addition, we specify the fully qualified path and name of a previous MSI package build (by setting the "Previous package" option on the "Advanced Settings" dialog of the Release Wizard. The only other configuration information that may be relevant to this issue is the fact that we have multiple merge modules in the project and each defined feature has one or more merge modules associated with it (no merge module is associated with more than one feature).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;When we build the installation (with NO CHANGES other than upgrading the project to IS 2009 schema format) using the IsCmdBld.exe command line utility from IS 2009 the CAB files are not generated correctly. In other words, the files associated with feature A are not being placed into the CAB file specified in the ISFeatureCabName for feature A. However, if I remove the option to point the build to a previous package and then build the project then the CAB files are generated correctly (the files associated with feature A are being correctly placed into the CAB file specified in the ISFeatureCabName for feature A.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;In other words, the options to specify the CAB file name for each feature (ISFeatureCabName column of the Feature table) and the Release Wizard option for Patch optimization ("Previous package" option) ARE MUTUALLY EXCLUSIVE IN IS 2009.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;I have confirmed this behavior by building under the different scenarios described below:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Build A: IS 12 project file, one .cab per feature enabled, custom CAB names specified in Feature table, previous package path specified, and IsSABld.exe used to build the project.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Build B: IS 12 project file, one .cab per feature enabled, custom CAB names specified in Feature table, previous package path NOT specified, and IsSABld.exe used to build the project.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Build C: IS 2008 project file, one .cab per feature enabled, custom CAB names specified in Feature table, previous package path specified, and IsSABld.exe used to build the project.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Build D: IS 2008 project file, one .cab per feature enabled, custom CAB names specified in Feature table, previous package path NOT specified, and IsSABld.exe used to build the project.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Build E: IS 2009 project file, one .cab per feature enabled, custom CAB names specified in Feature table, previous package path specified, and IsCmdBld.exe used to build the project.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Build F: IS 2009 project file, one .cab per feature enabled, custom CAB names specified in Feature table, previous package path NOT specified, and IsCmdBld.exe used to build the project.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;In all scenarios specified above EXCEPT "Build E", the CAB files are correctly generated during the build. In other words, in each of the scenarios EXCEPT "Build E", the files associated with feature A are correctly placed into the CAB file whose name is specified in the ISFeatureCabName column of the Feature table.It is absolutely critical that this be fixed or we cannot use IS 2009 without completely redesigning our MSI installation packaging.&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/9537945-1531232275413065396?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/uutTLVcRrfE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/1531232275413065396/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=1531232275413065396" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/1531232275413065396" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/1531232275413065396" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/uutTLVcRrfE/is-2009-bug-patch-optimization-custom.html" title="IS 2009 Bug - Patch Optimization &amp; Custom CAB Names Mutually Exclusive" /><author><name>Colby</name><uri>http://www.blogger.com/profile/08696301684260588101</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="09104302108733971174" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/01/is-2009-bug-patch-optimization-custom.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-762680330215032149</id><published>2009-01-16T06:30:00.003-06:00</published><updated>2009-01-16T12:24:50.720-06:00</updated><title type="text">Please, Just One More Miracle</title><content type="html">I know it's been awhile since I posted an update. I've been incredibly swamped by life and my new work. I sit here this morning reading about United 1549 which went down in the Hudson river. Miraculously, no one perished. &lt;br /&gt;&lt;br /&gt;I mention this because I'm praying for one more miracle. Cheryl had her quarterly CT scan on Monday and in a couple of hours we'll visit her oncologist to see if she remains no evidence of disease.&lt;br /&gt;&lt;br /&gt;[Update]&lt;br /&gt;&lt;br /&gt;The CT Scan looks perfect!  Thank You God!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-762680330215032149?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/rrvz4A6JX3A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/762680330215032149/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=762680330215032149" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/762680330215032149" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/762680330215032149" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/rrvz4A6JX3A/please-just-one-more-miracle.html" title="Please, Just One More Miracle" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2009/01/please-just-one-more-miracle.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-7485025998246507300</id><published>2008-12-30T00:31:00.005-06:00</published><updated>2008-12-30T01:16:52.792-06:00</updated><title type="text">Windows Installer 10 Year Anniversary</title><content type="html">I'm sorry that I haven't posted in awhile. Frankly I'm starting to wonder if there is actually anything new to ever talk about in the MSI world. After all, it's an aging platform SDK that has changed very little over the last 10 years. ( For example, here's a &lt;a href="http://groups.google.com/group/installshield.wishlist/browse_thread/thread/ca1f74e6425c76f1?hl=en&amp;q=windows+installer+author:heath+author:stewart"&gt;thread&lt;/a&gt; between Stefan Krueger (InstallSite had long been around) and Heath Stewart in what seems to be his pre-Microsoft days.)   &lt;br /&gt;&lt;br /&gt;(Interesting aside:  In the above thread, Heath says he's had "Great Success" with InstallShield.  Later in September 2000 you'll find threads where's promoting Wise and bashing InstallShield saying that it "sucks".  Hmmm... anyways, I remember trying the InstallShield for Windows Installer back in the summer of 1999 and thinking both ISWI and MSI in general sucked.  I would continue to use InstallShield 5 for the next 4 years! )&lt;br /&gt;&lt;br /&gt;Back to my original thought: Some day soon will mark the official 10 year anniversary of Windows Installer. The problem is, I'm not sure what date exactly. I suppose it'll be Jan 27, 2009 since Wikipedia says this is the ship date of Office 2000. I was searching the usenet archives and I came across the &lt;a href="http://groups.google.com/group/microsoft.public.msdn.general/browse_thread/thread/31fcbbca7c583113?hl=en&amp;ie=UTF-8&amp;q=windows+installer"&gt;very first thread&lt;/a&gt; to ever refer to windows installer on this date 10 years ago. I think you'll find it a fitting:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;From: "Tom Savage" &lt;tsav...@s-a.com&gt;&lt;br /&gt;Subject: Office 2000 install error 1601!&lt;br /&gt;Date: 1998/12/30&lt;br /&gt;Message-ID: &lt;e64cYa#M#GA.113@uppssnewspub05.moswest.msn.net&gt;#1/1&lt;br /&gt;X-Deja-AN: 427080025&lt;br /&gt;X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3&lt;br /&gt;Newsgroups: microsoft.public.msdn.general&lt;br /&gt;&lt;br /&gt;Can't install the msdn version of Office 2000 on two test machines. Install&lt;br /&gt;updated the Windows installer and asked me to reboot. Now it stops almost&lt;br /&gt;immediately with an "install error 1601".&lt;br /&gt;Could it be related to my previous installation of Frontpage 2000 B1&lt;br /&gt;(removed it before the current install, but uninstall mentioned a registry&lt;br /&gt;write error)? I removed all Frontpage references I could find from the&lt;br /&gt;registry, and it didn't help.&lt;br /&gt;Would really appreciate any help you could give me on this one. I had grown&lt;br /&gt;very comfortable with Frontpage2000 despite its quirks.&lt;br /&gt;thanks,&lt;br /&gt;ts&lt;br /&gt;&lt;br /&gt;From: "Steven Toney" &lt;ton...@ibm.net&gt;&lt;br /&gt;Subject: Re: Office 2000 install error 1601!&lt;br /&gt;Date: 1998/12/30&lt;br /&gt;Message-ID: &lt;#soTrZEN#GA.255@uppssnewspub04.moswest.msn.net&gt;#1/1&lt;br /&gt;X-Deja-AN: 427260501&lt;br /&gt;References: &lt;e64cYa#M#GA.113@uppssnewspub05.moswest.msn.net&gt;&lt;br /&gt;X-Priority: 3&lt;br /&gt;X-MimeOLE: Produced By Microsoft MimeOLE V5.00.0810.800&lt;br /&gt;X-MSMail-Priority: Normal&lt;br /&gt;Newsgroups: microsoft.public.msdn.general&lt;br /&gt;&lt;br /&gt;I think the new windows installer sucks!!&lt;br /&gt;&lt;br /&gt;much to busy ,, difficult to tell plainly what is being installed and what&lt;br /&gt;is not&lt;br /&gt;&lt;br /&gt;install programs should be simple with clear choices and feedback on what&lt;br /&gt;will be installed or removed.&lt;br /&gt;&lt;br /&gt;this new program is none of these&lt;br /&gt;&lt;br /&gt;steve&lt;br /&gt;&lt;br /&gt;From: "Tom Savage" &lt;tsav...@s-a.com&gt;&lt;br /&gt;Subject: Re: Office 2000 install error 1601!&lt;br /&gt;Date: 1998/12/31&lt;br /&gt;Message-ID: &lt;OAKSDKMN#GA.186@uppssnewspub05.moswest.msn.net&gt;#1/1&lt;br /&gt;X-Deja-AN: 427449318&lt;br /&gt;References: &lt;e64cYa#M#GA.113@uppssnewspub05.moswest.msn.net&gt;&lt;br /&gt;X-Priority: 3&lt;br /&gt;X-MimeOLE: Produced By Microsoft MimeOLE V5.00.0810.800&lt;br /&gt;X-MSMail-Priority: Normal&lt;br /&gt;Reply-To: "Tom Savage" &lt;tsav...@s-a.com&gt;&lt;br /&gt;Newsgroups: microsoft.public.msdn.general&lt;br /&gt;&lt;br /&gt;_Lucky for me_ I found that c:\winnt\system32\msi.dll had not&lt;br /&gt;self-registered during my repeated installations and uninstallations. I&lt;br /&gt;registered it and the installation worked fine.&lt;br /&gt;Well... almost fine. Now I have to get the Office2000 server extensions SQL&lt;br /&gt;Server database to work right. "Version incompatibilities prevent&lt;br /&gt;communication with the database". I'm using a hopelessly out-of-date and&lt;br /&gt;incompatible SQL Server (v6.5 SP3)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-7485025998246507300?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/ZIedCnV7he4" height="1" width="1"/&gt;</content><link rel="related" href="http://groups.google.com/group/microsoft.public.officedev/msg/8d6f6cc0bce39eb1?hl=en&amp;dmode=source&amp;pli=1" title="Windows Installer 10 Year Anniversary" /><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/7485025998246507300/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=7485025998246507300" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/7485025998246507300" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/7485025998246507300" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/ZIedCnV7he4/windows-installer-10-year-anniversary.html" title="Windows Installer 10 Year Anniversary" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2008/12/windows-installer-10-year-anniversary.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-8563795417695732195</id><published>2008-12-13T14:23:00.002-06:00</published><updated>2008-12-13T14:33:20.303-06:00</updated><title type="text">The Day The Earth Stood Still Comments</title><content type="html">I took yesterday off from work to hang out with my wife. After sending our kids off to school, dropping by the doctors office for some blood work and eating breakfast at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Kerbey&lt;/span&gt; Lane Cafe, we decided that we could squeeze a movie in before having to pick Emma up from school.&lt;br /&gt;&lt;br /&gt;We decided to see The Day The Earth Stood still since it was starting at 11am and the previews looked good. &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;Unfortunately&lt;/span&gt; I hadn't picked up on how disappointing the movie was until we were sitting in the theater.&lt;br /&gt;&lt;br /&gt;I have several issues with the politics of the movie, and I found the following comment on the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;Internet&lt;/span&gt; that says it better then I can:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;blockquote&gt;Spoilers… (Or “Savers” if you don’t want to waste $10)&lt;br /&gt;&lt;br /&gt;The aliens arrive in the usual idiotic fashion that makes the Conquistadors arrival in the new world look like a well planned diplomatic mission. The response by the Americans is predictable and right out of the Hollywood cliche’ handbook of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;STOOPID&lt;/span&gt; Americanism. The military’s lack of common sense is matched only by the oblivious idiocy of the enlightened &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Klatu&lt;/span&gt; who only realizes that killing 6 billion people is a bad idea when he sees a child crying about his dead daddy. Than the whole movie wraps up with an unexplained sudden ending as &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Klatu&lt;/span&gt; turns off all the lights and leaves. So now what? Are we left in the dark ages forever? Is the blackout a temporary measure to teach us a lesson or can we look forward to a Mad Max style sequel where humanity splits up into tribes and starts killing each other while they all starve to death in famine in a new enlightened more green style of misery?&lt;br /&gt;&lt;br /&gt;Avoid this turd. Word of mouth should kill it off in a matter of weeks. But on the bright side the Wolverine preview looked pretty cool.&lt;br /&gt;&lt;/blockquote&gt;&lt;/em&gt;&lt;br /&gt;&lt;a href="http://www.themovieblog.com/2008/12/the-day-the-earth-stood-still-review#comment-176212"&gt;-Michael&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On the bright side, I actually had decent service at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Kerbey&lt;/span&gt; Lane Cafe for a change. :-)   Usually I have such a horrible experience.  I really don't understand what &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Austinites&lt;/span&gt; see in that &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_8"&gt;restaurant&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-8563795417695732195?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/O3SCD9SICJs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/8563795417695732195/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=8563795417695732195" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/8563795417695732195" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/8563795417695732195" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/O3SCD9SICJs/day-earth-stood-still-comments.html" title="The Day The Earth Stood Still Comments" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2008/12/day-earth-stood-still-comments.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-6194564099646898685</id><published>2008-11-18T21:02:00.002-06:00</published><updated>2008-11-26T22:14:26.569-06:00</updated><title type="text">Back with old friends</title><content type="html">From time to time my stomach tells me that it's time for a change. This recently happened again ( darn build/install guys always keep getting hit by a bus... ) and on November 17Th, 2008 I left MultiMedia Games and returned to &lt;a href="http://www.overwatch.com/"&gt;Overwatch Textron Systems, Tactical Operations&lt;/a&gt; to be with old and new friends.&lt;br /&gt;&lt;br /&gt;So after having both the TFS/BuildForge role and the InstallShield/MSI role for the last couple years, I've put my build engineering hat back in the closet and settled in to focus on the installation side of the house.&lt;br /&gt;&lt;br /&gt;Our group is growing like crazy! So, if you live in the Austin, TX area and you are an upstanding and unquestionably loyal US Citizen, then please look us up. We are &lt;a href="http://careers.overwatch.com/careers/"&gt;hiring&lt;/a&gt; all the time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-6194564099646898685?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/agcaKqFGcXo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/6194564099646898685/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=6194564099646898685" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/6194564099646898685" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/6194564099646898685" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/agcaKqFGcXo/back-with-old-friends.html" title="Back with old friends" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2008/11/back-with-old-friends.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-1831915296633126876</id><published>2008-11-03T15:21:00.004-06:00</published><updated>2008-11-03T15:24:36.487-06:00</updated><title type="text">Client Profile Configuration Designer Source Code: Where's the Beef?</title><content type="html">In a previous blog I mentioned the horrible setup experience that I had with the &lt;a href="http://www.codeplex.com/wpf/Release/ProjectReleases.aspx?ReleaseId=14962"&gt;Client Profile Configuration Designer&lt;/a&gt; setup.  I really wanted to work around the problem so I went to CodePlex and downloaded the source files.   &lt;br /&gt;&lt;br /&gt;The good news is that the build process is exactly the way I like to roll. It just worked!&lt;br /&gt;&lt;br /&gt;The bad news is I didn't see any of the source or binaries in the solution tree.&lt;br /&gt;&lt;br /&gt;As the old commercial says, Where's the beef?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-1831915296633126876?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/PFfxWx9QBnk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/1831915296633126876/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=1831915296633126876" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/1831915296633126876" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/1831915296633126876" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/PFfxWx9QBnk/client-profile-configuration-designer.html" title="Client Profile Configuration Designer Source Code: Where's the Beef?" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2008/11/client-profile-configuration-designer.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-2083956731980939689</id><published>2008-11-03T14:37:00.007-06:00</published><updated>2008-11-03T15:09:07.294-06:00</updated><title type="text">Horrible Setup Experience for Client Profile Configuration Designer</title><content type="html">I was &lt;a href="http://msmvps.com/blogs/installsite/archive/2008/11/01/pdc2008-windows-installer-and-clickonce-in-windows-7.aspx"&gt;reading a blog&lt;/a&gt; from Windows Installer Expert Stefan Krueger talking about a new setup tool from Microsoft:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;At 0:31:15 Tyler introduces the Client Profile Configuration Designer which has just been made available as beta. It's essentially a tool that can chain multiple packages such as the .NET Framework and other prerequisites, as well as ClickOnce packages, MSI based setups or even scripts. It provides a seamless and ustomizable user interface with one progress bar across all the packages, and can either defer reboots requests until the end, or handle reboots between packages gracefully. Optionally it can also create a combined uninstall experience instead of separate entries in the Add/Remove Programs control panel. The Client Profile Configuration Designer can be downloaded from &lt;/em&gt;&lt;a href="http://windowsclient.net/wpf/" target="_blank"&gt;&lt;em&gt;windowsclient.net/wpf/&lt;/em&gt;&lt;/a&gt; in the Deployment section. &lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So I downloaded the program, double clicked the EXE and the install just flashed on by. Oh great, I thought, another one of those WiX based UI-less installs that I've &lt;a href="http://blog.deploymentengineering.com/2007/04/are-dialogs-optional-now.html"&gt;complained&lt;/a&gt; about for years. This is sort of odd considering this is supposed to be a fancy WPF chainer.&lt;br /&gt;&lt;br /&gt;This left a very unfavorable taste in my mouth as I hate it when an install doesn't announce itself and ask me if it's ok to proceed.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;But the real joy was to be had when I tried to run the actual application:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Crash!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_28H3HFywulA/SQ9kDaBv5eI/AAAAAAAAALQ/bl5nzlfNDQ4/s1600-h/error.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5264536499108439522" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 210px" alt="" src="http://2.bp.blogspot.com/_28H3HFywulA/SQ9kDaBv5eI/AAAAAAAAALQ/bl5nzlfNDQ4/s400/error.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Debug!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_28H3HFywulA/SQ9kK8gT-3I/AAAAAAAAALY/5Xa0W9nHegs/s1600-h/debug.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5264536628622523250" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 234px" alt="" src="http://4.bp.blogspot.com/_28H3HFywulA/SQ9kK8gT-3I/AAAAAAAAALY/5Xa0W9nHegs/s400/debug.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I then started troubleshooting and found all sorts of interesting things. For example, despite touting itself as a WPF based chainer, the package installs itself Per-User and doesn't cache it's package source. It also *SEEMS* to be using the IExpress bootstrapper. Odd Again.&lt;br /&gt;&lt;br /&gt;I eventually got my hands on the actual MSI ( sure enough, Windows Installer XML Windows Installer XML v3.0.2921.0 ) and couldn't find any reference to the missing assembly. Hmmm, I guess it's another case of &lt;a href="http://www.codinghorror.com/blog/archives/000818.html"&gt;it worked on my machine&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;So while I'd like to give this new tool a spin, it seems Acresso's lead in this space remains completely unchallenged. After all, when is Burn going to be done, 2012?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-2083956731980939689?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/oTrw6KHC-h0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/2083956731980939689/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=2083956731980939689" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/2083956731980939689" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/2083956731980939689" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/oTrw6KHC-h0/horrible-setup-experience-for-client.html" title="Horrible Setup Experience for Client Profile Configuration Designer" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_28H3HFywulA/SQ9kDaBv5eI/AAAAAAAAALQ/bl5nzlfNDQ4/s72-c/error.PNG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2008/11/horrible-setup-experience-for-client.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-4785647968821013628</id><published>2008-10-26T14:43:00.003-05:00</published><updated>2008-10-26T15:04:11.811-05:00</updated><title type="text">Big Swinging Developer Test</title><content type="html">I recently came across these three websites that are a much read:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.buildsonmymachine.com/"&gt;http://www.buildsonmymachine.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.wheresthebuild.com/"&gt;http://www.wheresthebuild.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youbrokethebuild.com/"&gt;http://www.youbrokethebuild.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The pictures rock in the way they make humor out of the things us deployment engineers have to deal with. Then I moved onto the blog behind it all:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.bigswingingdeveloper.com/"&gt;http://blog.bigswingingdeveloper.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's a really good read so let me sign off and leave you to reading it. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-4785647968821013628?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/6uHgR8Sn8e4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/4785647968821013628/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=4785647968821013628" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/4785647968821013628" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/4785647968821013628" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/6uHgR8Sn8e4/big-swining-developer-test.html" title="Big Swinging Developer Test" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2008/10/big-swining-developer-test.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-6342898454058496053</id><published>2008-10-23T09:38:00.002-05:00</published><updated>2008-10-23T09:44:56.082-05:00</updated><title type="text">What I use WiX for Today</title><content type="html">&lt;p&gt;In a recent blog, Holger asked the question:&lt;/p&gt;&lt;blockquote&gt;&lt;em&gt;"With regard to your automation framework...what for do you make use of WiX (instead of using IS)?"&lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt;First a little humor. I'm guessing what many would really say ask is:&lt;/p&gt;&lt;blockquote&gt;&lt;em&gt;"OMG, the big trolling WiX hater actually uses WiX?  Has hell frozen over?   What do you do with WiX?"&lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt;I'm working on an SOA product line that has about 40 builds/installs... micropackages in a sense. I have an InstallShield `common installer` that has a feature tree of all of our known features and product configurations of all of our packages.   This allows me to build the different installs while attempting code reuse in the only way InstallShield can really do it.  Fragments would be helpful here.&lt;/p&gt;&lt;p&gt;All of my custom actions are written in C# using DTF.  This includes the ability to publish SQL services reports using a series of custom tables.  ( This needs to be refactored into a WiX extension pattern and possibly shared with the community. )&lt;/p&gt;&lt;p&gt;The features reference merge modules.  For some assets where the developer has told me they don't want to worry about setup, I use InstallShield merge modules. For other features where the developer wants to play a role in setup development (rare), I use WiX merge modules.&lt;/p&gt;&lt;p&gt;These products are built individually because they intend to release to QA/PROD that way when servicing.   There is also a bootstrapper in the works that will join all of these products together to allow for a variety of setup stores ( site datalayer, site application layer, central datalayer, central datalayer,  client 1, client 2 and also sql server reporting services reports ).&lt;/p&gt;&lt;p&gt;Along the lines of red, green, refactor... I'm at green right now.   Eventually when better designer tools and bootstrappers are available I'll start refactoring the remaining InstallShield components to WiX fragments.   The problem is WiX just isn't there yet IMO and it doesn't make good business sense to do it yet.&lt;/p&gt;&lt;p&gt;InstallShield might be taking away the SAB and raising prices and generally not caring about customers but I'll still get a few years out of IS2009.  One day though,  WiX will eventually be the answer.   Who knows, maybe InstallShield will find a way to stay in that world.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-6342898454058496053?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/km_kondtpYI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/6342898454058496053/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=6342898454058496053" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/6342898454058496053" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/6342898454058496053" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/km_kondtpYI/what-i-use-wix-for-today.html" title="What I use WiX for Today" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2008/10/what-i-use-wix-for-today.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-9537945.post-3900391219329752697</id><published>2008-10-22T18:40:00.003-05:00</published><updated>2008-10-22T18:52:53.858-05:00</updated><title type="text">How to build WiX</title><content type="html">Neil Sleightholm has an excellent write up on &lt;a href="http://neilsleightholm.blogspot.com/2008/10/how-to-create-wix-build-machine.html"&gt;how to create a WiX build machine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've tried to build WiX and all I could think of at the time is YUCK.&lt;br /&gt;&lt;br /&gt;Now before someone gets all rude and calls me a troll, relax guys, I'm dogging the build process not any one megalomaniac in particularly.&lt;br /&gt;&lt;br /&gt;Seriously, I do build automation day in and day out and there's an anti-pattern that I try to resist with a fury. The Magic Machine AntiPattern... it looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.testearly.com/images/magic-machine.png"&gt;&lt;img style="WIDTH: 293px; CURSOR: hand; HEIGHT: 300px" alt="" src="http://www.testearly.com/images/magic-machine.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now I know I've read Rob write tomes of opinion about eliminating dependencies and complexity from setup,  why not build automation?   That's what I do.&lt;br /&gt;&lt;br /&gt;At my day job I write build automation frameworks that are responsible for building hundreds of products.  I try to get as much re usability as possible out of them and keep the build machine as simple as possible.   Ideally**, I use nothing but    Windows Server 2003, .NET Framework 3.5SP1, TFS TeamBuild, WiX, InstallShield 2009 Stand Alone Build, MSBuild Community Tasks, AssemblyInfo task and my build automation scripts which get published to the build machines automatically whenever a check in occurs (CI).      I am able to sysprep/deploy that image out to any number of  virtual machines for scalability and rebuild that image programatically which is also stored in source control and in build automation.&lt;br /&gt;&lt;br /&gt;In other words, a very simple, scalable, repeatable environment.  Builds should be easy... I should be able to pull a tree of source, throw it to an outside party ( via code escrow for example ) and they shouldn't have to bang their head against the wall to figure out how to build it.&lt;br /&gt;&lt;br /&gt;Well eitherway, my hats off to Neil for doing this ( I haven't tested it yet ) and I'm sure some of my readers will be very interested in his HOW-TO article.&lt;br /&gt;&lt;br /&gt;**Unfortunately, Microsoft requires that certain project types have Visual Studio installed and other components such as VSTS Test Tools.  Yuck... I wish everything was msbuild based.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9537945-3900391219329752697?l=blog.deploymentengineering.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DeploymentEngineering/~4/kG-8wSuOe-8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.deploymentengineering.com/feeds/3900391219329752697/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9537945&amp;postID=3900391219329752697" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/3900391219329752697" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9537945/posts/default/3900391219329752697" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DeploymentEngineering/~3/kG-8wSuOe-8/how-to-build-wix.html" title="How to build WiX" /><author><name>Christopher Painter</name><uri>http://www.blogger.com/profile/12167478740431444267</uri><email>chrpai@yahoo.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="00703071804906658959" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.deploymentengineering.com/2008/10/how-to-build-wix.html</feedburner:origLink></entry></feed>
