<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.wintellect.com/CS/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Wintellog</title><link>http://www.wintellect.com/CS/blogs/default.aspx</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.2)</generator><item><title>Using AppDomains to make Non-Threadsafe code Threadsafe</title><link>http://www.wintellect.com/CS/blogs/jeffreyr/archive/2010/09/01/using-appdomains-to-make-non-threadsafe-code-threadsafe.aspx</link><pubDate>Wed, 01 Sep 2010 20:39:41 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:18359</guid><dc:creator>JeffreyR</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Recently, I was involved in a Wintellect consulting engagement where a customer had some class library code that was created years ago. The code in this class library was not designed to work well in a multithreaded environment. Specifically, this means that if two or more threads called into the class library code at the same time, the data got corrupted and the results could not be trusted. Non-concurrent-ready code is easy to obtain with frequent use of mutable static fields. But, there are other common coding practices which can result in code that is not safe with multiple threads passing through it at the same time. 
&lt;/p&gt;&lt;p&gt;This customer wanted to increase the performance of their code and the best way to accomplish this is to have multiple threads processing their own data independently of each other. But, again, the class library code base would produce errant results if we did this. To demonstrate the problem, imagine this very simple static class which is indicative of the non-thread safe class library that I'm referring to:
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;internal&lt;/span&gt;
			&lt;span style="color:blue;"&gt;static&lt;/span&gt;
			&lt;span style="color:blue;"&gt;class&lt;/span&gt;
			&lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithm&lt;/span&gt; {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;
			&lt;span style="color:blue;"&gt;private&lt;/span&gt;
			&lt;span style="color:blue;"&gt;static&lt;/span&gt;
			&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;&amp;gt; s_items = &lt;span style="color:blue;"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;&amp;gt;();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;
			&lt;span style="color:blue;"&gt;public&lt;/span&gt;
			&lt;span style="color:blue;"&gt;static&lt;/span&gt;
			&lt;span style="color:blue;"&gt;void&lt;/span&gt; Add(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; item) { s_items.Add(item); }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;
			&lt;span style="color:blue;"&gt;public&lt;/span&gt;
			&lt;span style="color:blue;"&gt;static&lt;/span&gt;
			&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;[] GetItems() { &lt;span style="color:blue;"&gt;return&lt;/span&gt; s_items.ToArray();  }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;If we have two threads using this class simultaneously, the results are unpredictable. For example, let's say we have this code:
&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="color:#2b91af;"&gt;ThreadPool&lt;/span&gt;.QueueUserWorkItem(o =&amp;gt; &lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithm&lt;/span&gt;.Add(&lt;span style="color:#a31515;"&gt;"Item 1"&lt;/span&gt;), &lt;span style="color:blue;"&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithm&lt;/span&gt;.Add(&lt;span style="color:#a31515;"&gt;"Item 2"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;.Sleep(1000);  &lt;span style="color:green;"&gt;// To demonstrate the problem consistently&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; i &lt;span style="color:blue;"&gt;in&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithm&lt;/span&gt;.GetItems())&lt;br /&gt;   &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(i);
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;When this code runs, the console could show:
&lt;/p&gt;&lt;ul style="margin-left:54pt;"&gt;&lt;li&gt;"Item 2" by itself
&lt;/li&gt;&lt;li&gt;"Item 2" followed by "Item 1"
&lt;/li&gt;&lt;li&gt;"Item 1" followed by "Item 2"
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Clearly, this is not desireable and the problem all stems from the threads sharing the one List&amp;lt;String&amp;gt; object. In fact, the List&amp;lt;T&amp;gt; class is not itself thread-safe and so it is even possible that having multiple threads accessing it simultaneously could result in items disappearing or a single item being inserted multiple times, or worse. It depends on how the List&amp;lt;T&amp;gt; class is internally implemented which is not documented and is subject to change.
&lt;/p&gt;&lt;p&gt;Now, one way to improve performance for the customer would be for Wintellect to take the non-concurrent code base and make it thread safe. This is the best thing to do; however, the code base was very large, the changes to the code base would have been substantial and a lot of testing would have had to be done. The customer was not too excited by this recommendation. So, what we did instead was use the CLR's AppDomain feature.  This works out great because an AppDomain's state is completely isolated from all other AppDomains. To communicate across AppDomains, you must create a class derived from MarshalByRefObject. So, I created a NonConcurrentAlgorithmProxy class that wraps the methods of the static class. The NonConcurrentAlgorithmProxy class looks like this:
&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="color:blue;"&gt;internal&lt;/span&gt; &lt;span style="color:blue;"&gt;sealed&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithmProxy&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;MarshalByRefObject&lt;/span&gt; {
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Consolas;"&gt;   &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Add(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; item) { &lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithm&lt;/span&gt;.Add(item); }&lt;br /&gt;   &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;[] GetItems()   { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithm&lt;/span&gt;.GetItems(); }&lt;br /&gt;}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Then we modified the code that uses this class library code so that each thread creates its own AppDomain and creates an instance of the NonConcurrentAlgorithmProxy class in each AppDomain. The static field in the NonConcurrentAlgorithm class is now one-per-AppDomain and since each thread gets its own AppDomain, there is now one List&amp;lt;String&amp;gt; object per thread. Here is the new code that uses the class library code via the proxy class:
&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Consolas;"&gt;&lt;span style="color:green;"&gt;// Create Thread 1's AppDomain &amp;amp; proxy&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; thread1AppDomain = &lt;span style="color:#2b91af;"&gt;AppDomain&lt;/span&gt;.CreateDomain(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.Empty);&lt;br /&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; thread1Proxy = (&lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithmProxy&lt;/span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Consolas;"&gt;   thread1AppDomain.CreateInstanceAndUnwrap(
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Consolas;"&gt;      t&lt;span style="color:blue;"&gt;ypeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithmProxy&lt;/span&gt;).Assembly.FullName,
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Consolas;"&gt;      &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithmProxy&lt;/span&gt;).FullName);&lt;br /&gt;
					&lt;br /&gt;&lt;span style="color:green;"&gt;// Create Thread 2's AppDomain &amp;amp; proxy&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; thread2AppDomain = &lt;span style="color:#2b91af;"&gt;AppDomain&lt;/span&gt;.CreateDomain(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.Empty);&lt;br /&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; thread2Proxy = (&lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithmProxy&lt;/span&gt;) 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Consolas;"&gt;   thread2AppDomain.CreateInstanceAndUnwrap(
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Consolas;"&gt;
					&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithmProxy&lt;/span&gt;).Assembly.FullName, 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Consolas;"&gt;
					&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;NonConcurrentAlgorithmProxy&lt;/span&gt;).FullName);&lt;br /&gt;
					&lt;br /&gt;&lt;span style="color:green;"&gt;// Have 2 threads execute the same code at the same time but in different AppDomains&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;ThreadPool&lt;/span&gt;.QueueUserWorkItem(o =&amp;gt; thread2Proxy.Add(&lt;span style="color:#a31515;"&gt;"Item 1"&lt;/span&gt;), &lt;span style="color:blue;"&gt;null&lt;/span&gt;);&lt;br /&gt;thread1Proxy.Add(&lt;span style="color:#a31515;"&gt;"Item 2"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;.Sleep(1000);  &lt;span style="color:green;"&gt;// To demonstrate the problem has been fixed&lt;/span&gt;&lt;br /&gt;
					&lt;br /&gt;&lt;span style="color:green;"&gt;// Show Thread 1's list of items; guaranteed to be "Item 2"&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; i &lt;span style="color:blue;"&gt;in&lt;/span&gt; thread1Proxy.GetItems())&lt;br /&gt;   &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(i);&lt;br /&gt;
					&lt;br /&gt;&lt;span style="color:green;"&gt;// Show Thread 2's list of items; guaranteed to be "Item 1"&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; i &lt;span style="color:blue;"&gt;in&lt;/span&gt; thread2Proxy.GetItems())&lt;br /&gt;   &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(i);&lt;br /&gt;
					&lt;br /&gt;&lt;span style="color:green;"&gt;// Cleanup each thread's AppDomain&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;AppDomain&lt;/span&gt;.Unload(thread1AppDomain);&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;AppDomain&lt;/span&gt;.Unload(thread2AppDomain);
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;This is substantially less coding, testing, and effort than what would have been involved with making the customer's current code base thread safe! And, this technique can scale very nicely for many threads as well. Of course, there is a slight performance penalty when creating/destroying  AppDomains and calling methods through the proxy. This is why it would be ideal to make the existing code base thread safe. But, this is a great compromise and the customer was quite happy with the results and the time/cost it required to improve their application's performance substantially.&lt;/p&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=18359" width="1" height="1"&gt;</description></item><item><title>Hello, MEF for Silverlight Quickstart</title><link>http://www.wintellect.com/CS/blogs/jlikness/archive/2010/09/01/hello-mef-for-silverlight-quickstart.aspx</link><pubDate>Wed, 01 Sep 2010 12:42:05 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:18358</guid><dc:creator>C#er : IMage</dc:creator><slash:comments>0</slash:comments><description>Published another quickstart. This is an introductory quickstart for the Managed Extensibility Framework, and is similar to the previous one except that it is specific to Silverlight. You can take a look at the article and watch the short video by clicking here ....(&lt;a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2010/09/01/hello-mef-for-silverlight-quickstart.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=18358" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/silverlight/default.aspx">silverlight</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/MEF/default.aspx">MEF</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/Managed+Extensibility+Framework/default.aspx">Managed Extensibility Framework</category></item><item><title>Zen of Paraffin</title><link>http://www.wintellect.com/CS/blogs/jrobbins/archive/2010/08/31/zen-of-paraffin.aspx</link><pubDate>Tue, 31 Aug 2010 21:34:00 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:18337</guid><dc:creator>jrobbins</dc:creator><slash:comments>1</slash:comments><description>&lt;P&gt;With Paraffin 3.5, I included this document, but thought it would be worth posting as well for those of you that aren't familiar with Paraffin. You can download the lastest release here: &lt;A href="http://www.wintellect.com/CS/files/folders/18310/download.aspx"&gt;http://www.wintellect.com/CS/files/folders/18310/download.aspx&lt;/A&gt; &lt;/P&gt;
&lt;H2&gt;Introduction&lt;/H2&gt;
&lt;P&gt;When building WiX-based installers, you quickly run into the problem of maintaining the list of files you want to install. The HEAT tool that comes with WiX does a great job creating the initial fragments, but doesn't have any support for what happens during normal development: you're adding and removing files all the time. For many installs, HEAT works fine, but if you have an installer that's installing hundreds to hundreds of thousands of files, the thought of maintaining those fragments of XML by hand would fill anyone with dread.&lt;/P&gt;
&lt;P&gt;A few years ago, I was running into that same trouble with my WiX installers right around the time .NET 3.0 and LINQ were starting their beta testing. Seeing a need to scratch my itch, I dove in and created Paraffin. The idea was simple, you could maintain your fragments without breaking component rules as files were added and removed from your installer. Paraffin has grown as more people have started using it and suggest features. Thanks to everyone who's used Paraffin!&lt;/P&gt;
&lt;P&gt;This guide is to help you get more out of Paraffin. Obviously, it assumes you are conversant with WiX and Windows Installer. If you're new to WiX, you should head over to Gábor DEÁK JAHN's excellent tutorial (&lt;A href="http://www.tramontana.co.hu/wix/"&gt;http://www.tramontana.co.hu/wix/&lt;/A&gt;).&lt;/P&gt;
&lt;H2&gt;TWO SUPER IMPORTANT NOTES ABOUT PARAFFIN!&lt;/H2&gt;
&lt;P&gt;The first key to maximizing Paraffin usage is that you always run Paraffin updates from the same relative directory where you first created the initial WiX fragment. For example, if you change to C:\BUILD\IMAGES in PowerShell and create the initial WiX fragment for the IMAGES directory, all updates have to be run from the IMAGES directory. You can hard code starting directory paths in Paraffin, but that will probably break your builds. By running from the IMAGES directory, you are in the same place relative to the rest of the code in your WiX project every time. This allows more flexibility.&lt;/P&gt;
&lt;P&gt;The second key is that in Windows Installer, component rules are sacred. Paraffin works very hard to avoid issues, but if you are not careful you can make your life super difficult. This warning is mainly around patching issues. Patching is far more difficult to get right than it should be. From my experience, you would be much better off sticking to making everything a major upgrade for every install. Based on many requests, I've made Paraffin much more usable in patching scenarios (minor upgrades), but you really do need to know what you're doing and have planned your install completely.&lt;/P&gt;
&lt;H2&gt;Creating Your First Fragments&lt;/H2&gt;
&lt;P&gt;Paraffin supports three modes of execution, creating fragments, updating fragments for major upgrades, and updating fragments for minor upgrades. Obviously, you first have to create a fragment in order to upgrade that fragment. &lt;/P&gt;
&lt;H2&gt;Required Parameters for Initial File Creation&lt;/H2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Parameter&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Description&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-dir &amp;lt;directory&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;This is the directory you want Paraffin to recurse looking for files. As I mentioned previously, it's best to use relative paths here to avoid hard coded drives and directories.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-GroupName &amp;lt;value&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Paraffin automatically creates a &amp;lt;ComponentGroup&amp;gt; element in the output file so in your main install .WXS file you can pull in all the components easily with &amp;lt;ComponentRef&amp;gt; element.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;&amp;lt;file&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;The filename for output.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;H2&gt;Optional Parameters for Initial File Creation&lt;/H2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Parameter&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Description&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-alias &amp;lt;alias&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;By default, Paraffin uses the hard coded full name to the file in the File elements Source attribute. The -alias option allows you to substitute a text value for the starting directory (where you run Paraffin) so you can make the Source attribute relative to your main installers directory, or you can insert a WiX preprocessor variable.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-diskId &amp;lt;number&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;The value of the DiskId attribute on component elements in case you have your installer on multiple media. WiX defaults to 1 so you only need to use this switch if you need a value of 2 or higher. The &amp;lt;number&amp;gt; specified must be an integer.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-dirref &amp;lt;DirectoryRef&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Paraffin defaults to using INSTALLDIR as the Id attribute to the &amp;lt;DirectoryRef&amp;gt; element. If you are using a different value to put your fragments under, specify that value with this switch.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-ext &amp;lt;ext&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;File extensions to not include in the Paraffin output. You can specify as many -ext flags as you like. The &amp;lt;ext&amp;gt; specified does not need to include the leading period.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-includeFile &amp;lt;file&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Files to be added as WiX includes at the top of the output file. No validation on the contents of the file. You many have as many -includeFile options as you need.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-norecurse&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Paraffin defaults to recursing the start directory and every directory underneath this, if you only want to do the -dir specified directory, use this switch.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-NoRootDirectory&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Paraffin defaults to including the -dir specified directory as a &amp;lt;Directory&amp;gt; element under the main &amp;lt;DirectoryRef&amp;gt;. If you want the files in the -dir location to go directly under the &amp;lt;DirectoryRef&amp;gt; use this switch.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-regExExclude "regex"&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Adds regular expression exclusions to both files and directories. The regular expression specified must be in quotes to account for spaces. Also, all regular expressions are treated as case insensitive. When Paraffin is looking at files, the regular expression is applied to just the filename. For directories, the check is against the complete drive and directory name. Specify as many -regExExclude options as necessary.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-verbose&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Shows verbose output.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-Win64var &amp;lt;var&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;If specified adds the Win64="&amp;lt;var&amp;gt;" attribute to all components. In most cases you should not use this switch but instead specify the architecture with the WiX tool's -arch switch.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Deprecated Optional Parameters for Initial File Creation&lt;/H2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Parameter&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Description&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-direXclude &amp;lt;exdir&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;This switch may be deprecated in future versions of Paraffin. Please use the -regExExclude switch going forward.&lt;/P&gt;
&lt;P&gt;This switch allows you to specify directory names you want Paraffin to skip and not process. There is no wildcard matching only string contains matching. You can have as many -direXclude switches as necessary.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;H2&gt;Updating Fragments for Major Upgrades&lt;/H2&gt;
&lt;P&gt;As I mentioned earlier, major upgrades are really the way to go with Windows Installer. They alleviate you of worrying very much at all about what happens when you install a new version. Before the new bits are installed, Windows Installer uninstalls the old version so there are no problems with component rules, left over goo, or anything else associated with minor upgrades. If you don't have major prerequisites, such as SQL Server, specific versions of .NET, or anything else complicated, you don't even need a boot strapper, like the long dreamed about Burn, everything can be done with just the .MSI file.&lt;/P&gt;
&lt;P&gt;When using Paraffin to update an existing fragment for a major upgrade, any new files found in the directory are added as appropriate. The Components elements for files that no longer exist are removed. For files that haven't changed the Component element GUID and Id attributes are properly transported to the output file so the component rules don't break.&lt;/P&gt;
&lt;P&gt;It's important to realize that Paraffin does not overwrite the existing &amp;lt;input&amp;gt;.WXS file but writes out the changes to &amp;lt;input&amp;gt;.PARAFFIN. Numerous Paraffin users have asked for Paraffin to overwrite the file, but we're dealing with Windows Installer here. It's a brittle and scary API in Windows so I'm loath to go down that route.&lt;/P&gt;
&lt;H2&gt;Required Parameters for Major Upgrade Processing&lt;/H2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Parameter&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Description&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-update&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;This switch tells Paraffin you want to do updating for a major upgrade.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;&amp;lt;file&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;The original .WXS file to process again.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;H2&gt;Optional Parameters for Major Upgrade Processing&lt;/H2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Parameter&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Description&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-ext &amp;lt;ext&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Additional file extensions to not include in the Paraffin output that will be added to the ones specified when creating the file. You can specify as many -ext flags as you like. The &amp;lt;ext&amp;gt; specified does not need to include the leading period.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-regExExclude "regex"&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Additional regular expression exclusions to both files and directories on top of the ones specified when the file was created. See the previous discussion of -regExExclude for more information. Specify as many -regExExclude options as necessary.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-ReportIfDifferent&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;If specified, Paraffin's exit code will be 4 if the input .WXS file and the output .PARAFFIN file are different. If the files are identical, the exit code is 0. The idea behind this switch is that you could run Paraffin as part of your build and know when you have forgotten to add or remove files from the main .WXS files automatically.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-verbose&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Shows verbose output.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;H2&gt;Updating Fragments for Minor Upgrades&lt;/H2&gt;
&lt;P&gt;Adding files is trivial in a minor upgrade. The problem becomes when you need to remove a file during that minor upgrade. According to the Window Installer rules, that's requires you go directly to a major upgrade. Many people have asked me to implement the scheme described by Vagmi Mudumbai in his blog: &lt;A href="http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/06/11/81426.aspx"&gt;http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/06/11/81426.aspx&lt;/A&gt;, which will remove files during minor upgrades.&lt;/P&gt;
&lt;P&gt;In WiX, the above would look like the following (word wrapped for this document). The trick is to add the Transitive attribute to the Component element, and add a nonsensical condition. The transitive forces the condition to be reevaluated and the condition is false. Thus, the file is uninstalled in a minor upgrade.&lt;/P&gt;&lt;PRE style="FONT-FAMILY:consolas;"&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Component&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;comp_F5B392C05B5249C2AB34810BE4A6163F&lt;/SPAN&gt;"
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Guid&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;FD9D7BF4-550A-47E2-85A3-634D77F609FB&lt;/SPAN&gt;"
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Transitive&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;yes&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;File&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;file_81DD236ED61B4BBEB445FAB9E9C2DAB2&lt;/SPAN&gt;"
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Checksum&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;yes&lt;/SPAN&gt;"
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;KeyPath&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;yes&lt;/SPAN&gt;"
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Source&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;.\Temp\a.exe&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Condition&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;1&amp;nbsp;=&amp;nbsp;0&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Condition&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Component&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;There's one more step that's involved. The file must be there when building your install and it's also best if that file is only zero bytes long so it doesn't take up space in the .MSP. Don't worry Paraffin takes care of all of this mess for you. All you have to do is to delete the files you used to install before running Paraffin to build the minor upgrade ready file.&lt;/P&gt;
&lt;P&gt;Once you've deleted a file for a minor upgrade, Paraffin assumes it's deleted forever. If you try to add a file with the same name and directory back, Paraffin will abort processing because you are going to break the component rules. If you need to add a file with a previously deleted name you need to use a major upgrade. While I'm sure someone will ask that I make Paraffin handle that situation, I won't because you're probably screwing up your installation. &lt;/P&gt;
&lt;P&gt;With the minor upgrade checking, Paraffin is only looking at files it does not look at directories. If you delete or rename a directory, you need to use major upgrades. The trick of using the transitive attribute only applies to the Component element. There's no way for a minor upgrade to remove a directory so there's no need for me to implement support for it.&lt;/P&gt;
&lt;H2&gt;Required Parameters for Minor Upgrade Processing&lt;/H2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Parameter&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Description&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-PatchUpdate&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;This switch tells Paraffin you want to do updating for a major upgrade.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;&amp;lt;file&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;The original .WXS file to process again.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Optional Parameters for Minor Upgrade Processing&lt;/H2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Parameter&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Description&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-ext &amp;lt;ext&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Additional file extensions to not include in the Paraffin output that will be added to the ones specified when creating the file. You can specify as many -ext flags as you like. The &amp;lt;ext&amp;gt; specified does not need to include the leading period.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-regExExclude "regex"&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Additional regular expression exclusions to both files and directories on top of the ones specified when the file was created. See the previous discussion of -regExExclude for more information. Specify as many -regExExclude options as necessary.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-PatchCreateFiles&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;If you'd like Paraffin to create the zero byte files for your removed files, this switch will take care of that for you. If you rerun Paraffin again with the -PatchUpdate switch as it checks the .WXS file for the transitive attribute on the component so it doesn't see the zero byte file as a new file.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-ReportIfDifferent&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;If specified, Paraffin's exit code will be 4 if the input .WXS file and the output .PARAFFIN file are different. If the files are identical, the exit code is 0. The idea behind this switch is that you could run Paraffin as part of your build and know when you have forgotten to add or remove files from the main .WXS files automatically.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-verbose&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Shows verbose output.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;H2&gt;Creating the Removed Zero Byte Files&lt;/H2&gt;
&lt;P&gt;If you're like me, you probably don't want to have these odd zero byte files necessary for the minor upgrade file removal littered through your version control system. Paraffin offers a separate command line option to go create all those zero byte files on the fly. The idea with this command line option is you'll run Paraffin with it as part of your master builds so you don't have to worry about those long ago deleted files ever again.&lt;/P&gt;
&lt;H2&gt;Required Parameters for Zero Byte File Creation&lt;/H2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Parameter&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Description&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-PatchCreateFiles&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Tells Paraffin to create any zero byte files you want to remove in minor upgrades&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;&amp;lt;file&amp;gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;The .WXS file that has dead files in it.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;H2&gt;Optional Parameters for Zero Byte File Creation&lt;/H2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Parameter&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Description&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;-verbose&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Shows verbose output.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;H2&gt;Paraffin Exit Codes&lt;/H2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Exit Code&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;Description&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;0&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Paraffin ran without errors.&lt;/P&gt;
&lt;P&gt;If -ReportIfDifferent was specified when doing either kind of update, zero also means there is no difference between the .WXS file and the .PARAFFIN file.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;1&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;An invalid command line option was specified&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;2&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;The input .WXS file is invalid&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;3&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;The file contains multiple files per component. Starting with WiX 3.5, multiple files per components is no longer supported. Please revert to WiX 3.13.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;B&gt;4&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;If -ReportIfDifferent was specified, an exit code of 4 indicates the input .WXS file and the output .PARAFFIN file are different.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;H2&gt;Paraffin .ParrafinMold files&lt;/H2&gt;
&lt;P&gt;In order to support more customization of the Paraffin output, Paraffin supports the concept of injectable data through files that have the .ParrafinMold extension. For example, since Paraffin does not handle COM and .NET assembly registration, which HEAT does, you may want to put the COM information into a .ParaffinMold file so it can be injected automatically.&lt;/P&gt;
&lt;P&gt;As Paraffin is processing a directory and finds any files matching *.ParaffinMold, it will inject the contents of each .ParaffinMold file into the output file under the current element (normally Directory, or DirectoryRef if -norootdirectory is used).&lt;/P&gt;
&lt;P&gt;All .ParaffinMold files are WiX fragment files must have a DirectoryRef element, but the Id value is ignored. Any elements under the DirectoryRef are placed directly in the output file. There is no checking done on thevalidity of any of those child nodes. Here is an example .ParaffinMold file to insert a Registry element.&lt;/P&gt;&lt;PRE style="FONT-FAMILY:consolas;"&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;?&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;xml&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;version&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;1.0&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;utf-8&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;?&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Wix&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;xmlns&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;http://schemas.microsoft.com/wix/2006/wi&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Fragment&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;DirectoryRef&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;INSTALLDIR&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Component&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;INSTALLDIR&lt;/SPAN&gt;"
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Guid&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;PUT-GUID-HERE&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;RegistryKey&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Root&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;HKLM&lt;/SPAN&gt;"
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Key&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;SOFTWARE\My&amp;nbsp;Company\My&amp;nbsp;Product&lt;/SPAN&gt;"
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Action&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;createAndRemoveOnUninstall&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;RegistryValue&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Name&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;InstallRoot&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Value&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;[INSTALDIR]&lt;/SPAN&gt;"
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Type&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;string&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;KeyPath&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;yes&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;/&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;RegistryKey&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Component&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;DirectoryRef&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Fragment&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Wix&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;H2&gt;Notes for Upgraders to Paraffin 3.5&lt;/H2&gt;
&lt;P&gt;Prior to Paraffin 3.5, Paraffin supported multiple files per component. Since one file per component is much preferred for Windows Installer resiliency, and I couldn't find anyone using multiple files per component, I removed support for it. By doing so it made my development life easier and greatly simplified the new -PatchUpdate feature. If you happen to need multiple files per component, please keep using Paraffin 3.13 you can find here: &lt;A href="http://www.wintellect.com/CS/files/folders/8198/download.aspx"&gt;http://www.wintellect.com/CS/files/folders/8198/download.aspx&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Paraffin used to put the KeyPath attribute on the Component. It looks like now it's much better to have that on the File element itself. If you use Paraffin 3.5 to update a .WXS file created with a previous version, I swap the KeyPath attribute as appropriate. That shouldn't cause any problems for anyone, but I wanted to give you notice of the change. You'll also see yellow warning text on the screen when you run Paraffin when the attribute swap occurs.&lt;/P&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=18337" width="1" height="1"&gt;</description></item><item><title>Paraffin 3.5 – Now with Better Minor Upgrade Support</title><link>http://www.wintellect.com/CS/blogs/jrobbins/archive/2010/08/31/paraffin-3-5-now-with-better-minor-upgrade-support.aspx</link><pubDate>Tue, 31 Aug 2010 21:23:00 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:18336</guid><dc:creator>jrobbins</dc:creator><slash:comments>1</slash:comments><description>&lt;P&gt;Slowly but surely I'm getting through the list of feature requests everyone's been asking for. This release of Paraffin brings support for the trick outline by Vagmi Mudumbai (&lt;A href="http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/06/11/81426.aspx"&gt;http://geekswithblogs.net/Vagmi.Mudumbai/archive/2006/06/11/81426.aspx&lt;/A&gt;) of allowing minor upgrades (AKA patches) to remove files by setting the transitive bit on the component and adding a conditional element that evaluates to false. &lt;/P&gt;&lt;PRE style="FONT-FAMILY:consolas;"&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Component&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;comp_F5B392C05B5249C2AB34810BE4A6163F&lt;/SPAN&gt;"&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Guid&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;FD9D7BF4-550A-47E2-85A3-634D77F609FB&lt;/SPAN&gt;"&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Transitive&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;yes&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;File&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;file_81DD236ED61B4BBEB445FAB9E9C2DAB2&lt;/SPAN&gt;"&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Checksum&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;yes&lt;/SPAN&gt;"&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;KeyPath&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;yes&lt;/SPAN&gt;"&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;Source&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;.\Temp\a.exe&lt;/SPAN&gt;"&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Condition&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;1&amp;nbsp;=&amp;nbsp;0&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Condition&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:#a31515;"&gt;Component&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;So if you need to delete A.EXE on a minor upgrade, delete A.EXE from disk and run Paraffin with the new –PatchUpdate switch. The output .PARAFFIN file will have the following in it for A.EXE&lt;/P&gt;
&lt;P&gt;Those of you who've looked at Vagmi's trick are wondering about the other piece that needs to be there; the file. But you deleted the file. If you build with WiX, you'll get an error because the File element must point to a file to put in the output .MSP. To keep the patch file small, you should have a zero byte file called A.EXE to make everything work. 
&lt;P&gt;Fortunately, Paraffin has you covered there as well. When you specify the –PatchUpdate switch, you can add the new –PatchCreateFiles switch and Paraffin will create the zero byte files for you. Don't worry, when you rerun Paraffin again with –PatchUpdate, if the zero byte file is there, Paraffin checks if the Transitive attribute is set and makes sure to keep everything straight.&lt;/P&gt;
&lt;P&gt;While you could keep those zero byte files in your version control system, which seems a little odd to me since they are, well, no longer needed. Because Paraffin knows which files have been deleted with the Transitive attribute on the Component element you can recreate the zero byte files at any time by using –PatchUpdate file.wxs as the command line. The idea is that you'll run this as part of your build so you never have to worry about those zero byte files.&lt;/P&gt;
&lt;P&gt;While I believe major upgrades are really the way to go since they are much easier to manage, I know a lot of you using Paraffin are doing minor upgrades. Hopefully this will make your WiX life a little easier.&lt;/P&gt;
&lt;P&gt;A second new feature I added is the –ReportIfDifferent switch. Several people told me they wanted a way they could tell if when updating, through –Update (for major upgrades) and the new –PatchUpdate switch, if the output .PARAFFIN file was different than the input file. As one person told me they wanted to run the update during a build and if the files were different, to fail the build in case someone forgot to update the .WXS file to reflect changes. With –ReportIfDifferent, the exit code for Paraffin will be four if the input .WXS and output .PARAFFIN files are different. If they are the same, the exit code is zero.&lt;/P&gt;
&lt;P&gt;I did remove a feature from Paraffin, support for multiple files per component. All the people I talked to using Paraffin were using one file per component because it offers better resiliency with Windows Installer. By removing this support, it made my development life easier as well. If you need multiple files per component support, keep using Paraffin 3.13 (&lt;A href="http://www.wintellect.com/CS/files/folders/8198/download.aspx"&gt;http://www.wintellect.com/CS/files/folders/8198/download.aspx&lt;/A&gt;). &lt;/P&gt;
&lt;P&gt;Another change for upgraders is I changed to adding the KeyPath on the File element instead of the Component element. If you use Paraffin 3.5 to update a .WXS file created with a previous version of Paraffin, I swap the attributes around. &lt;/P&gt;
&lt;P&gt;While I never cared what you did with Paraffin or its source code, not having a license in the download was freaking out many of your lawyers. Without legal language somewhere lawyers head's explode. I threw in the CPL license file to make your life easier. However, I still don't care what you do with the code. All I ask is that you let me know about any bugs you find or features you want in Paraffin.&lt;/P&gt;
&lt;P&gt;Here's the list of minor changes I made in Paraffin 3.5.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Added a Zen of Paraffin document to help explain how to best use Paraffin.&lt;/LI&gt;
&lt;LI&gt;Added the -verbose command line option for verbose output.&lt;/LI&gt;
&lt;LI&gt;Now the DiskId attribute is only added if the value is not the default of 1.&lt;/LI&gt;
&lt;LI&gt;Refactored the code into three different files for ease of development.&lt;/LI&gt;
&lt;LI&gt;Removed deprecated command line switches and the code reporting their usage.&lt;/LI&gt;
&lt;LI&gt;Warnings are written in yellow text and errors are now written in red.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Here's the program and the source: &lt;A href="http://www.wintellect.com/CS/files/folders/18310/download.aspx"&gt;http://www.wintellect.com/CS/files/folders/18310/download.aspx&lt;/A&gt;&lt;SPAN style="COLOR:#1f497d;"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=18336" width="1" height="1"&gt;</description></item><item><title>Fluent Validation with MEF and PRISM</title><link>http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/27/fluent-validation-with-mef-and-prism.aspx</link><pubDate>Fri, 27 Aug 2010 18:39:01 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:18273</guid><dc:creator>C#er : IMage</dc:creator><slash:comments>0</slash:comments><description>Validation is a topic that comes up quite frequently. One concern is how to honor DRY (don't repeat yourself) principles and create a framework that is reusable across layers. There are some very robust and tested frameworks out there, but sometimes they might be more than what you are looking for. In this post, I'll show you how to build a standalone validation library that can be shared between Silverlight and the server, then integrated via MEF and PRISM for fluent validation. Rules and Violations...(&lt;a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/27/fluent-validation-with-mef-and-prism.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=18273" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/prism/default.aspx">prism</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/mvvm/default.aspx">mvvm</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/validation/default.aspx">validation</category></item><item><title>Visual Studio debugging of GPU parallel algorithms</title><link>http://www.wintellect.com/CS/blogs/writscher/archive/2010/08/24/visual-studio-debugging-of-gpu-parallel-algorithms.aspx</link><pubDate>Tue, 24 Aug 2010 20:04:33 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:18211</guid><dc:creator>writscher</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;By now you've probably heard of the steady march toward multiple CPUs in your computer. First there were two core CPU's and then a few months later there was four core ones available. The number keeps growing, with Intel predicting 80 core within a few years.&lt;/p&gt;  &lt;p&gt;Naturally the development world looked at multiple cores and started thinking about how to write parallel algorithms. But some developers took a side road to completely different parallel programming world. These developers realized that there was another processing unit on most computers that had vastly more parallel processing power. I'm talking about your computers graphic processor unit (GPU).&lt;/p&gt;  &lt;p&gt;Modern GPUs are designed to apply parallel algorithms to pixels. The pixel information is just byte data so some smart people figured that the GPU might be good at certain non-graphic algorithms. It turns out they were right. There are problems that lend themselves to running on the GPU. These include financial, bioscience and cryptography problems.&lt;/p&gt;  &lt;p&gt;NVIDIA is a big player in the GPU world and they took notice of this new development. And they decided to enhance the market by creating specialized development tools. Here's what I find interesting; NVIDIA decided to build a Visual Studio extension to permit multi-threaded, parallel debugging for these new GPU applications.&lt;/p&gt;  &lt;p&gt;In July 2010 NVIDIA released a free edition of a tool called Parallel Nsight. &lt;a href="http://developer.nvidia.com/object/nsight.html"&gt;http://developer.nvidia.com/object/nsight.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Quote from NVIDIA site&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;What could you do with your application running 5 – 50 times faster? Develop an &lt;a href="http://www.nvidia.com/object/cuda_medical.html"&gt;innovative approach to cancer detection&lt;/a&gt;? Analyze &lt;a href="http://www.nvidia.com/object/cuda_finance.html"&gt;financial options in real-time&lt;/a&gt;? Discover &lt;a href="http://www.nvidia.com/object/cuda_energy.html"&gt;hidden oil reserves&lt;/a&gt;? Create &lt;a href="http://www.nvidia.com/object/physx_new.html"&gt;award winning game physics&lt;/a&gt;? Process HD video &lt;a href="http://www.nvidia.com/object/adobe_PremiereproCS5.html"&gt;to allow your customers to meet deadlines&lt;/a&gt;? Our partners are doing all of the above, and more.       &lt;br /&gt;The power of GPU Computing is already delivering game changing performance increases to the Medical, Finance, Energy, Consumer and Research fields. For over 1,000 customer stories, visit &lt;a href="http://www.nvidia.com/cuda"&gt;www.nvidia.com/cuda&lt;/a&gt;.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This tool integrates within Visual Studio 2008 SP1. According to NVIDIA they will have a working version for Visual Studio 2010 by the end of the year.&lt;/p&gt;  &lt;p&gt;Nsight includes approximately ten tools that simplify debugging, profiling an integrated build tools. It fully exploits the Visual Studio debugging Windows.&lt;/p&gt;  &lt;p&gt;I still find it fascinating what we can do with computers.&lt;/p&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=18211" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/writscher/archive/tags/Graphics/default.aspx">Graphics</category><category domain="http://www.wintellect.com/CS/blogs/writscher/archive/tags/GPU/default.aspx">GPU</category></item><item><title>Coroutines for Asynchronous Sequential Workflows using Reactive Extensions (Rx)</title><link>http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/22/coroutines-for-asynchronous-sequential-workflows-using-reactive-extensions-rx.aspx</link><pubDate>Sun, 22 Aug 2010 08:43:00 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:18163</guid><dc:creator>C#er : IMage</dc:creator><slash:comments>1</slash:comments><description>I've been doing quite a bit with Reactive Extensions (Rx) for Silverlight lately. One idea that I keep exploring is the concept of creative intuitive sequential workflows for asynchronous operations. You can read about my explorations using Wintellect's own Power Threading Library in this post along with a simple solution using an interface and enumerators in part 2 of that series. I'm tackling the problem from a different angle. First, my disclaimers: this is more of an exploratory, "Here's what...(&lt;a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/22/coroutines-for-asynchronous-sequential-workflows-using-reactive-extensions-rx.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=18163" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/MEF/default.aspx">MEF</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/Managed+Extensibility+Framework/default.aspx">Managed Extensibility Framework</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/asynchronous/default.aspx">asynchronous</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/coroutine/default.aspx">coroutine</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/reactive+extensions/default.aspx">reactive extensions</category></item><item><title>Still seats available in the upcoming Wintellect WPF virtual class</title><link>http://www.wintellect.com/CS/blogs/writscher/archive/2010/08/20/still-seats-available-in-the-upcoming-wintellect-wpf-virtual-class.aspx</link><pubDate>Fri, 20 Aug 2010 19:39:34 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:18155</guid><dc:creator>writscher</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Once or twice a year Wintellect offers my Windows Presentation Foundation (WPF) class as a two day virtual online class. it’s a busy two days, I cram a lot information about WPF basics into a short amount of time. it is always hard for me to decide what to include in these two days; you see I have about eight days worth of the material that I’ve written over the last couple years. Yes WPF is a big framework.&amp;#160; Anyway I put together a good two days worth of topics and the class is always a lot of fun and filled with great people asking interesting questions.&lt;/p&gt;  &lt;p&gt;We are offering the class again this summer on August 30th.&amp;#160; Looks like we still have some seats available for the class so please join me for the two days.&amp;#160;&amp;#160; I promise you’ll learn a lot about WPF and have a good time in the process.&lt;/p&gt;  &lt;p&gt;Sign up here.&lt;/p&gt;  &lt;p&gt;&lt;a title="https://www.wintellect.com/Registration/WintellectRegistration.aspx" href="https://www.wintellect.com/Registration/WintellectRegistration.aspx"&gt;https://www.wintellect.com/Registration/WintellectRegistration.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=18155" width="1" height="1"&gt;</description></item><item><title>Simplifying Silverlight Web Service Calls with Reactive Extensions (Rx)</title><link>http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/19/simplifying-silverlight-web-service-calls-with-reactive-extensions-rx.aspx</link><pubDate>Thu, 19 Aug 2010 11:10:00 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:18143</guid><dc:creator>C#er : IMage</dc:creator><slash:comments>1</slash:comments><description>I've been working with the Reactive Extensions (Rx) library quite a bit lately and am very impressed. While it is a new way of thinking about services, it certainly makes life much easier. In this example, I'll show you a way to simplify your web service calls using Rx. In fact, even if you don't use Reactive Extensions, you may benefit from the proxy wrappers that I'll describe. I'm assuming you are familiar with Silverlight, web services, and have some exposure to the Managed Extensibility Framework....(&lt;a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/19/simplifying-silverlight-web-service-calls-with-reactive-extensions-rx.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=18143" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/MEF/default.aspx">MEF</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/Managed+Extensibility+Framework/default.aspx">Managed Extensibility Framework</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/rx/default.aspx">rx</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/reactive+extensions/default.aspx">reactive extensions</category></item><item><title>Managed Extensibility Framework Quickstart: Hello, MEF</title><link>http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/17/managed-extensibility-framework-quickstart-hello-mef.aspx</link><pubDate>Tue, 17 Aug 2010 14:55:00 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:18095</guid><dc:creator>C#er : IMage</dc:creator><slash:comments>0</slash:comments><description>I've been working on quickstarts for a community team that I'm a member of. The team is called MEFContrib . We write extensions to the Managed Extensibility Framework as well as supporting manuals and documentation. I've been tasked with the quickstarts and as I release them I'll post them for you. Obviously, a quickstart should be, well, quick, and easy. We also decided quickstarts would be independent so that you can jump into any topic without having to read the prior ones. Today's post is simply...(&lt;a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/17/managed-extensibility-framework-quickstart-hello-mef.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=18095" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/MEF/default.aspx">MEF</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/Managed+Extensibility+Framework/default.aspx">Managed Extensibility Framework</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/quickstart/default.aspx">quickstart</category></item><item><title>Sharing Commands with the Managed Extensibility Framework</title><link>http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/10/sharing-commands-with-the-managed-extensibility-framework.aspx</link><pubDate>Tue, 10 Aug 2010 10:50:01 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17998</guid><dc:creator>C#er : IMage</dc:creator><slash:comments>1</slash:comments><description>View models can expose commands that are bound to controls. Commands encapsulate an action and a permission, and the advantage to binding is that controls that support commands will automatically disable when the command cannot execute. Commands can also be easily added to view models and tested. It is common to find commands that are used universally. In Windows Presentation Foundation (WPF), this is managed by a set of global commands that can be accessed via static classes. Silverlight does not...(&lt;a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/10/sharing-commands-with-the-managed-extensibility-framework.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17998" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/MEF/default.aspx">MEF</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/command/default.aspx">command</category></item><item><title>Remote Debugging Startup procedures in WPF</title><link>http://www.wintellect.com/CS/blogs/writscher/archive/2010/08/10/remote-debugging-startup-procedures-in-wpf.aspx</link><pubDate>Tue, 10 Aug 2010 05:05:17 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17979</guid><dc:creator>writscher</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This week I was debugging a problem with a WPF application.&amp;#160; Actually, it being a WPF app had little to do with the problem.&amp;#160; No, what I was testing was the installer process.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;We’re writing a new WPF frontend for an existing system and the application needs to&amp;#160; installed via a InstallShield installer.&amp;#160; It’s a legacy system and has dependencies on older systems and software.&amp;#160; For example, during the setup we install a Access 2003 mdb file into the %appdata% folder.&amp;#160;&amp;#160;&amp;#160; The installer is also supposed to install the prerequisite technologies, like .NET 4.0 and copy a files to numerous locations on the local drive.&amp;#160; Then on application start we need to dynamically find these files. Trouble was, when the app started for the first time, it immediately crashed.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;Looking through event log revealed a unhandled exception as the cause of the crash.&amp;#160; The app has an event logger, but the code didn’t seem to be running.&amp;#160; Checking the installer logs didn’t show any obvious problems either.&amp;#160; I decided it was time to turn to Visual Studio remote debugging for help.&lt;/p&gt;  &lt;h4&gt;Debugging on VPC&lt;/h4&gt;  &lt;p&gt;As you might have surmised by now, I’m testing the install on a virtual PC.&amp;#160; It’s configured with undo disks, so I can roll back the install after each try. After thinking about it for a few minutes I decided put a breakpoint in the apps Main method.&amp;#160; This is trivial in most circumstances, but I wasn’t sure how to accomplish this in my scenario.&amp;#160; I didn’t want to install VS or other debuggers on the VPC.&amp;#160; This seems like a prime use case for Visual Studio 2010 remote debugging.&lt;/p&gt;  &lt;p&gt; I won’t bore you with the steps to configure you machines to enable Remote Debugging. After about 15 minutes work I had the remote debugging working. John Robbins has a nice post &lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2010/06/15/vs-remote-debugging-across-workgroups-or-domains.aspx"&gt;about setting up Remote Debugging&lt;/a&gt; [1] on a local Virtual PC if you want to create a similar setup.&amp;#160; &lt;/p&gt;  &lt;h4&gt;How to hit breakpoint in Main method&lt;/h4&gt;  &lt;p&gt;Normally the way you remote debug it to start the msvsmon.exe on the VPC (be sure and run as administrator), then launch the app.&amp;#160; Once the app is running, you return to Visual Studio and choose &lt;strong&gt;Debug\Attach to Process,&lt;/strong&gt; then pick your instance of msvsmon and choose the remote process. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wintellect.com/CS/blogs/writscher/image_578590EB.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.wintellect.com/CS/blogs/writscher/image_thumb_5085DE66.png" width="400" height="293" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;But thing are a little tricky here. Do you see the problem with that approach?&amp;#160; Yes, by the time you get the app running and return to Visual Studio your program is long past executing the code in the Main method and other startup methods. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;My solution, put a 30 second Thread.Sleep in the Main method.&amp;#160; That gave me time to switch back to the other screen and get the debugger attached.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;  App &lt;/span&gt;app = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;App&lt;/span&gt;();
  &lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;.Sleep(1000 * 30);&lt;br /&gt;  .. breakpoint here
  app.MainWindow = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MainWindow&lt;/span&gt;();
  app.MainWindow.Show();
 &lt;/pre&gt;

&lt;pre class="code"&gt;  app.Run();&lt;/pre&gt;

&lt;p&gt;It worked perfectly, I was able to trace the&amp;#160; problem to a typo in the installer.&amp;#160; I’m sure there are approaches to take however.&amp;#160; Do you have a favorite technique?&lt;/p&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[1] &lt;a title="http://www.wintellect.com/CS/blogs/jrobbins/archive/2010/06/15/vs-remote-debugging-across-workgroups-or-domains.aspx" href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2010/06/15/vs-remote-debugging-across-workgroups-or-domains.aspx"&gt;http://www.wintellect.com/CS/blogs/jrobbins/archive/2010/06/15/vs-remote-debugging-across-workgroups-or-domains.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17979" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/writscher/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Spending Time with my LG Windows Phone 7 “Developer” Device</title><link>http://www.wintellect.com/CS/blogs/writscher/archive/2010/08/06/spending-time-with-my-lg-windows-phone-7-developer-device.aspx</link><pubDate>Fri, 06 Aug 2010 07:29:48 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17881</guid><dc:creator>writscher</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Tuesday morning started out good.&amp;#160; I was in a meeting room on the Microsoft campus, working on a Windows Phone 7 (wp7) application.&amp;#160; About 10:A.M. my local developer evangelist came to the room.&amp;#160; In his hand was a white and yellow box that contained my new Windows Phone.&amp;#160; Yes, I’m talking about a wp7 device made by LG.&amp;#160; The GW 910 is a phone that contains a slide out keyboard.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wintellect.com/CS/blogs/writscher/image_422DB54B.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.wintellect.com/CS/blogs/writscher/image_thumb_6AE91A94.png" width="305" height="238" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I’ve had the phone for three days now.&amp;#160; First impressions are good, the start screen was intuitive and easy to use.&amp;#160; I toured the included applications.&amp;#160; There aren’t that many, but the core ones look solid.&amp;#160; It’s a novelty to open Microsoft Excel and see the tiny spreadsheet.&amp;#160; Pinch gestures work, so it is easy to scale the cells up to a readable size.&lt;/p&gt;  &lt;p&gt;It took me a while to learn how to uninstall applications.&amp;#160; On the wp7 you press and hold the application icon.&amp;#160; After a one second wait a menu pops up which contains the uninstall menu.&amp;#160; &lt;/p&gt;  &lt;p&gt;There are still pending changes coming for the main UI.&amp;#160; Those changes are still cloaked however, you’ll need to wait a few weeks to see what’s new.&lt;/p&gt;  &lt;p&gt;I didn’t like the keyboard, I prefer the one on my HTC Touch Pro 2.&amp;#160; One the other hand, the onscreen keyboard (known as the Soft Input Panel -SIP) was fast and easy to use, once I got use to the correct way to hold my finger in relation to the virtual keys.&lt;/p&gt;  &lt;p&gt;Another hardware #fail, the touch screen is not sensitive enough.&amp;#160; I find myself touching the same icon/button repeatedly with no results.&amp;#160; This is definitely a LG issue.&amp;#160; I spent some time with the Samsung device on Wednesday and its screen was smooth and responsive. Oh, and the Samsung was noticeably faster too.&lt;/p&gt;  &lt;h3&gt;Writing and deploying apps to the phone&lt;/h3&gt;  &lt;p&gt;If you are a Silverlight developer you are going to love programming for this phone.&amp;#160;&amp;#160; Silverlight just works. Most of the time your code can be ported directly to the phone.&amp;#160; It took me less than than ten minutes to port a Bing Map demo to the phone. The only quirks are understanding what Silverlight version is on the phone. It is part Silverlight 3, some of Silverlight 4 and some extra APIs thrown in for good measure.&lt;/p&gt;  &lt;p&gt;Setting up your computer to use the deploy to the phone takes a few steps.&amp;#160; First, you must install all the wp7 tools and Beta SDK.&amp;#160; (learn more at &lt;a title="http://developer.windowsphone.com/" href="http://developer.windowsphone.com/"&gt;http://developer.windowsphone.com/&lt;/a&gt;)&amp;#160; Then you have to install the Zune Beta (aka Dorado) on your local computer.&amp;#160; Once that is done, you just connect a USB cable,make sure the Zune software is running on local computer, choose the device from the drop down in Visual Studio and press F5 to debug.&amp;#160; It’s a beautiful experience.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wintellect.com/CS/blogs/writscher/image_770A94BB.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.wintellect.com/CS/blogs/writscher/image_thumb_3D1B51CF.png" width="210" height="99" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17881" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/writscher/archive/tags/Windows+Phone+7/default.aspx">Windows Phone 7</category></item><item><title>Wintellect &amp; devLink2010</title><link>http://www.wintellect.com/CS/blogs/bvananda/archive/2010/08/05/wintellect-devlink2010.aspx</link><pubDate>Thu, 05 Aug 2010 15:02:00 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17854</guid><dc:creator>bvananda</dc:creator><slash:comments>0</slash:comments><description>&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;SPAN style="LINE-HEIGHT:115%;FONT-SIZE:12pt;mso-bidi-font-size:11.0pt;"&gt;&lt;FONT face=Calibri&gt;I am in Nashville this week for the 5&lt;SUP&gt;th&lt;/SUP&gt; annual devLink Technical Conference (&lt;/FONT&gt;&lt;/SPAN&gt;&lt;A href="http://www.devlink.net/"&gt;&lt;SPAN style="LINE-HEIGHT:115%;FONT-SIZE:12pt;mso-bidi-font-size:11.0pt;"&gt;&lt;FONT face=Calibri&gt;www.devlink.net&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="LINE-HEIGHT:115%;FONT-SIZE:12pt;mso-bidi-font-size:11.0pt;"&gt;&lt;FONT face=Calibri&gt;). This is my first devLink and I am very excited about this week and getting to chat with all of the folks who are attending.&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/SPAN&gt;So if you’re at the event be sure to stop by our table to say "hi". We will be raffling off some cool prizes that you won't want to miss.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;SPAN style="LINE-HEIGHT:115%;FONT-SIZE:12pt;mso-bidi-font-size:11.0pt;"&gt;&lt;FONT face=Calibri&gt;We also wanted to show our love for the developer community and we are really excited to be teaming up with our friends at &lt;/FONT&gt;&lt;/SPAN&gt;&lt;A href="http://www.infragistics.com/"&gt;&lt;SPAN style="LINE-HEIGHT:115%;FONT-SIZE:12pt;mso-bidi-font-size:11.0pt;"&gt;&lt;FONT face=Calibri&gt;Infragistics&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="LINE-HEIGHT:115%;FONT-SIZE:12pt;mso-bidi-font-size:11.0pt;"&gt;&lt;FONT face=Calibri&gt; to treat 10 developers attending devLink to a night out at the movies. For every person who “Likes” &lt;/FONT&gt;&lt;/SPAN&gt;&lt;A href="http://www.facebook.com/#!/pages/Knoxville-TN/Wintellect/55768437629?ref=ts&amp;amp;__a=8&amp;amp;ajaxpipe=1"&gt;&lt;SPAN style="LINE-HEIGHT:115%;FONT-SIZE:12pt;mso-bidi-font-size:11.0pt;"&gt;&lt;FONT color=#0000ff face=Calibri&gt;Wintellect&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="LINE-HEIGHT:115%;FONT-SIZE:12pt;mso-bidi-font-size:11.0pt;"&gt;&lt;FONT face=Calibri&gt; &amp;amp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;A href="http://www.facebook.com/pages/Infragistics/23425186508"&gt;&lt;SPAN style="LINE-HEIGHT:115%;FONT-SIZE:12pt;mso-bidi-font-size:11.0pt;"&gt;&lt;FONT face=Calibri&gt;Infragisitcs&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="LINE-HEIGHT:115%;FONT-SIZE:12pt;mso-bidi-font-size:11.0pt;"&gt;&lt;FONT face=Calibri&gt; on Facebook and post’s “Take me to the movies!” on each of our Facebook walls they will be entered into a contest where we will randomly select 10 folks to win a Regal Cinemas gift card! On Saturday each company will randomly select 5 winners. Post on both Infragistics &amp;amp; Wintellect to double your chances of winning.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;SPAN style="LINE-HEIGHT:115%;FONT-SIZE:12pt;mso-bidi-font-size:11.0pt;"&gt;&lt;FONT face=Calibri&gt;But wait there’s more, each day; Wintellect &amp;amp; Infragistics will give away a big prize pack that includes: a copy of Jeffrey Richter’s &lt;B style="mso-bidi-font-weight:normal;"&gt;&lt;I style="mso-bidi-font-style:normal;"&gt;CLR Via C#, Third Edition &lt;/I&gt;&lt;/B&gt;book, Infragistics NetAdvantage for .NET, NETAdvantage for Silverlight Data Visualization, &amp;amp; NetAdvantage Icons. On Saturday, we’ll give away a Kindle Dx and a $50 Amazon.com gift card! &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17854" width="1" height="1"&gt;</description></item><item><title>Unit Testing XAML Data-Bindings in Silverlight</title><link>http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/05/unit-testing-xaml-data-bindings-in-silverlight.aspx</link><pubDate>Thu, 05 Aug 2010 09:46:03 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17853</guid><dc:creator>C#er : IMage</dc:creator><slash:comments>0</slash:comments><description>In an interview earlier this year with MSDN geekSpeak , I discussed unit testing for Silverlight and some of the frameworks that are available. One audience member raised a very important question: "How do we test the XAML?" Specifically, what happens when we hand off XAML to a designer or another developer, and they accidently remove a data-binding or other critical element, then pass it back to us? The Problem Many developers don't realize this, but the view is not decoupled from the underlying...(&lt;a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/05/unit-testing-xaml-data-bindings-in-silverlight.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17853" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/xaml/default.aspx">xaml</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/silverlight/default.aspx">silverlight</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/unit+testing/default.aspx">unit testing</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/mocking/default.aspx">mocking</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/silverlight+unit+test/default.aspx">silverlight unit test</category></item><item><title>Using Reactive Extensions (Rx) to Simplify Asynchronous Tests</title><link>http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/03/using-reactive-extnesions-rx-to-simplify-asynchronous-tests.aspx</link><pubDate>Tue, 03 Aug 2010 11:11:00 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17773</guid><dc:creator>C#er : IMage</dc:creator><slash:comments>1</slash:comments><description>Reactive Extensions (Rx) is a product from Microsoft Research that simplifies the management and composition of asynchronous events. If you read my earlier post on Asynchronous Workflows , you'll understand why the asynchronous programming model can sometimes lead to confusing and hard-to-maintain code. There is nothing wrong with the model, but the fact that you must subscribe to an event or register a callback means your code can end up nested and scattered to the winds. Add to that the complexity...(&lt;a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2010/08/03/using-reactive-extnesions-rx-to-simplify-asynchronous-tests.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17773" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/silverlight+unit+test/default.aspx">silverlight unit test</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/rx/default.aspx">rx</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/reactive+extensions/default.aspx">reactive extensions</category></item><item><title>Changing Hardware can Invalidate your Expression Blend License</title><link>http://www.wintellect.com/CS/blogs/writscher/archive/2010/07/27/changing-hardware-can-invalidate-your-expression-blend-license.aspx</link><pubDate>Tue, 27 Jul 2010 06:51:37 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17368</guid><dc:creator>writscher</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Do software crises ever happen when you have plenty of free time to troubleshoot them?&amp;#160; I’m sure that they do,&amp;#160; it just doesn’t seem that way for me in the last few years.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Expression Blend Warning&lt;/h4&gt;  &lt;p&gt;The first sign of trouble appeared as a gentle nag screen in Expression Blend 4.&amp;#160; “Only 2 days left to activate your license” it whispered to me one morning. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;“What the heck?” I thought to myself.&amp;#160; I knew that I had activated the license months ago.&amp;#160; Just to be sure, I looked it up.&amp;#160; Yes, about a week after I installed Expression Blend I had requested a license key from MSDN and activated my copy.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Re-Activate&lt;/h4&gt;  &lt;p&gt;So I found my copy of the key and reactivated the license.&amp;#160;&amp;#160; This is where it’s starts to get strange.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Side Note: Some of the text is cut-off in these screen shots.&amp;#160; This is _another_ issue with Blend.&amp;#160;&amp;#160; I’m running my computer in 115% DPI settings.&amp;#160; Apparently non default DPI settings still cause problems like this.&amp;#160; I thought the Device Independent Pixel framework in WPF took care of this.&amp;#160; I guess not.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wintellect.com/CS/blogs/writscher/image_09DEEA20.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.wintellect.com/CS/blogs/writscher/image_thumb_404C49CA.png" width="350" height="534" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Starting the activation process.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wintellect.com/CS/blogs/writscher/image_14D80303.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.wintellect.com/CS/blogs/writscher/image_thumb_3C6E5960.png" width="350" height="122" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;First error during the activation.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wintellect.com/CS/blogs/writscher/image_3181524B.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.wintellect.com/CS/blogs/writscher/image_thumb_4F132D4A.png" width="350" height="319" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Blend offers to retry.&amp;#160; I try again.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wintellect.com/CS/blogs/writscher/image_4C1DC897.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.wintellect.com/CS/blogs/writscher/image_thumb_05542F8D.png" width="350" height="400" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Good news, or so I think.&amp;#160; Activation success.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wintellect.com/CS/blogs/writscher/image_1AEE682A.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.wintellect.com/CS/blogs/writscher/image_thumb_181B3706.png" width="350" height="527" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Hmm. that’s not right.&amp;#160; I just activated the software.&amp;#160; Apparently the success message is wrong and I do not have a valid license yet.&lt;/p&gt;  &lt;h4&gt;Blend team members help troubleshoot&lt;/h4&gt;  &lt;p&gt;I contacted the Blend team and they put some of their licensing developers on the problem.&amp;#160;&amp;#160; I ran some license checking software and sent the results to them to analyze.&amp;#160; And they found the problem.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Here’s the question from Chris that put me on the right track.&lt;/p&gt;  &lt;p&gt;“Have you made any changes to your machine??&amp;#160; (Replaced a DVD/CD drive or network card??). “&lt;/p&gt;  &lt;p&gt;Hmm. now that you mention it I have.&amp;#160; Dell replaced my motherboard a couple weeks ago.&amp;#160; Yesterday, I replaced my hard drive.&amp;#160; And yesterday is when the problem started.&lt;/p&gt;  &lt;p&gt;Back from Chris comes this simple sentence .“The license software sees the change in hardware as an attempt to get around the software licensing.”&lt;/p&gt;  &lt;p&gt;Bingo, now we know the problem.&lt;/p&gt;  &lt;h4&gt;Changing hardware may void your license&lt;/h4&gt;  &lt;p&gt;Expression Blend is not the first product from Microsoft to use this type of licensing policy.&amp;#160;&amp;#160; What’s surprising is that all my other Microsoft software on this same computer is happily working without the slightest hint of trouble.&lt;/p&gt;  &lt;p&gt;So, what is the resolution you ask?&amp;#160; I need to get a new key from MSDN.&amp;#160; Unfortunately, my subscription only grants me three activations and apparently I’ve already used them all (VPC installs?).&amp;#160; Time to call Microsoft support and plead my case.&lt;/p&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17368" width="1" height="1"&gt;</description></item><item><title>Silverlight UI Automation Testing using Prism 4.0</title><link>http://www.wintellect.com/CS/blogs/jlikness/archive/2010/07/26/silverlight-ui-automation-testing-using-prism-4-0.aspx</link><pubDate>Mon, 26 Jul 2010 15:51:04 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17351</guid><dc:creator>C#er : IMage</dc:creator><slash:comments>0</slash:comments><description>One popular gripe about Silverlight has been the lack of integrated testing tools. There are several types of tests you may perform against a software project. Unit tests can be performed with the aid of the Silverlight Unit Testing Framework and automated with a third-party tool such as StatLight . Automation testing involves hosting the actual Silverlight application in a browser and performing a walkthrough based on a script. Typically, this script will follow a "happy path" through the application,...(&lt;a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2010/07/26/silverlight-ui-automation-testing-using-prism-4-0.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17351" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/prism/default.aspx">prism</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/silverlight/default.aspx">silverlight</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/automated+testing/default.aspx">automated testing</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/ui+automation/default.aspx">ui automation</category></item><item><title>Using Hints for Generic MEF Exports</title><link>http://www.wintellect.com/CS/blogs/jlikness/archive/2010/07/25/using-hints-for-generic-mef-exports.aspx</link><pubDate>Sun, 25 Jul 2010 10:36:02 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17311</guid><dc:creator>C#er : IMage</dc:creator><slash:comments>0</slash:comments><description>It is very common to have base classes and interfaces that use generic types to define standard behaviors across business applications. One challenge with the Managed Extensibility Framework is that it doesn't directly support generic exports and imports: in other words, there is no way to effectively do the following: ... [ImportMany(AllowRecomposition=true)] public IService&amp;lt;,&gt;[] GenericService { get; set; } ... While there is a GenericCatalog you can use, I wanted something a little more flexible...(&lt;a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2010/07/25/using-hints-for-generic-mef-exports.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17311" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/MEF/default.aspx">MEF</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/Managed+Extensibility+Framework/default.aspx">Managed Extensibility Framework</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/locator/default.aspx">locator</category></item><item><title>The BringToFront Behavior</title><link>http://www.wintellect.com/CS/blogs/writscher/archive/2010/07/20/the-bringtofront-behavior.aspx</link><pubDate>Wed, 21 Jul 2010 01:27:56 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17121</guid><dc:creator>writscher</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Are you a WPF history buff? If so you might be familiar with the attached behaviors story. It’s a short saga, but worthy of review. Back in the early days of WPF we were learning the nuances of the new XAML system. The attached property system was an interesting subsystem of WPF, revealing a clever way to add a property to an unrelated object. A few of the XAML pioneers decide to extend this idea to behavior. Their idea was to define a behavior (code) in a class, register it with the Dependency System and then ‘attach’ the behavior to other classes.&lt;/p&gt;  &lt;p&gt;The idea had merit so the Expression Blend team brought the concept into Blend 3. They created a sub-classable type called System.Windows.Interactivity.Behavior&amp;lt;UIElement&amp;gt;, which makes it simple to create custom attached behaviors.&lt;/p&gt;  &lt;p&gt;I’m constantly thinking of ideas for new behaviors, here’s one for moving an object to the front of the other items in a Panel.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;BringToFrontBehavior &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;Behavior&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Panel&lt;/span&gt;&amp;gt;
  {
    &lt;span style="color:blue;"&gt;protected override void &lt;/span&gt;OnAttached()
    {
      &lt;span style="color:blue;"&gt;base&lt;/span&gt;.OnAttached();
      AssociatedObject.Loaded += &lt;br /&gt;           &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RoutedEventHandler&lt;/span&gt;(AssociatedObject_Loaded);
    }

    &lt;span style="color:blue;"&gt;void &lt;/span&gt;AssociatedObject_Loaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;RoutedEventArgs &lt;/span&gt;e)
    {
      &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;child &lt;span style="color:blue;"&gt;in &lt;/span&gt;AssociatedObject.Children)
      {
        child.MouseLeftButtonUp += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MouseButtonEventHandler&lt;/span&gt;(child_MouseLeftButtonUp);
      }
    }

    &lt;span style="color:blue;"&gt;void &lt;/span&gt;child_MouseLeftButtonUp(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;MouseButtonEventArgs &lt;/span&gt;e)
    {
      BringToFront(sender);
    }

    &lt;span style="color:green;"&gt;// call this method to move element to front of ZIndex
    &lt;/span&gt;&lt;span style="color:blue;"&gt;private void &lt;/span&gt;BringToFront(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender)
    {
      &lt;span style="color:#2b91af;"&gt;Panel &lt;/span&gt;parent = (&lt;span style="color:#2b91af;"&gt;Panel&lt;/span&gt;)((&lt;span style="color:#2b91af;"&gt;FrameworkElement&lt;/span&gt;)sender).Parent;

      &lt;span style="color:blue;"&gt;int &lt;/span&gt;z = GetHighestValue(parent);

      &lt;span style="color:blue;"&gt;for &lt;/span&gt;(&lt;span style="color:blue;"&gt;int &lt;/span&gt;i = 0; i &amp;lt; parent.Children.Count; i++)
      {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(sender.Equals(parent.Children[i]))
        {
          parent.Children[i].SetValue(&lt;span style="color:#2b91af;"&gt;Canvas&lt;/span&gt;.ZIndexProperty, z);
        }
      }
    }

    &lt;span style="color:blue;"&gt;private int G&lt;/span&gt;etHighestValue(&lt;span style="color:#2b91af;"&gt;Panel &lt;/span&gt;parent)
    {
      &lt;span style="color:blue;"&gt;int &lt;/span&gt;highest = 0;
      &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;child &lt;span style="color:blue;"&gt;in &lt;/span&gt;parent.Children)
      {
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;val = (&lt;span style="color:blue;"&gt;int&lt;/span&gt;)child.GetValue(&lt;span style="color:#2b91af;"&gt;Canvas&lt;/span&gt;.ZIndexProperty);
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(val &amp;gt; highest)
        {
          highest = val;
        }
        child.SetValue(&lt;span style="color:#2b91af;"&gt;Canvas&lt;/span&gt;.ZIndexProperty, val - 1);
      }
      &lt;span style="color:blue;"&gt;return &lt;/span&gt;highest;
    }
  }&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17121" width="1" height="1"&gt;</description></item><item><title>Sterling OODB v0.1 Alpha Released!</title><link>http://www.wintellect.com/CS/blogs/jlikness/archive/2010/07/17/sterling-oodb-v0-1-alpha-released.aspx</link><pubDate>Sat, 17 Jul 2010 10:29:02 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17074</guid><dc:creator>C#er : IMage</dc:creator><slash:comments>1</slash:comments><description>I'm please to share that I released the alpha version of the Sterling Object-Oriented Database for Silverlight 4.0 and Windows Phone 7.0 applications today. I dug into more details about the project in this introductory post . There have not been many significant changes to the source code since then, but I did create a set up project that installs the DLLs and configures the registry keys so they appear in the "add reference" dialog on the .NET tab for both Silverlight and Windows Phone 7 applications....(&lt;a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2010/07/17/sterling-oodb-v0-1-alpha-released.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17074" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/silverlight/default.aspx">silverlight</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/silverlight+4/default.aspx">silverlight 4</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/windows+phone+7+series/default.aspx">windows phone 7 series</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/sterling/default.aspx">sterling</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/OODB/default.aspx">OODB</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/windows+phone+7/default.aspx">windows phone 7</category></item><item><title>Building a component that works with different versions of a library–STATIC METHODS</title><link>http://www.wintellect.com/CS/blogs/jeffreyr/archive/2010/07/16/building-a-component-that-works-with-different-versions-of-a-library-static-methods.aspx</link><pubDate>Fri, 16 Jul 2010 13:10:00 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:16902</guid><dc:creator>JeffreyR</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;In my previous &lt;a href="http://www.wintellect.com/CS/blogs/jeffreyr/archive/2010/07/09/building-a-component-that-works-with-different-versions-of-a-library.aspx"&gt;blog post&lt;/a&gt;, I discussed how to build a .NET component that works with different versions of a particular library. In that post, I demonstrated a technique for accessing instance methods that get added in a later version of a library. In this post, I’ll modify the technique some to make it work reasonably well for static methods that get added in a later version of a library.&lt;/p&gt;  &lt;p&gt;Let’s starts by looking at Version 1.0 of some library class:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;public sealed class VersioningType {&amp;#160;&amp;#160;&amp;#160; // v1.0     &lt;br /&gt;&amp;#160;&amp;#160; // Other methods not shown      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;And, let’s say that version 2.0 of the same library class looks like this:&lt;/p&gt;  &lt;pre&gt;&lt;font size="2"&gt;public sealed class VersioningType {&amp;#160;&amp;#160;&amp;#160;&amp;#160; // v2.0&lt;br /&gt;   public static String NewStaticMethod(String arg) {// New STATIC method introduced in v2.0&lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return &amp;quot;Real static method: &amp;quot; + arg; &lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160; }&lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160; // Other methods not shown&lt;br /&gt;}&lt;/font&gt;&lt;/pre&gt;

