<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Jason Ginchereau's Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/jasongin/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/jasongin/feed.xml</link>
    <description />
    <lastBuildDate>Tue, 16 Apr 2019 05:11:30 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Pull-down-to-refresh a WP7 ListBox or ScrollViewer</title>
      <link>https://docs.microsoft.com/archive/blogs/jasongin/pull-down-to-refresh-a-wp7-listbox-or-scrollviewer</link>
      <pubDate>Wed, 13 Apr 2011 00:52:00 GMT</pubDate>
      <dc:creator><![CDATA[Jason Ginchereau - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasongin/2011/04/13/pull-down-to-refresh-a-wp7-listbox-or-scrollviewer/</guid>
      <description><![CDATA[Update 12/19/2011: Updated the&nbsp;attached demo project to target the WP 7.1 (Mango) SDK. It still...]]></description>
      <content:encoded><![CDATA[<p><span style="color: #800000;"><strong>Update 12/19/2011: Updated the&nbsp;attached demo project to target the WP 7.1 (Mango) SDK. It still requires setting ManipulationMode=Control on the ScrollViewer.</strong></span></p>
<p>I really like the pull-down-and-release-to-refresh gesture seen in various smartphone apps. In my opinion it doesn't conflict with the Metro UI guidelines, so I don't see any reason why it shouldn't be used in a WP7 app. Here is an explanation of how it can be done in WP7 without much difficulty. If you just want the complete source code, jump to the end to download the source along with a demo project.</p>
<p>The WP7 ScrollViewer control has a built-in stretchy feel to it if you try to pull it down from the top or up from the bottom, so it is already well-suited to this kind of interaction. What we need to do is detect when and how far the ScrollViewer is pulled down from the top, when it is released from that point, and also reveal an indicator control "behind" the ScrollViewer to provide visual feedback as it is pulled down. And since a ListBox uses a ScrollViewer internally to scroll its items, the same solution will work just as well with a ListBox.</p>
<h4>Detecting a pull-down motion</h4>
<p>The <a title="ScrollViewer class - MSDN" href="http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollviewer(v=VS.95).aspx" target="_blank">ScrollViewer class</a> does not directly publish any events about its scrolling motion. So, how can we know when the ScrollViewer is being "pulled down"? With a little experimentation, I found that the ScrollViewer applies a CompositeTransform to its Content for vertical translation (and subtle compression) when the contents are dragged down from the top or up from the bottom. But for normal scrolling through the length of the list, the CompositeTransform is just equivalent to an identity transform (0 translation, 1.0 scale). This makes it very easy to know when and how far the ScrollViewer is pulled down from the top: just look for a positive Y translation on the RenderTransform of the content.</p>
<p><em><strong><span style="color: #ff0000;">Caution</span>: This technique relies on undocumented internal behavior of the ScrollViewer.</strong></em> It's possible that a future revision of the ScrollViewer could change its internal scroll rendering in a way that breaks this kind of pull-to-refresh code. I even hesitate to blog this for that reason, however in my estimation the risk is low, and can be mitigated in a couple ways: Any code depending on the current scroll rendering behavior should degrade gracefully (don't crash when something expected is not found), and the app should provide some alternate means of refreshing the scrolled contents such as a context menu etc. I have no official knowledge on this subject, and I can't even guarantee that an app that implements this gesture will pass the marketplace review process. So let me know how it works out!</p>
<p>Moving beyond the disclaimer, here's a snippet of code showing how to handle a ScrollViewer's mouse-move event to detect a pull-down gesture.</p>
<div style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 250px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;" id="codeSnippetWrapper">
<pre style="text-align: left; line-height: 10pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;" id="codeSnippet"><span style="color: #0000ff;">void</span> targetScrollViewer_MouseMove(<span style="color: #0000ff;">object</span> sender, MouseEventArgs e)<br />{<br />    UIElement scrollContent = (UIElement)<span style="color: #0000ff;">this</span>.targetScrollViewer.Content;<br />    CompositeTransform ct = scrollContent.RenderTransform <span style="color: #0000ff;">as</span> CompositeTransform;<br />    <span style="color: #0000ff;">if</span> (ct != <span style="color: #0000ff;">null</span>)<br />    {<br />        <span style="color: #0000ff;">if</span> (ct.TranslateY &gt; <span style="color: #0000ff;">this</span>.PullThreshold)<br />        {<br />            <span style="color: #008000;">// Show the ready-to-release indicator</span><br />        }<br />        <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> (ct.TranslateY &gt; 0)<br />        {<br />            <span style="color: #008000;">// Show the pull-down indicator</span><br />        }<br />        <span style="color: #0000ff;">else</span><br />        {<br />            <span style="color: #008000;">// Hide the indicators</span><br />        }<br />    }<br />}</pre>
</div>
<p>Detecting a release is very similar: handle a mouse-up event and check whether the Y translation at the time of release is greater than the minimum distance.</p>
<h4>Revealing a pull-down indicator</h4>
<p>There are a few ways to reveal another control as the ScrollViewer is pulled down. The easiest method is to layout the control directly behind the ScrollViewer, and make the ScrollViewer contents opaque so that the control is normally covered. But I wanted to allow for a transparent background on scrolled items, as is very typical. So, the solution I settled on has a control that is initially 0-height and has its height dynamically adjusted as the ScrollViewer is pulled down. To implement this, I created a PullDistance DependencyProperty that gets dynamically updated by the mouse-move event handler, and bound the Height property of the pulling-down indicator to that. For additional visual effect, I created a similar PullFraction property and bound it to the indicator's Opacity, so that the indicator fades in proportional to the pull-down.</p>
<p>The full XAML is too verbose to post inline, but here's a small snippet from the control template that shows the bindings mentioned above.</p>
<div style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; direction: ltr; max-height: 160px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;" id="codeSnippetWrapper">
<pre style="text-align: left; line-height: 10pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;" id="codeSnippet">&lt;StackPanel x:Name=<span style="color: #006080;">"PullingDownPanel"</span><br />    Height=<span style="color: #006080;">"{TemplateBinding PullDistance}"</span> Opacity=<span style="color: #006080;">"{TemplateBinding PullFraction}"</span><br />    Margin=<span style="color: #006080;">"{Binding PullDistance, RelativeSource={RelativeSource TemplatedParent},<br /> Converter={StaticResource NegativeValueConverter}, ConverterParameter=Bottom}"</span>&gt;<br />    &lt;ContentPresenter ContentTemplate=<span style="color: #006080;">"{TemplateBinding PullingDownTemplate}"</span> /&gt;<br />&lt;/StackPanel&gt;</pre>
</div>
<p>Note the Margin binding, which is a bit tricky. The purpose of that is to apply a negative bottom margin opposite to the height, in order to keep the layout height of the control at 0. The custom value-converter class converts a double value into a Thickness object with negative margin of the same magnitude. Without it, the entire ScrollViewer would get "pushed" down as the control before it was enlarged.</p>
<h4>Putting it all together</h4>
<p>With the two tricky parts done, the rest is pretty typical for building custom controls. I'm not going to walk though the details here, as the concepts are covered well in other places. But here's a brief list of what else went into my PullDownToRefreshPanel custom control:</p>
<ul>
<li>A RefreshRequested event to signal the app when the user has completed the refresh gesture</li>
<li>DataTemplate properties for each of the three indicators (pulling down, ready to release, refreshing) to allow customizing those visuals without needing to re-template the whole control</li>
<li>Visual-state definitions in the control template XAML to control the visibility of each of the templates according to the current visual state</li>
<li>An IsRefreshing property to allow the app to easily enter and exit the refreshing visual state (which shows an indeterminate progress bar by default)</li>
<li>Automatic detection of a nearby ScrollViewer or ListBox -- just put the PullDownToRefreshPanel in the same parent container and it will hook itself up</li>
</ul>
<h4>Demo</h4>
<p>For demonstration purposes, I've added the PullDownToRefreshPanel code to my <a href="http://blogs.msdn.com/b/jasongin/archive/2011/01/03/wp7-reorderlistbox-improvements-rearrange-animations-and-more.aspx">ReorderListBox</a> demo app. It should work just as well with any other ListBox or ScrollPanel. Sorry, it won't work with a LongListSelector -- that control does custom scrolling without using a ScrollViewer. I've attached to this post a ZIP containing source code for both controls and the demo project.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/10/15/31/02/ReorderListBox-WP71.zip" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-15-31-02/ReorderListBox_2D00_WP71.zip">ReorderListBox-WP71.zip</a></p>]]></content:encoded>
    </item>
    <item>
      <title>WP7 ReorderListBox improvements: rearrange animations and more</title>
      <link>https://docs.microsoft.com/archive/blogs/jasongin/wp7-reorderlistbox-improvements-rearrange-animations-and-more</link>
      <pubDate>Mon, 03 Jan 2011 01:33:00 GMT</pubDate>
      <dc:creator><![CDATA[Jason Ginchereau - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasongin/2011/01/03/wp7-reorderlistbox-improvements-rearrange-animations-and-more/</guid>
      <description><![CDATA[Update 2013-10-08: Created a ReorderListBox CodePlex project and pushed a ReorderListBox NuGet...]]></description>
      <content:encoded><![CDATA[<p><span style="color: #800000;"><strong>Update 2013-10-08: Created a <a href="http://reorderlistbox.codeplex.com/">ReorderListBox CodePlex project</a> and pushed a <a href="http://www.nuget.org/packages/ReorderListBox/">ReorderListBox NuGet package</a>. Use either of those to get the latest version of this control.</strong></span></p>
<p><span style="color: #800000;"><strong>Update 2011-12-19: Updated the&nbsp;attached demo project to target the WP 7.1 (Mango) SDK. This required a small change to the auto-scroll logic.</strong></span></p>
<p>The <a href="http://blogs.msdn.com/b/jasongin/archive/2010/12/27/a-reorderlistbox-for-windows-phone-7.aspx">ReorderListBox control I shared last week</a> was moderately popular, and I've received some great feedback. Today I'm sharing an update to that control that polishes some minor issues and adds a&nbsp;cool new feature I call "rearrange animations". This feature allows the application to <em>programmatically</em> move, insert, or delete items in the list while showing a nice visual indication of what is happening. Specifically, the animations are as follows:</p>
<ul>
<li>Inserted items fade in while later items slide down to make space.</li>
<li>Removed items fade out while later items slide up to close the gap.</li>
<li>Moved items slide from their previous location to their new location.</li>
<li>Moved items which move out of or in to the visible area also fade out / fade in while sliding.</li>
</ul>
<p>The rearrange animations&nbsp;are complementary&nbsp;to the interactive drag-and-drop reordering, and&nbsp;both features can be enabled at the same time. Unfortunately the rearrange&nbsp;animations are not customizable in XAML due to the way they must be dynamically generated. And when using them you'll have to keep performance in mind: if you make a lot of changes to a large list (such as a full shuffle or sort) then the rearrange animations may take some time to prepare, although once the animations start they&nbsp;should be smooth. In my tests on a Samsung Focus, such complex rearrangements took up to about a second to prepare. Simpler operations such as moving, adding, or removing an item or two are much faster.</p>
<p>Updated source is <span style="text-decoration: line-through;">attached</span> at the&nbsp;<a href="http://reorderlistbox.codeplex.com/">ReorderListBox CodePlex site</a>.&nbsp;Here's a complete list of what else has changed since last week:</p>
<ul>
<li>When an item is dropped, it now quickly slides into its proper position rather than suddenly appearing there.</li>
<li>Control templates are corrected: a few things were missing compared to the standard ListBox control template, most notably the selected-item accent color.</li>
<li>The scrollbar is now made visible while drag-scrolling.</li>
<li>Fixed a bug that prevented moving a taller item to the top or bottom position when a shorter item was there.</li>
<li>Fixed a bug that caused the list items to jump slightly after moving an item down by more than a page then dropping it.</li>
</ul>
<p>And now, a video preview of the improved ReorderListBox control!</p>[Video]]]></content:encoded>
    </item>
    <item>
      <title>A ReorderListBox for Windows Phone 7</title>
      <link>https://docs.microsoft.com/archive/blogs/jasongin/a-reorderlistbox-for-windows-phone-7</link>
      <pubDate>Mon, 27 Dec 2010 18:49:00 GMT</pubDate>
      <dc:creator><![CDATA[Jason Ginchereau - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasongin/2010/12/27/a-reorderlistbox-for-windows-phone-7/</guid>
      <description><![CDATA[Update 2013-10-08: Created a ReorderListBox CodePlex project and pushed a ReorderListBox NuGet...]]></description>
      <content:encoded><![CDATA[<p><span style="color: #800000;"><strong>Update 2013-10-08: Created a <a href="http://reorderlistbox.codeplex.com/">ReorderListBox CodePlex project</a> and pushed a <a href="http://www.nuget.org/packages/ReorderListBox/">ReorderListBox NuGet package</a>. Use either of those to get the latest version of this control.</strong></span></p>
<p><strong>Update 2011-01-03: <a href="http://blogs.msdn.com/b/jasongin/archive/2011/01/03/wp7-reorderlistbox-improvements-rearrange-animations-and-more.aspx">An improved version of this control is available.</a></strong></p>
<p>For a Windows Phone 7 application I was building, I needed a way for the user to easily drag to re-order items in a list. My searches for any existing examples turned up nothing, so I set out to build a custom control myself. It was challenging to say the least, and it forced me to learn a lot more about Silverlight including custom controls, ListBox virtualization, visual states and transitions. (I was certainly not an expert to start with.)</p>
<p>Overall, I'm pretty happy with how it turned out.</p>
<ul>
<li>It's a drop-in replacement for a standard ListBox. All properties including item templates still work.</li>
<li>It's compatible with data-binding: the reordering is propogated back to the items source list.</li>
<li>It works with ListBox's automatic virtualization to support large item collections efficiently.</li>
<li>The list scrolls automatically while dragging up or down near the top or bottom margin.</li>
<li>Visuals are fully template-driven,&nbsp;making use of&nbsp;visual states and transition animations.</li>
<li>When dragging, the other items smoothly move around to make space&nbsp;for the dragged item.</li>
<li>The reorder capability can be enabled or disabled via a dependency property.</li>
</ul>
<p>Each list item has a "handle" shown when reordering is enabled. Dragging on the handle will drag the item up or down, with a semi-transparent highlight. Dragging anywhere else over the list area will scroll the list normally. The default appearance of the handle is shown below, but it is styleable.</p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/03/73/5148.ReorderListBoxDemo.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-03-73/5148.ReorderListBoxDemo.png" alt="" border="0" /></p>
<p>Source code and a simple demo app are <span style="text-decoration: line-through;">in the attached ZIP</span> published&nbsp;in the CodePlex project.&nbsp;Please let me know how it works out for you!</p>]]></content:encoded>
    </item>
    <item>
      <title>Votive project platform configurations</title>
      <link>https://docs.microsoft.com/archive/blogs/jasongin/votive-project-platform-configurations</link>
      <pubDate>Wed, 09 Jul 2008 13:42:00 GMT</pubDate>
      <dc:creator><![CDATA[Jason Ginchereau - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasongin/2008/07/09/votive-project-platform-configurations/</guid>
      <description><![CDATA[There are some problems using older .wixproj files with newer builds of Votive. When accessing...]]></description>
      <content:encoded><![CDATA[<P>There are some problems using older .wixproj files with newer builds of Votive. When accessing project properties you may receive the error message:</P>
<BLOCKQUOTE>
<P>An error occurred trying to load the page.<BR>Value does not fall within the expected range.</P></BLOCKQUOTE>
<P><STRONG>Update</STRONG>: As another symptom of the same issue, you may also experience problems with source control check-out&nbsp;with any projects in the solution.</P>
<P>The breaking changes were introduced in WiX builds 3.0.4109 - 3.0.4220, so a .wixproj created with a build &lt;4109 will have problems when used with a build &gt;=4220. I'll explain the&nbsp;changes here and show you how to update older project files to work with newer WiX builds.</P>
<P>The changes are all about the default and available platform configurations of WiX projects. Previously, WiX projects always had a platform of "Any CPU", and there was no way to change it. But actually MSI packages are somewhat platform-specific: a package is <A class="" title="MSDN: Template Summary Property" href="http://msdn.microsoft.com/en-us/library/aa372070.aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa372070.aspx">marked as either 32bit or 64bit</A>, and cannot be both. While a 32bit MSI can install on a 64bit OS, it's a bit like a 32bit EXE running on WoW in that it can't easily interact with any of the 64bit parts of the system.</P>
<P>The WiX command-line toolset has long enabled building both 32bit and 64bit MSIs, and more developers are starting to build 64bit packages, so we thought it made a lot of sense to expose that capability in the natural Visual Studio representation: project platforms. With the latest builds, a new WiX project has its configuration set to "x86" by default, and you can use the VS Configuration Manager to add an additional "x64" platform if you need it. (IA64 support is not yet implemented... is there any demand?) Also "Any CPU" is no longer a valid platform for WiX projects -- it was only there because Votive builds on a VS project framework was originally designed for compiling .NET languages.</P>
<P>If you have WiX projects that were created with an older WiX build and you want to continue to use them with a newer&nbsp;build without recreating the projects, use the following steps:</P>
<OL>
<LI>Install the new build of WiX.</LI>
<LI>In VS, open the solution that includes one or more WiX projects.</LI>
<LI>For each WiX project node in the solution explorer, right-click and Unload Project, then right-click again and Edit the .wixproj.</LI>
<LI>Change the conditional expression on each configuration PropertyGroup to include an "x86" platform:<BR>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">&lt;</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">PropertyGroup</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"> </SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">Condition</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">=</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"> '$(Configuration)<SPAN style="BACKGROUND: yellow; mso-highlight: yellow">|$(Platform)</SPAN>' == 'Debug<SPAN style="BACKGROUND: yellow; mso-highlight: yellow">|x86</SPAN>' </SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">&gt;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">...<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">&lt;</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">PropertyGroup</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"> </SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">Condition</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">=</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"> '$(Configuration)<SPAN style="BACKGROUND: yellow; mso-highlight: yellow">|$(Platform)</SPAN>' == 'Release<SPAN style="BACKGROUND: yellow; mso-highlight: yellow">|x86</SPAN>' </SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">&gt;</SPAN></P></LI>
<LI>Right-click on the project node and Reload the project.</LI>
<LI>From the Build menu, open the Configuration Manager tool. Ensure that each WiX project is selected to build (if desired) for each solution configuration.</LI></OL>]]></content:encoded>
    </item>
    <item>
      <title>Custom action project templates</title>
      <link>https://docs.microsoft.com/archive/blogs/jasongin/custom-action-project-templates</link>
      <pubDate>Fri, 23 May 2008 12:19:00 GMT</pubDate>
      <dc:creator><![CDATA[Jason Ginchereau - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasongin/2008/05/23/custom-action-project-templates/</guid>
      <description><![CDATA[New in this week's WiX build 3.0.4123 are Visual Studio 2005 &amp; 2008 templates for C++, C#, and...]]></description>
      <content:encoded><![CDATA[<P>New in this week's WiX build <A class="" href="http://wix.sourceforge.net/releases/" mce_href="http://wix.sourceforge.net/releases/">3.0.4123</A> are Visual Studio 2005 &amp; 2008 templates for C++, C#, and VB custom action projects:</P>
<P mce_keep="true"><IMG title="WiX Project Templates for Visual Studio" style="WIDTH: 500px; HEIGHT: 298px" height=298 alt="WiX Project Templates for Visual Studio" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/08/54/02/37/newca.png" original-url="http://blogs.msdn.com/photos/jasongin/images/8540237/500x298.aspx" width=500 mce_src="http://blogs.msdn.com/photos/jasongin/images/8540237/500x298.aspx"></P>
<P>The C++ project sets you up with the WiX unmanaged CA utility library (wcautil), while the C# and VB projects use the DTF library for managed-code MSI custom actions. I assume you're here because you want to read more about the latter.</P>
<P>When DTF first released with WiX last week, it included some sparse documentation about how to create a post-build step to package up your managed CA assembly in a form callable by MSI. I apologize to anyone who jumped on it right away and had trouble hooking things up (which was only made more difficult by a missing binary that had to be built from source). I should have had these templates ready then.</P>
<P>When you create a C# custom action project from the new template, the project has the necessary post-build step hooked up already. For the curious, those build rules are in %ProgramFiles%\MSBuild\Microsoft\WiX\v3.0\wix.ca.targets. Building the custom action project will produce an additional DLL in the target directory with the name <STRONG>$(TargetName).CA.dll</STRONG>. That is the DLL to be streamed into your MSI Binary table. Since that DLL exports ordinary entrypoints callable directly by the MSI engine, you can use it with any MSI authoring tool as if it was an unmanaged CA DLL.</P>
<P>The custom action build process will automatically package up any non-GAC'd assemblies that your CA depends on. (Make sure the Copy Local property is set to 'true' on the reference node if you want it included.) Those dependencies will include at a minimum the Microsoft.Deployment.WindowsInstaller.dll assembly from DTF. Additionally, any items in the project with a Build Action of 'Content' will be included in the CA package. CustomAction.config is the sole Content file in the template; your CA may require additional resources or data files at runtime.</P>
<P>In Votive, a convenient way to consume the custom action DLL in your setup is via a project reference:</P>
<OL>
<LI>Create a solution with a WiX MSI or WiX Library project and a C# or VB custom action project.</LI>
<LI>Add a reference from the WiX project to the custom action project.</LI>
<LI>Author the custom action in your setup with WiX code similar to the fragment below. Note you may need to change some attributes in the XML, depending on your CA and how it executes.</LI></OL><SPAN style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">&lt;</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">Fragment</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">&gt;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&lt;</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">Binary</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt"> </SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">Id</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">=</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">MyCustomAction.dll</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">"<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">SourceFile</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">=</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">$(var.<I style="mso-bidi-font-style: normal">CAProjectName</I>.TargetDir)$(var.<I style="mso-bidi-font-style: normal">CAProjectName</I>.TargetName).CA.dll</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt"> /&gt;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&lt;</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">CustomAction</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt"> </SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">Id</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">=</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">MyCustomAction</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt"> </SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">BinaryKey</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">=</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">MyCustomAction.dll</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">"<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">DllEntry</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">=</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">"</SPAN><I style="mso-bidi-font-style: normal"><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">CAMethodName</SPAN></I><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt"> </SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">Execute</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">=</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">immediate</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: windowtext; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt">"</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt"> /&gt;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA">&lt;/</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA">Fragment</SPAN><SPAN style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: Consolas; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-bidi-font-size: 9.0pt; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA">&gt;</SPAN></SPAN></P>
<P>I hope this helps interested developers get started with managed custom actions. Future posts here will hopefully get into some actual coding.<BR></P>]]></content:encoded>
    </item>
    <item>
      <title>A brief history of the Deployment Tools Foundation project</title>
      <link>https://docs.microsoft.com/archive/blogs/jasongin/a-brief-history-of-the-deployment-tools-foundation-project</link>
      <pubDate>Fri, 16 May 2008 16:19:00 GMT</pubDate>
      <dc:creator><![CDATA[Jason Ginchereau - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasongin/2008/05/16/a-brief-history-of-the-deployment-tools-foundation-project/</guid>
      <description><![CDATA[Rob mentioned in this morning's announcement that I've been working on the DTF project for quite a...]]></description>
      <content:encoded><![CDATA[<P>Rob mentioned in <A class="" title="Deployment Tools Foundation joins the WiX toolset." href="http://robmensching.com/blog/archive/2008/05/16/Deployment-Tools-Foundation-joins-the-WiX-toolset.aspx" mce_href="http://robmensching.com/blog/archive/2008/05/16/Deployment-Tools-Foundation-joins-the-WiX-toolset.aspx">this morning's announcement</A> that I've been working on the DTF project for quite a while. Indeed, if you look at the change history topic in DTF.chm, you'll see entries going back to January 2003. (And development of what would become DTF actually started over a year prior, when .NET 1.0 was not quite released yet.) Before I get into some technical topics, I wanted to talk about how the project evolved, and maybe explain a bit about why it took so long to get released externally.</P>
<P>As I said in <A class="" title="Introducing myself" href="http://blogs.msdn.com/jasongin/archive/2008/05/16/introducing-myself.aspx" mce_href="http://blogs.msdn.com/jasongin/archive/2008/05/16/introducing-myself.aspx">my introduction</A>, in previous years I spent a lot of time working on internal deployment-related tools. Specifically these were tools for authoring, building, installing, testing and debugging MSIs and MSPs for DevDiv products, mostly Visual Studio&nbsp;and .NET Framework. I found very early that programming against the Windows Installer APIs in C++ is a slow and sometimes arduous task, and while script is easier to write it's not a robust scalable solution. I wanted to take advantage of the great productivity gains of the then-new .NET platform, so I started by creating a limited interop library for accessing the MSI APIs from a .NET language. As I worked on more tools, I gradually filled out and improved that interop library. I also added a cabinet library since working with MSI setups often involves dealing with cabinets.</P>
<P>After sharing it with a few other teams in the company who were also working on deployment related tools, I got great feedback on the value of the project, which motivated me to cover the remaining MSI APIs and add more documentation to make it a more complete framework. Most of this work was actually done outside of my day job -- I would work a few evenings and weekends on the project now and then, just motivated by the positive feedback and knowing that I was making other developers' jobs easier.</P>
<P>The debate about managed custom actions is nearly as old as managed code. While the .NET Framework has always provided an InstallUtil tool that lets you invoke managed assembly Installer classes during the setup, it is, to be blunt, a managed version of self-reg&nbsp;suffering from nearly all the <A class="" title="MSDN topic for MSI SelfReg table" href="http://msdn.microsoft.com/en-us/library/aa371608.aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa371608.aspx">problems that plague classic DLL self-registration</A>. That means InstallUtil custom actions usually are not a good idea if you're interested in creating a really clean and robust setup. Still, if you're working with a product or platform that's all based on managed code, it's likely your setup will need to run managed code to intract with it.</P>
<P>So with the DTF project I took on the challenge of enabling <EM>real</EM> managed custom actions&nbsp;that have all the capabilities of unmanaged custom actions in terms of access to the installer session, allowing them to follow the best practices for&nbsp;<A class="" title="Custom actions should be data driven." href="http://robmensching.com/blog/archive/2007/09/13/Zataoca-Custom-actions-should-be-data-driven.aspx" mce_href="http://robmensching.com/blog/archive/2007/09/13/Zataoca-Custom-actions-should-be-data-driven.aspx">data-driven custom actions</A>. Given that I already had a library that exposed all the MSI APIs in managed code, I was halfway there, or so I thought. Over the years I went through three major design iterations for how the managed-code CA got launched. While the earlier designs seemed to work well, they suffered from some subtle robustness issues related to interactions between the CLR and the MSI engine. It wasn't until last summer that I finally overcame the last technical hurdle (<A class="" title="Managed Code CustomActions, no support on the way and here's why." href="http://robmensching.com/blog/archive/2007/04/19/Managed-Code-CustomActions-no-support-on-the-way-and-heres.aspx" mce_href="http://robmensching.com/blog/archive/2007/04/19/Managed-Code-CustomActions-no-support-on-the-way-and-heres.aspx">described in Rob's blog post</A>) to achieve what I believe now is a robust framework for managed custom actions.</P>
<P>For several years I've been looking for a way to release the DTF project externally, since I think there are lots of developers&nbsp;who would find it useful. There have been a number of reasons why it didn't happen until now. For a while the MSI team was hinting that they might implement their own set of official managed APIs for the Windows Installer platform (and I didn't want to cause confusion with an alternative), but now it doesn't look like that will happen anytime soon if ever. Also I didn't want to release a framework for managed custom actions until I had something that addressed robustness issues with CLR and MSI interactions.</P>
<P>The final barrier to releasing DTF was the strategic concern, also described by Rob, about wanting to reduce people's reliance on custom actions in their setups. Personally on this issue I've always been somewhat of a pragmatist: the MSI platform can never support everything that people might possibly need to do in their setups, so there will always be a need for <EM>some</EM> custom actions. And if my framework can make it easier for those people to write quality custom actions, I think that's a good thing. Now that a few other key people here have more or less come around to that point of view, DTF could finally be released. I hope all the developers out there will prove us right by not writing too many crazy ill-conceived managed custom actions.</P>]]></content:encoded>
    </item>
    <item>
      <title>Introducing myself</title>
      <link>https://docs.microsoft.com/archive/blogs/jasongin/introducing-myself</link>
      <pubDate>Fri, 16 May 2008 15:57:00 GMT</pubDate>
      <dc:creator><![CDATA[Jason Ginchereau - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasongin/2008/05/16/introducing-myself/</guid>
      <description><![CDATA[Today's release of DTF with the WiX toolset has finally given me the motivation to start this blog,...]]></description>
      <content:encoded><![CDATA[<P>Today's <A class="" title="Deployment Tools Foundation joins the WiX toolset." href="http://robmensching.com/blog/archive/2008/05/16/Deployment-Tools-Foundation-joins-the-WiX-toolset.aspx" mce_href="http://robmensching.com/blog/archive/2008/05/16/Deployment-Tools-Foundation-joins-the-WiX-toolset.aspx">release of DTF with the WiX toolset</A> has finally given me the motivation to start this blog, which I have long intended to do anway. Before I delve into posts about DTF, I thought I would share a little about myself.</P>
<P>I've been a developer at Microsoft for about 8 years now, and have spent most of that time working on various areas of software deployment. For a long time it was primarily internal tools, which is why you haven't seen much of me out here. More recently I've become the lead for a team in the Deployment Technology Group in DevDiv responsible for integrating WiX and Votive into the next release of Visual Studio. This means I've been working closely with others you may know in the WiX community including <A class="" title="Rob Mensching's Blog" href="http://robmensching.com/blog/" mce_href="http://robmensching.com/blog/">Rob</A>, <A class="" title="Justin Rockwood's Blog" href="http://blogs.msdn.com/jrock/" mce_href="http://blogs.msdn.com/jrock/">Justin</A>, <A class="" title="Bob Arnson's Blog" href="http://www.joyofsetup.com/" mce_href="http://www.joyofsetup.com/">Bob</A>, <A class="" title="Peter Marcu's Blog" href="http://blogs.msdn.com/pmarcu/" mce_href="http://blogs.msdn.com/pmarcu/">Peter</A>, and <A class="" title="Heath Stewart's Blog" href="http://blogs.msdn.com/heaths/" mce_href="http://blogs.msdn.com/heaths/">Heath</A>.</P>
<P>In addition to software deployment, I'm passionate about managed code and developer tools, so I spend a lot of time working on the intersection of those thre areas. This passion has led directly to my work on the DTF project, which I am excited to talk about in upcoming blog posts.</P>]]></content:encoded>
    </item>
  </channel>
</rss>