&lt;p&gt;Now, we want to write some code in a component that calls VersioningType’s NewStaticMethod if it exists at runtime. To do this, I would add the following VersioningTypeExtensions class into my component code:&lt;/p&gt;

&lt;p&gt;&lt;font size="2" face="Courier New"&gt;internal static class VersioningTypeExtensions {
    &lt;br /&gt;&amp;#160;&amp;#160; private static dynamic s_NewStaticMethodFound =

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new StaticMemberDynamicWrapper(typeof(VersioningType));&amp;#160;&amp;#160; // Assume method exists

    &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;The stub for VersioningType's static NewStaticMethod method&amp;lt;/summary&amp;gt;

    &lt;br /&gt;&amp;#160;&amp;#160; public static String NewStaticMethod(String arg) {

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (s_NewStaticMethodFound != null) {

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try {

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // We think the method exists, try to invoke it

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return s_NewStaticMethodFound.NewStaticMethod(arg);

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; catch (RuntimeBinderException) {

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // The method doesn't exist; in the future, avoid the dynamic/exception perf hit

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; s_NewStaticMethodFound = null;

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }

    &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // This is the default implementation we want if the method doesn't exist

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return &amp;quot;Stub static&amp;#160;&amp;#160; method: &amp;quot; + arg;

    &lt;br /&gt;&amp;#160;&amp;#160; }

    &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;This code introduces a static method called NewStaticMethod that matches the same signature as the NewStaticMethod introduced in v2.0 of the library. Now, in my component’s code, I can call this static stub method and I get compile-time type safety at all the call sites. This code uses a helper class that I wrote, called StaticMemberDynamicObject. I show the code for this class at the bottom of this blog post. You construct an instance of my StaticMemberDynamicObject class by passing a type to its constructor. In short, by casting a reference to a StaticMemberDynamicObject object to C#’s dynamic type, you can invocate a type’s static methods, properties, or fields dynamically at runtime. It makes the type look like an object and this class for use with dynamic types. The StaticMemberDynamicObject class is useful in many programming scenarios.&lt;/p&gt;

&lt;p&gt;Inside VersioningTypeExtension’s NewStaticMethod stub method, I use the s_NewStaticMethodFound field (which is of the dynamic type) to &lt;i&gt;try&lt;/i&gt; to call VersioninType’s static NewStaticMethod. If our component is running against v2.0 of the library, then its NewStaticeMethod will be invoked. But, if our component is running against v1.0 of the library, then attempting to call NewStaticMethod will throw a RuntimeBinderException. My stub method catches this exception, sets the static field to null and then my code that simulates the default behavior of this method. In this case, I return a string indicating that my stub method handled the call. &lt;/p&gt;

&lt;p&gt;The static s_NewStaticMethodFound field exists to improve performance. Once the stub determines that VersioningType doesn’t offer the desired method, this field is set to null and future invocations of the stub method avoid the performance hit of entering/leaving a try block, attempting to dynamically invoke the NewStaticMethod and the performance hit of processing the thrown RuntimeBinderException. In addition, the StaticMemberDynamicObject object can be garbage collected now.&lt;/p&gt;

&lt;p&gt;If in the future, we decide that our component no longer needs to work with v1.0 of the library, we can build our component code against v2.0 of the library and we can leave all our code alone and it will just suffer a slight performance penalty whenever calling NewStaticMethod. Or, we can delete our stub method and then modify all of the call sites to call VersioningType’s static NewStaticMethod method directly.&lt;/p&gt;

&lt;p&gt;The instance method technique shown in my previous blog posting used C#’s extension methods to implement the stub. This had two significant benefits. First, the code at the call site looked just like the code you would have to call the instance method meaning that no source code would have to change in order to call the V2.0 library. Second, if we build the component against v2.0 of the library, then the compiler would bind to the instance method instead of the extension method resulting in a performance improvement by not calling the stub method. Unfortunately, we don’t get these benefits with static methods because extension methods don’t allow you to extend a type with a static method. Extension methods can only extend objects with instance methods. &lt;/p&gt;

&lt;p&gt;Below is the code for my useful StaticMemberDynamicObject class that allows you to dynamically invoke static members of a type. This class is derived from the .NET Framework’s System.Dynamic.DynamicObject class which allows instance of the class to control how its members are invoked when invoked using C#’s dynamic type. &lt;/p&gt;

&lt;p&gt;&lt;font size="2" face="Courier New"&gt;/// &amp;lt;summary&amp;gt;Construct an instance of this class and cast the reference to 'dynamic'&amp;#160; &lt;br /&gt;/// to dynamically invoke a type's static members&amp;lt;/summary&amp;gt;

    &lt;br /&gt;internal sealed class StaticMemberDynamicWrapper : DynamicObject {

    &lt;br /&gt;&amp;#160;&amp;#160; private const BindingFlags c_bf = BindingFlags.Public | BindingFlags.Static;

    &lt;br /&gt;&amp;#160;&amp;#160; private readonly Type m_type;

    &lt;br /&gt;&amp;#160;&amp;#160; public StaticMemberDynamicWrapper(Type type) { m_type = type; }

    &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160; public override IEnumerable&amp;lt;String&amp;gt; GetDynamicMemberNames() {

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return m_type.GetMembers(c_bf).Select(mi =&amp;gt; mi.Name);

    &lt;br /&gt;&amp;#160;&amp;#160; }

    &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160; public override bool TryGetMember(GetMemberBinder binder, out object result) {

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var members = m_type.GetMember(binder.Name, MemberTypes.Field | MemberTypes.Property, c_bf);

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (members.Length != 1) { result = null; return false; }

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; result = (members[0].MemberType == MemberTypes.Field)&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ? ((FieldInfo)members[0]).GetValue(null)&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : ((PropertyInfo)members[0]).GetValue(null, null);

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return true;

    &lt;br /&gt;&amp;#160;&amp;#160; }

    &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160; public override bool TrySetMember(SetMemberBinder binder, object value) {

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var members = m_type.GetMember(binder.Name, MemberTypes.Field | MemberTypes.Property, c_bf);

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (members.Length != 1) return false;

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (members[0].MemberType == MemberTypes.Field)

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((FieldInfo)members[0]).SetValue(null, value);

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((PropertyInfo)members[0]).SetValue(null, value, null);

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return true;

    &lt;br /&gt;&amp;#160;&amp;#160; }

    &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160; public override Boolean TryInvokeMember(InvokeMemberBinder binder,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Object[] args, out Object result) {

    &lt;br /&gt;

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MethodInfo method = m_type.GetMethod(binder.Name, c_bf);

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (method == null) { result = null; return false; }

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; result = method.Invoke(null, args);

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return true;

    &lt;br /&gt;&amp;#160;&amp;#160; }

    &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=16902" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jeffreyr/archive/tags/Jeffrey+Richter/default.aspx">Jeffrey Richter</category><category domain="http://www.wintellect.com/CS/blogs/jeffreyr/archive/tags/jeffrey/default.aspx">jeffrey</category><category domain="http://www.wintellect.com/CS/blogs/jeffreyr/archive/tags/richter/default.aspx">richter</category><category domain="http://www.wintellect.com/CS/blogs/jeffreyr/archive/tags/dynamic/default.aspx">dynamic</category><category domain="http://www.wintellect.com/CS/blogs/jeffreyr/archive/tags/extension+methods/default.aspx">extension methods</category><category domain="http://www.wintellect.com/CS/blogs/jeffreyr/archive/tags/version/default.aspx">version</category><category domain="http://www.wintellect.com/CS/blogs/jeffreyr/archive/tags/RuntimeBinderException/default.aspx">RuntimeBinderException</category></item><item><title>Silverlight Profiling Part 2: The Easy Way</title><link>http://www.wintellect.com/CS/blogs/jlikness/archive/2010/07/15/silverlight-profiling-part-2-the-easy-way.aspx</link><pubDate>Thu, 15 Jul 2010 10:13:02 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17036</guid><dc:creator>C#er : IMage</dc:creator><slash:comments>2</slash:comments><description>After posting about profiling Silverlight 4 out of the box, the author of a tool was kind enough to share with me his free .NET profiling tool . It's free, and it does a lot more than Silverlight. The manual is very straightforward but I wanted to make a quick an easy "light tour" to show you how I profiled the X-Fit app using the tool. In less than 4 minutes I'll run two different profiles, a trace and a memory scan. The memory scan lets you see individual classes, number of objects, size, etc,...(&lt;a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2010/07/15/silverlight-profiling-part-2-the-easy-way.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17036" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/silverlight/default.aspx">silverlight</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/silverlight+4/default.aspx">silverlight 4</category><category domain="http://www.wintellect.com/CS/blogs/jlikness/archive/tags/profiling/default.aspx">profiling</category></item><item><title>Shazzam Shader Editor 1.3 is now available</title><link>http://www.wintellect.com/CS/blogs/writscher/archive/2010/07/14/shazzam-shader-editor-1-3-is-now-available.aspx</link><pubDate>Wed, 14 Jul 2010 18:51:30 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:17001</guid><dc:creator>writscher</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I work on an Open Source project called Shazzam Shader Editor.&amp;#160;&amp;#160;&amp;#160; This week, we released version 1.3.&lt;/p&gt;  &lt;p&gt;With this utility you can write, compile and test WPF/Silverlight shaders.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wintellect.com/CS/blogs/writscher/image_5D71166C.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.wintellect.com/CS/blogs/writscher/image_thumb_57864D06.png" width="450" height="443" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You can learn more about this free tool at &lt;a href="http://blog.shazzam-tool.com"&gt;http://blog.shazzam-tool.com&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Learn more about the features available in Shazzam 1.3.&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blog.shazzam-tool.com/index.php/2010/07/feature-list-v1-3-remove-dependency-on-directx-sdk/"&gt;Remove dependency on DirectX SDK&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.shazzam-tool.com/index.php/2010/06/shazzam-1-3-coming-soon-with-ps_3_0/"&gt;Write more complex shaders with the PS_3 specification&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.shazzam-tool.com/index.php/2010/07/morphing-images-with-texture-map-pixel-shader/"&gt;40 new texture maps added for multi input shaders&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;New Texture picker added to Try-out tab &lt;/li&gt;    &lt;li&gt;Over 80 sample shaders &lt;/li&gt;    &lt;li&gt;20 tutorials added &lt;/li&gt;    &lt;li&gt;Changes to User Interface      &lt;ul&gt;       &lt;li&gt;Rearrange Code and Tryout tabs &lt;/li&gt;        &lt;li&gt;Remember last shader in the Shader Loader list &lt;/li&gt;        &lt;li&gt;Explore Texture Maps menu item &lt;/li&gt;        &lt;li&gt;New hot keys &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Better support options in help menu &lt;/li&gt;    &lt;li&gt;Standard Windows Installer &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Download your own copy at &lt;a href="http://shazzam-tool.com"&gt;http://shazzam-tool.com&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=17001" width="1" height="1"&gt;</description></item><item><title>Taking a Look at Content Controls</title><link>http://www.wintellect.com/CS/blogs/writscher/archive/2010/07/14/taking-a-look-at-content-controls.aspx</link><pubDate>Wed, 14 Jul 2010 17:23:43 GMT</pubDate><guid isPermaLink="false">c9b5046a-91b6-4822-a57a-d848b8cb6435:16997</guid><dc:creator>writscher</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;A fair portion of the time, the content of a FrameworkElement is text. Some elements, like TextBox and TextBlock make this obvious, by providing a Text property. The Text Property is of type String and it trivially easy to set in XAML.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[example]&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock &lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;='This control is intended to show text' /&amp;gt;     &lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;p&gt;Other FrameworkElements are more flexible regarding their content. Take the ContentControls (CheckBox, Label, Button) for example. They expose the Content Property, not a Text property. Content, in this case, means a single child element. This child could be a single TextBlock or a complex nested hierarchy of children items.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[example]&lt;/strong&gt;&lt;/p&gt;  &lt;pre class="code"&gt;    &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Label &lt;/span&gt;&lt;span style="color:red;"&gt;Content&lt;/span&gt;&lt;span style="color:blue;"&gt;='This control can contain text' /&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel &lt;/span&gt;&lt;span style="color:red;"&gt;Orientation&lt;/span&gt;&lt;span style="color:blue;"&gt;='Horizontal'&amp;gt;
              
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Image &lt;/span&gt;&lt;span style="color:red;"&gt;Source&lt;/span&gt;&lt;span style="color:blue;"&gt;='geese.jpg' &lt;/span&gt;&lt;span style="color:red;"&gt;Width&lt;/span&gt;&lt;span style="color:blue;"&gt;='100'/&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock &lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;='Or it can contain more complex UI' /&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;lt;!--&amp;lt;TextBlock Content=&amp;quot;This will not parse&amp;quot; /&amp;gt;--&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;WinForm developers are often surprised to learn the Label can work with complex content. The key thing to remember about Label in WPF it that its main purpose is NOT to show text. Rather, its prime mission is to enable 'accelerator-keys' for other controls in the XAML tree. For example, if you want to permit ALT-F to move your input cursor to the First Name TextBox. To do this you place a Label and a TextBox in your XAML. Use a binding to link the two together.&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;[example]&lt;/strong&gt;&lt;br /&gt;
  &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Label &lt;/span&gt;&lt;span style="color:red;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;='{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding &lt;/span&gt;&lt;span style="color:red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:blue;"&gt;=firstNameTextBox}' &lt;/span&gt;&lt;span style="color:red;"&gt;Content&lt;/span&gt;&lt;span style="color:blue;"&gt;='_First Name'/&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBox &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;='firstNameTextBox' /&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Because the Label is a Content control you can show icons, bullets or other interesting UI in the Label.&lt;/p&gt;&lt;img src="http://www.wintellect.com/CS/aggbug.aspx?PostID=16997" width="1" height="1"&gt;</description><category domain="http://www.wintellect.com/CS/blogs/writscher/archive/tags/WPF/default.aspx">WPF</category></item></channel></rss>