<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Guy Burstein&amp;#39;s Blog</title><link>http://blogs.microsoft.co.il/blogs/bursteg/</link><description>All about the newest tools and technologies from Microsoft</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/bursteg" type="application/rss+xml" /><item><title>Windows 7: Register a New File Associations</title><link>http://feedproxy.google.com/~r/bursteg/~3/S3MQO9u_5Ug/windows-7-register-a-new-file-associations.aspx</link><pubDate>Wed, 01 Jul 2009 11:29:40 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:352369</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>10</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=352369</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=352369</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/07/01/windows-7-register-a-new-file-associations.aspx#comments</comments><description>&lt;h1&gt;Windows 7: Register a New File Associations&lt;/h1&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Windows 7: Register a New File Associations" border="0" alt="Windows 7: Register a New File Associations" src="http://blogs.microsoft.co.il/blogs/bursteg/Windows7_h_Print_11B5CA64.jpg" width="314" height="50" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 0px 0px 15px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Windows 7: Register a New File Associations" border="0" alt="Windows 7: Register a New File Associations" align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/image_68EA3F4D.png" width="243" height="201" /&gt; Lets say I have a standard Windows Forms application that works with .guy file types (which is nothing but a text file):&lt;/p&gt;  &lt;p&gt;This application can be launched from the command line with a file name as an argument:&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Courier New"&gt;&amp;gt; TextFilesViewer.exe SampleFile.guy&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;In this case, the application displays the file contents in the multiline textbox above:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ViewerForm_Load(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args = &lt;span style="color:#2b91af;"&gt;Environment&lt;/span&gt;.GetCommandLineArgs();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (args.Length &amp;gt; 1)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt;[] lines = &lt;span style="color:#2b91af;"&gt;File&lt;/span&gt;.ReadAllLines(args[1]);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;this&lt;/span&gt;.txtFileContents.Lines = lines;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Since this application is the only application that knows how to work with .guy files, we would like to associate this file type with my application. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 0px 0px 20px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Windows 7: Register a New File Associations" border="0" alt="Windows 7: Register a New File Associations" align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/image_0F1C72D9.png" width="154" height="166" /&gt; &lt;/p&gt;  &lt;p&gt;In order to do that, &lt;strong&gt;add a reference to the&lt;/strong&gt; &lt;strong&gt;RegistrationHelper &lt;/strong&gt;sample. This is an exe that performs the actual registration of the file association and needs to be run with admin privileges. It can be found as a sample project in the WindowsAPICodePack\Samples\Shell\TaskbarDemo\CS\RegistrationHelper folderer &lt;/p&gt;  &lt;p&gt;After you have added the reference you should add another file from the samples folder -&lt;strong&gt; RegistrationHelper.cs&lt;/strong&gt; which is found in the WindowsAPICodePack\Samples\Shell\TaskbarDemo\CS\TaskbarDemo\ folder.     &lt;br /&gt;This file exposes several static methods that invoke the helper as another process with admin privileges.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; registerFileTypeToolStripMenuItem_Click(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; appId = &lt;span style="color:#a31515;"&gt;&amp;quot;TextFilesViewer&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#2b91af;"&gt;RegistrationHelper&lt;/span&gt;.RegisterFileAssociations(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; appId,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;false&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; appId,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;{0} %1&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Assembly&lt;/span&gt;.GetExecutingAssembly().Location),&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#a31515;"&gt;&amp;quot;.guy&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Notice that one of the parameters of &lt;strong&gt;RegistrationHelper.RegisterFileAssociations()&lt;/strong&gt; method is the Application ID which is set to a meaningful name. I’ll talk more on the &lt;strong&gt;Application ID&lt;/strong&gt; in later posts to understand its impact on additional features.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 0px 0px 20px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Windows 7: Register a New File Associations" border="0" alt="Windows 7: Register a New File Associations" align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/image_3361575B.png" width="192" height="108" /&gt;When the user tries to associate the file type, &lt;strong&gt;RegistratioinHelper&lt;/strong&gt; will require admin privileges. If User Account Control (UAC) is enabled on your machine, you will be prompted to allow the registration utility to modify the registry.&lt;/p&gt;  &lt;p&gt;After the registration completes, you can double click and .guy files in your machine, and the TextFilesViwer application will be launched to display its content.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=352369" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/S3MQO9u_5Ug" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Windows+7/default.aspx">Windows 7</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/07/01/windows-7-register-a-new-file-associations.aspx</feedburner:origLink></item><item><title>Getting Started with Windows 7 Development Through Windows API Code Pack</title><link>http://feedproxy.google.com/~r/bursteg/~3/9Mxa9HIyRm0/getting-started-with-windows-7-development-through-windows-api-code-pack.aspx</link><pubDate>Wed, 01 Jul 2009 11:28:36 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:352367</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=352367</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=352367</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/07/01/getting-started-with-windows-7-development-through-windows-api-code-pack.aspx#comments</comments><description>&lt;h1&gt;Getting Started with Windows 7 Development Through Windows API Code Pack &lt;/h1&gt;  &lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Windows API Code Pack" border="0" alt="Windows API Code Pack" align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/image_28808C43.png" width="157" height="236" /&gt;&lt;/strong&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Windows API Code Pack" border="0" alt="Windows API Code Pack" src="http://blogs.microsoft.co.il/blogs/bursteg/Windows7_h_Print_6D8933AC.jpg" width="314" height="50" /&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Windows 7&lt;/strong&gt; is said to be a great operating system, much more secure, faster and productive than its predecessors. As with every version of Windows, it also contains a huge amount of new features exposed for developers as API’s, unfortunately, as unmanaged code. The Windows SDK team is working on a project called &lt;strong&gt;&lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack"&gt;Windows API Code Pack&lt;/a&gt;&lt;/strong&gt; which provides &lt;strong&gt;managed wrappers for Windows API&lt;/strong&gt;’s.&lt;/p&gt;  &lt;p&gt;Downloading the &lt;strong&gt;Windows API Code Pack&lt;/strong&gt;, you’ll get a Zip file containing both the &lt;strong&gt;Windows API Code Pack Source&lt;/strong&gt; and Samples. In the next few posts I’ll explore the new features of the new OS and provide the managed ways to leverage them from your applications using the above source and samples.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=352367" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/9Mxa9HIyRm0" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Windows+7/default.aspx">Windows 7</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/07/01/getting-started-with-windows-7-development-through-windows-api-code-pack.aspx</feedburner:origLink></item><item><title>How to build a Simple IE8 Accelerator</title><link>http://feedproxy.google.com/~r/bursteg/~3/F1dq6e8bk7M/how-to-build-a-simple-ie8-accelerator.aspx</link><pubDate>Mon, 29 Jun 2009 11:08:09 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:348172</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=348172</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=348172</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/06/29/how-to-build-a-simple-ie8-accelerator.aspx#comments</comments><description>&lt;h1&gt;How to build a Simple IE8 Accelerator &lt;/h1&gt;  &lt;p&gt;This post is a step by step guide for building IE8 Accelerators. &lt;/p&gt;  &lt;h3&gt;A Short Introduction to IE8 Accelerators&lt;/h3&gt;  &lt;p&gt;Accelerators are used to make the user more productive while surfing the net, by:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:10px 0px 25px 25px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="How to build a Simple IE8 Accelerator " border="0" alt="How to build a Simple IE8 Accelerator " align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/image_6D93EDEF.png" width="299" height="177" /&gt;1. Speeding up the process of getting additional information about a meaningful string (address, stock quote, a product, a twitter account name, etc). In this sample&lt;/p&gt;  &lt;p&gt;2. Allowing user to perform a quick action on a selected text. &lt;/p&gt;  &lt;p&gt;From a technical perspective, Accelerators define 2 actions: &lt;strong&gt;Preview &lt;/strong&gt;and &lt;strong&gt;Execute&lt;/strong&gt;. When the user selects some text and hover over an accelerator, the &lt;strong&gt;Preview&lt;/strong&gt; action is being performed - the selected text is sent to a defined url, that returns a 320x240 web page with a preview of the data.     &lt;br /&gt;When the user clicks the Accelerator, the &lt;strong&gt;Execute&lt;/strong&gt; action is performed and the browser navigates to a page passing it the selected text as a parameter.&lt;/p&gt;  &lt;p&gt;To build IE8 Accelerators, we have several steps to do:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Building an Accelerator Page &lt;/li&gt;    &lt;li&gt;Defining the Accelerator OpenService Xml &lt;/li&gt;    &lt;li&gt;Registering the Accelerator with IE8 &lt;/li&gt;    &lt;li&gt;Using the Accelerator &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;To make sure this guide is generic enough for every Accelerator you may think of and not just for Twitter profiles, I am leaving the twitter logic to the last part of this post.&lt;/p&gt;  &lt;h3&gt;1. Building an Accelerator Page&lt;/h3&gt;  &lt;p&gt;Create a new ASP.Net Web Application in Visual Studio 2008 or open an existing one. &lt;/p&gt;  &lt;p&gt;Add a new Web Form for the Accelerator Preview. In the page code behind, extract the query string parameters write them to the Response object:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;     &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;      &lt;p style="margin:0px;"&gt;{&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;string&lt;/span&gt; param &lt;span style="color:blue;"&gt;in&lt;/span&gt; Request.QueryString.AllKeys)&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; Response.Write(param + &lt;span style="color:#a31515;"&gt;&amp;quot; = &amp;quot;&lt;/span&gt; + Request.QueryString[param] + &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;}&lt;/p&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Test the page: Navigate to the accelerator’s url, and add several parameters. For example:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://localhost:16319/ShowTwitterUser.aspx?data1=guy&amp;amp;data2=burstein" href="http://localhost:16319/ShowTwitterUser.aspx?data1=guy&amp;amp;data2=burstein"&gt;http://localhost:16319/ShowTwitterUser.aspx?data1=guy&amp;amp;data2=burstein&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="How to build a Simple IE8 Accelerator " border="0" alt="How to build a Simple IE8 Accelerator " src="http://blogs.microsoft.co.il/blogs/bursteg/image_16AB6061.png" width="480" height="253" /&gt;&amp;#160; &lt;/p&gt;  &lt;h3&gt;Defining the Accelerator OpenService Xml&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;In order to register the Accelerator with a user’s browser, we have to create an xml file with the details of the Accelerator.&lt;/p&gt;  &lt;p&gt;Add an Xml file to the web application that defines the Accelerators metadata required by the browser.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;openServiceDescription&lt;/span&gt;&lt;span style="color:blue;"&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &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;&lt;a href="http://www.microsoft.com/schemas/openservicedescription/1.0"&gt;http://www.microsoft.com/schemas/openservicedescription/1.0&lt;/a&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;homepageUrl&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;http://www.bursteg.net/&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;homepageUrl&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;display&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Twitter Profile Accelerator&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;icon&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;http://www.twitter.com/favicon.ico&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;icon&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;display&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;activity&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;category&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Define&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;activityAction&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;context&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;selection&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;preview&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;action&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;http://www.bursteg.net/Twitter/ShowTwitterUser.aspx&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;parameter&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;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;selection&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;{selection}&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;preview&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;execute&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;action&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;http://www.bursteg.net/Twitter/ShowTwitterUser.aspx&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;parameter&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;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;documentUrl&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;{documentUrl}&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;parameter&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;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;documentTitle&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;{documentTitle}&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;parameter&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;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;documentDomain&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;{documentDomain}&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;parameter&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;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;documentHost&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;{documentHost}&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;parameter&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;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;selection&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;{selection}&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;execute&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;activityAction&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;activity&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;openServiceDescription&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Few things to notice in the Accelerator Xml:&lt;/p&gt;  &lt;p&gt;1. There is some meta data about the accelerator such as homepage Url and the display name and icon.&lt;/p&gt;  &lt;p&gt;2. The Activity node defines a category to which this accelerator belongs to. There are some default categories like Map, Translate, Blog etc, but users can manage their categories using the Manage Add-ons Dialog.&lt;/p&gt;  &lt;p&gt;3. As described earlier, the accelerator defines 2 actions, preview and execute, each defines a Url to call to when clicked / previewed, and several parameters to pass to the target page.&lt;/p&gt;  &lt;h3&gt;Register the Accelerator with the User’s Browser&lt;/h3&gt;  &lt;p&gt;In a page of your chose (for example Default.aspx) add a button that registers the accelerator when clicked:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;input&lt;/span&gt; &lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;btnRegister&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;button&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Add Accelerator to IE8&amp;quot;&lt;/span&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;onclick&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;BLOCKED SCRIPTwindow.external.AddService(&amp;#39;&lt;font color="#000000"&gt;TwitterProfileAccelerator.xml&lt;/font&gt;&amp;#39;);&amp;quot;&lt;/span&gt; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="How to build a Simple IE8 Accelerator " border="0" alt="How to build a Simple IE8 Accelerator " src="http://blogs.microsoft.co.il/blogs/bursteg/image_3BB88500.png" width="241" height="41" /&gt; &lt;/p&gt;  &lt;p&gt;When the user clicks on the above button, a dialog pops us asking his permission to add this accelerator to his browser, and whether to make it the default accelerator in its category.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="How to build a Simple IE8 Accelerator " border="0" alt="How to build a Simple IE8 Accelerator " src="http://blogs.microsoft.co.il/blogs/bursteg/image_68613ED9.png" width="298" height="218" /&gt; &lt;/p&gt;  &lt;h3&gt;Using the Accelerator&lt;/h3&gt;  &lt;p&gt;After the user has added the accelerator to his browser he can start using it. Select some text and the accelerator box will appear next to it. Click on it add hover over the new accelerator. This should make an HTTP request to the accelerator page passing it the text you have selected.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="How to build a Simple IE8 Accelerator " border="0" alt="How to build a Simple IE8 Accelerator " src="http://blogs.microsoft.co.il/blogs/bursteg/image_4EC98BDF.png" width="480" height="284" /&gt; &lt;/p&gt;  &lt;p&gt;If you click on the accelerator, IE8 will open the target page in a new tab passing it the selected text and additional information as defined in the accelerator xml.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="How to build a Simple IE8 Accelerator " border="0" alt="How to build a Simple IE8 Accelerator " src="http://blogs.microsoft.co.il/blogs/bursteg/image_403E69ED.png" width="480" height="327" /&gt; &lt;/p&gt;  &lt;h3&gt;Summary&lt;/h3&gt;  &lt;p&gt;In this pot I took the steps needed to build an accelerator. You can follow them you build your own accelerators and add additional logic to provide more interaction with your uses.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=348172" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/F1dq6e8bk7M" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/IE8/default.aspx">IE8</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/06/29/how-to-build-a-simple-ie8-accelerator.aspx</feedburner:origLink></item><item><title>חיפוש מוצרים באתר זאפ עם Internet Explorer 8</title><link>http://feedproxy.google.com/~r/bursteg/~3/xLW566Arhgg/IE8_2D00_ZAP_2D00_Accelerator.aspx</link><pubDate>Thu, 11 Jun 2009 08:21:27 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:334220</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=334220</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=334220</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/06/11/IE8_2D00_ZAP_2D00_Accelerator.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;   &lt;h1&gt;חיפוש מוצרים באתר זאפ עם Internet Explorer 8&lt;/h1&gt;    &lt;p dir="rtl" align="right"&gt;&lt;font size="3"&gt;&lt;img style="border-right-width:0px;margin:0px 20px 35px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="חיפוש מוצרים באתר זאפ עם Internet Explorer 8" border="0" alt="חיפוש מוצרים באתר זאפ עם Internet Explorer 8" align="left" src="http://blogs.microsoft.co.il/blogs/bursteg/logo20zap_69C89A3B.jpg" width="234" height="84" /&gt;אתמול קיבלתי מייל מחבר שלי: &lt;/font&gt;&lt;/p&gt;    &lt;p dir="rtl" align="right"&gt;&lt;font size="3"&gt;&lt;em&gt;“לא תאמין – היום חברה שלי ואני חוגגים שנה יחד, ואני מחפש לה מתנה. אני חייב לצאת גדול כי היא קנתה לי Xbox !!!”&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p dir="rtl" align="right"&gt;&lt;font size="3"&gt;אני לא יודע מה התגובה הראשונה שלכם כשאתה קוראים את מה שחבר שלי כתב לי, אבל הדבר הראשון שעלה לי לראש זה – בואו נראה כמה &lt;em&gt;באמת&lt;/em&gt; החברה שלו השקיעה…         &lt;br /&gt;אז כדי לדעת כמה בימינו אלה עולה Xbox, סביר להניח שהייתי פותח טאב חדש, גולש לאתר השוואת המחירים – זאפ ומבצע חיפוש למחרוזת Xbox כדי לראות כמה הוא עולה.&lt;/font&gt;&lt;/p&gt;    &lt;p dir="rtl" align="right"&gt;&lt;font size="3"&gt;עם Internet Explorer 8, זה הרבה יותר פשוט. כאשר מסמנים טקסט כלשהו באינטרנט, פתאום מופיע הלחצן הכחול הזה:&lt;/font&gt;&lt;/p&gt;    &lt;p dir="rtl" align="right"&gt;&lt;img style="border-right-width:0px;margin:0px auto;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="חיפוש מוצרים באתר זאפ עם Internet Explorer 8" border="0" alt="חיפוש מוצרים באתר זאפ עם Internet Explorer 8" src="http://blogs.microsoft.co.il/blogs/bursteg/image_0BF07FF5.png" width="142" height="56" /&gt; &lt;/p&gt;    &lt;p dir="rtl" align="right"&gt;&lt;font size="3"&gt;שכאשר לוחצים עליו, נפתחת רשימה של Accelerators (או בעברית – מאיצי גלישה) שמאפשרים לי להפעיל כל מיני שירותים על הטקסט שסימנתי. לדוגמא, אני יכול להפעיל את ה- Accelerator של חיפוש פריטים בזאפ ולקבל את התוצאה הבאה:&lt;/font&gt;&lt;/p&gt;    &lt;p dir="rtl" align="right"&gt;&lt;img style="border-right-width:0px;margin:0px auto;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="חיפוש מוצרים באתר זאפ עם Internet Explorer 8" border="0" alt="חיפוש מוצרים באתר זאפ עם Internet Explorer 8" src="http://blogs.microsoft.co.il/blogs/bursteg/image_4A099AA6.png" width="480" height="310" /&gt; &lt;/p&gt;    &lt;p dir="rtl" align="right"&gt;&lt;font size="3"&gt;ה- Accelerator פונה לאתר זאפ, ומציג לי את הפריטים שעונים לשם Xbox עם התמונה שלהם, טווחי המחירים ומידע נוסף. ובשביל לקבל את כל זה הייתי צריך בסך הכל לסמן טקסט ולהפעיל Accelerator. הרבה יותר פשוט מקודם!&lt;/font&gt;&lt;/p&gt;    &lt;p dir="rtl" align="right"&gt;&lt;font size="3"&gt;אם גם אתם רוצים להוסיף את ה- Accelerator של חיפוש פריטים בזאפ ל- Explorer שלכם, תוכלו לעשות את זה מתוך &lt;a href="http://ieaddons.com/il/newest"&gt;גלריית ההרחבות של Internet Explorer 8&lt;/a&gt; שמכילה עוד הרבה הרחבות שפותחו ע”י אתרים מובילים בארץ. את כל ההרחבות של אתר זאפ תוכלו למצוא &lt;a&gt;כאן&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;    &lt;p dir="rtl" align="right"&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p dir="rtl" align="right"&gt;&lt;font size="3"&gt;בהמשך אספר על עוד הרחבות ל- Internet Explorer 8 שפותחו בארץ…&lt;/font&gt;&lt;/p&gt;    &lt;p dir="rtl" align="right"&gt;&lt;font size="3"&gt;תהנו!&lt;/font&gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=334220" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/xLW566Arhgg" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Hebrew/default.aspx">Hebrew</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/IE8/default.aspx">IE8</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/06/11/IE8_2D00_ZAP_2D00_Accelerator.aspx</feedburner:origLink></item><item><title>Getting Started with jQuery in Visual Studio 2008</title><link>http://feedproxy.google.com/~r/bursteg/~3/n3NqkNZopn0/getting-started-with-jquery-in-visual-studio-2008.aspx</link><pubDate>Fri, 05 Jun 2009 16:06:22 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:331031</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=331031</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=331031</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/06/05/getting-started-with-jquery-in-visual-studio-2008.aspx#comments</comments><description>&lt;h1&gt;Getting Started with jQuery in Visual Studio 2008&lt;/h1&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="jQuery IntellSense in Visual Studio 2008" border="0" alt="jQuery IntellSense in Visual Studio 2008" align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/jQuery_3E1AE004.png" width="230" height="80" /&gt;&lt;/p&gt;  &lt;p&gt;In this post I’ll talk about adding &lt;strong&gt;jQuery IntellSense in Visual Studio 2008&lt;/strong&gt;, and how to add jQuery to a simple Web Application inside Visual Studio 2008.&lt;/p&gt;  &lt;h3&gt;jQuery IntelliSense in Visual Studio 2008 - KB946581&lt;/h3&gt;  &lt;p&gt;In order to use &lt;strong&gt;jQuery&lt;/strong&gt; &lt;strong&gt;in Visual Studio 2008 with IntelliSence&lt;/strong&gt; a &lt;a href="http://blogs.msdn.com/webdevtools/archive/2008/02/09/downloadable-hotfix-performance-and-editor-fixes-for-microsoft-visual-studio-2008-and-visual-web-developer-express-2008.aspx"&gt;hotfix&lt;/a&gt; for Visual Studio 2008 must be installed:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=10826"&gt;Download the hotfix from Connect&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Run the executable and extract its contents to a folder in your hard drive. &lt;/li&gt;    &lt;li&gt;Make sure all instances of Visual Studio 2008 are closed, and run &lt;strong&gt;VS90-KB946581.exe&lt;/strong&gt; from the above folder. &lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;Download the Latest jQuery Library + Documentation&lt;/h3&gt;  &lt;p&gt;To use &lt;strong&gt;jQuery in Visual Studio 2008&lt;/strong&gt;, and enjoy its IntelliSense, you should download 2 javascript files. One contains the actual jQuery library, and the second contains the library with documentation for &lt;strong&gt;Visual Studio 2008&lt;/strong&gt; to display its &lt;strong&gt;IntelliSense&lt;/strong&gt;.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Go to &lt;a href="http://docs.jquery.com/Downloading_jQuery#Download_jQuery"&gt;jQuery Official Download Page&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Scroll down and find the &lt;strong&gt;Current Release&lt;/strong&gt; section. &lt;/li&gt;    &lt;li&gt;Download the &lt;strong&gt;Uncompressed&lt;/strong&gt; version (&lt;em&gt;jquery-1.2.6.js&lt;/em&gt;) and the documentation for Visual Studio (&lt;em&gt;jquery-1.2.6-vsdoc.js&lt;/em&gt;). &lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;Using jQuery in a Visual Studio 2008 Web Application&lt;/h3&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="jQuery IntelliSense in Visual Studio 2008 - KB946581" border="0" alt="jQuery IntelliSense in Visual Studio 2008 - KB946581" align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/image_34DEA4C3.png" width="165" height="153" /&gt;In a new Web Application or inside an existing one, add the jQuery scripts into a certain folder.&lt;/p&gt;  &lt;p&gt;In a web page (or a master page), add a reference to the jQuery library:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;head&lt;/span&gt; &lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;title&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;jQuery Sample&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;title&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt; &lt;span style="color:red;"&gt;src&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;scripts/jquery-1.2.6.js&amp;quot;&lt;/span&gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;head&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Then, in any javascript function you can start using &lt;strong&gt;jQuery&lt;/strong&gt; functions and enjoy the &lt;strong&gt;IntelliSense in Visual Studio 2008&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="jQuery IntelliSense in Visual Studio 2008 - KB946581" border="0" alt="jQuery IntelliSense in Visual Studio 2008 - KB946581" src="http://blogs.microsoft.co.il/blogs/bursteg/image_5CC1A422.png" width="293" height="96" /&gt; &lt;/p&gt;  &lt;h3&gt;A Simple Example of Using jQuery Functions&lt;/h3&gt;  &lt;p&gt;For example, Assuming that you have a page with the following content in it:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;form&lt;/span&gt; &lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;form1&amp;quot;&lt;/span&gt; &lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;input&lt;/span&gt; &lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;inputs&amp;quot;&lt;/span&gt; &lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;txtName&amp;quot;&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Enter Text Here&amp;quot;&lt;/span&gt; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;input&lt;/span&gt; &lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;inputs&amp;quot;&lt;/span&gt; &lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;btnSubmit&amp;quot;&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Click Me&amp;quot;&lt;/span&gt; &lt;span style="color:red;"&gt;&lt;strong&gt;onclick&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;strong&gt;=&amp;quot;handleButtonClick();&lt;/strong&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;form&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;This form contains a single textbox followed by a button.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="jQuery IntelliSense in Visual Studio 2008 - KB946581" border="0" alt="jQuery IntelliSense in Visual Studio 2008 - KB946581" src="http://blogs.microsoft.co.il/blogs/bursteg/image_59CC3F6F.png" width="242" height="39" /&gt; &lt;/p&gt;  &lt;p&gt;The &lt;em&gt;handleButtonClick()&lt;/em&gt; function handles the button &lt;em&gt;onclick&lt;/em&gt; event.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt; &lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;function&lt;/span&gt; handleButtonClick() {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The way jQuery works is by selecting DOM elements and then doing something with them, such as executing a function or applying some properties. For example:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt; &lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;function&lt;/span&gt; handleButtonClick() {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;$(&lt;span style="color:#a31515;"&gt;&amp;quot;#txtName&amp;quot;&lt;/span&gt;).css(&lt;span style="color:#a31515;"&gt;&amp;quot;border&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;solid 2px red&amp;quot;&lt;/span&gt;);&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The above method uses the selector function &lt;strong&gt;$&lt;/strong&gt; to select DOM elements (in this case – a single element with id = txtName) and to apply a style property of a red border. Running this page and clicking the button results in this output:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="jQuery IntelliSense in Visual Studio 2008 - KB946581" border="0" alt="jQuery IntelliSense in Visual Studio 2008 - KB946581" src="http://blogs.microsoft.co.il/blogs/bursteg/image_2D430F89.png" width="249" height="33" /&gt; &lt;/p&gt;  &lt;h3&gt;Summary&lt;/h3&gt;  &lt;p&gt;In this post I talked about the steps you should follow in order to use &lt;strong&gt;jQuery in Visual Studio 2008 with InstelliSense support&lt;/strong&gt;. Then, we used jQuery in a simple web application.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=331031" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/n3NqkNZopn0" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/VS2008/default.aspx">VS2008</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/VS2008+SP1/default.aspx">VS2008 SP1</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/ASP.Net+MVC/default.aspx">ASP.Net MVC</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/ASP.Net/default.aspx">ASP.Net</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/jQuery/default.aspx">jQuery</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/06/05/getting-started-with-jquery-in-visual-studio-2008.aspx</feedburner:origLink></item><item><title>ASP.Net MVC on Windows Azure | ASP.Net MVC Web Role</title><link>http://feedproxy.google.com/~r/bursteg/~3/NKJJUvS0nHs/asp-net-mvc-on-windows-azure-asp-net-mvc-web-role.aspx</link><pubDate>Sat, 23 May 2009 13:44:38 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:303260</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=303260</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=303260</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/23/asp-net-mvc-on-windows-azure-asp-net-mvc-web-role.aspx#comments</comments><description>&lt;h1&gt;ASP.Net MVC on Windows Azure | ASP.Net MVC Web Role&lt;/h1&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 0px 0px 20px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/WindowsAzure_75F92F1E.png" width="210" height="46" /&gt;When you install &lt;strong&gt;Windows Azure&lt;/strong&gt; Tools for Visual Studio, you only get a project template for an &lt;strong&gt;ASP.Net Web Role&lt;/strong&gt;. In this post I’ll talk about how to create a new &lt;strong&gt;ASP.Net MVC Web Role&lt;/strong&gt; or move an existing &lt;strong&gt;ASP.Net MVC&lt;/strong&gt; Application to &lt;strong&gt;Windows Azure&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;There are 2 ways to do this:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;img style="border-right-width:0px;margin:20px 0px 20px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/ASP.Net_4B5D4E41.jpg" width="194" height="37" /&gt;Manually&lt;/strong&gt; adding an &lt;strong&gt;ASP.Net MVC application as a Web Role&lt;/strong&gt; (suitable both for a new ASP.Net MVC application and for an existing one). &lt;/li&gt;    &lt;li&gt;Use a &lt;strong&gt;Project Template&lt;/strong&gt; to simply create a new ASP.Net MVC Web Role (new ASP.Net MVC application only). &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Creating a New ASP.Net MVC Web Role&lt;/h3&gt;  &lt;p&gt;The following steps apply both for creating a new ASP.Net MVC application and to moving an existing ASP.Net MVC application to Windows Azure.&lt;/p&gt;  &lt;p&gt;1. Create an empty &lt;strong&gt;ASP.Net MVC Application&lt;/strong&gt; (with or without a test project), or make sure you have an existing ASP.Net MVC application that you want to move to the Windows Azure.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_2F6C1949.png" width="480" height="337" /&gt; &lt;/p&gt;  &lt;p&gt;2. Close this solution and create a new &lt;strong&gt;Blank Cloud Service&lt;/strong&gt;. Make sure you start &lt;strong&gt;Visual Studio as an administrator&lt;/strong&gt; because working with the &lt;strong&gt;Development Fabric&lt;/strong&gt; requires that.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_246EEC67.png" width="480" height="350" /&gt; &lt;/p&gt;  &lt;p&gt;3. &lt;strong&gt;Add an existing project&lt;/strong&gt; to the cloud service and select the ASP.Net MVC Application you have created earlier.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_2D8ADC0E.png" width="174" height="249" /&gt; &lt;/p&gt;  &lt;p&gt;4. &lt;strong&gt;Right click&lt;/strong&gt; the ASP.Net MVC project and select &lt;strong&gt;Unload Project&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_4893854F.png" width="343" height="285" /&gt; &lt;/p&gt;  &lt;p&gt;5. When the project is unloaded, right click it and &lt;strong&gt;edit the project file&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_77196864.png" width="380" height="187" /&gt; &lt;/p&gt;  &lt;p&gt;6. The project file opens in the XML Editor. &lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;ToolsVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;3.5&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Build&lt;/span&gt;&amp;quot; ...&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Configuration&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Condition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &amp;#39;$(Configuration)&amp;#39; == &amp;#39;&amp;#39; &lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Debug&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; ...&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160; ...        &lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Inside the &lt;strong&gt;PropertyGroup&lt;/strong&gt; Element, add the &lt;strong&gt;RoleType&lt;/strong&gt; element and mark this &lt;strong&gt;ASP.Net MVC project as a Web Role&lt;/strong&gt;.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;ToolsVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;3.5&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Build&lt;/span&gt;&amp;quot; ...&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RoleType&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Web&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RoleType&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Configuration&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Condition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &amp;#39;$(Configuration)&amp;#39; == &amp;#39;&amp;#39; &lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Debug&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; ...        &lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160; ...&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;7. Close this project file, and &lt;strong&gt;reload the project&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_23263F89.png" width="356" height="172" /&gt; &lt;/p&gt;  &lt;p&gt;8. Since the ASP.Net MVC now runs on the Windows Azure Service Hosting environment and will probably use its services – add a reference to &lt;strong&gt;Microsoft.ServiceHosting.ServiceRuntime.dll&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_41805AA5.png" width="480" height="313" /&gt; &lt;/p&gt;  &lt;p&gt;9. &lt;strong&gt;Right click&lt;/strong&gt; the &lt;strong&gt;Roles&lt;/strong&gt; node in the project tree, and add a &lt;strong&gt;Web Role Project in the solution. &lt;/strong&gt;Select the ASP.Net MVC project from the project list.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_569E3A80.png" width="412" height="148" /&gt; &lt;/p&gt;  &lt;p&gt;Now the &lt;strong&gt;ASP.Net MVC&lt;/strong&gt; project is shown as a &lt;strong&gt;Web Role&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_179C9418.png" width="234" height="176" /&gt; &lt;/p&gt;  &lt;p&gt;10. Since the &lt;strong&gt;Windows Azure&lt;/strong&gt; provides us only with the default .Net Framework 3.5 SP1 assemblies, we must make sure we also copy the &lt;strong&gt;ASP.Net MVC&lt;/strong&gt; Assemblies to the cloud. To do this, right click on each of the following references of the &lt;strong&gt;ASP.Net MVC&lt;/strong&gt; application, and set the &lt;strong&gt;Copy Local&lt;/strong&gt; property to &lt;strong&gt;True:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;System.Web.Abstractions &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;System.Web.Mvc &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;System.Web.Routing&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_26A34D25.png" width="251" height="255" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;That’s it. You can run the application to make sure that it is running on the &lt;strong&gt;Development Fabric&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_26739D65.png" width="480" height="309" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Creating an ASP.Net MVC Web Role using a Project Template&lt;/p&gt;  &lt;p&gt;Thanks to a great word done by the community, we can use a project template to do all the above steps for us. Here’s how to do this:&lt;/p&gt;  &lt;p&gt;1. Download the project template from Codeplex at &lt;a href="http://c4mvc.codeplex.com/"&gt;http://c4mvc.codeplex.com/&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_042B6C12.png" width="286" height="214" /&gt; &lt;/p&gt;  &lt;p&gt;2. Create a new project and select the &lt;strong&gt;Azure ASP.Net MVC&lt;/strong&gt; template in the &lt;strong&gt;Community for MVC&lt;/strong&gt; category.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_7A3654D9.png" width="480" height="377" /&gt; &lt;/p&gt;  &lt;p&gt;This creates a new &lt;strong&gt;Cloud Service for Windows Azure with ASP.Net MVC Application as a Web Role&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ASP.Net MVC Web Role Windows Azure" border="0" alt="ASP.Net MVC Web Role Windows Azure" src="http://blogs.microsoft.co.il/blogs/bursteg/image_6AA31D3D.png" width="158" height="305" /&gt; &lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=303260" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/NKJJUvS0nHs" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Windows+Azure/default.aspx">Windows Azure</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/ASP.Net+MVC/default.aspx">ASP.Net MVC</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/23/asp-net-mvc-on-windows-azure-asp-net-mvc-web-role.aspx</feedburner:origLink></item><item><title>Visual Studio 2010 and .Net Framework 4.0 Beta 1 Is Publically Available</title><link>http://feedproxy.google.com/~r/bursteg/~3/ugbQC7IUsds/visual-studio-2010-and-net-framework-4-0-beta-1-is-publically-available.aspx</link><pubDate>Thu, 21 May 2009 08:20:28 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:300583</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=300583</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=300583</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/21/visual-studio-2010-and-net-framework-4-0-beta-1-is-publically-available.aspx#comments</comments><description>&lt;h1&gt;Visual Studio 2010 and .Net Framework 4.0 Beta 1 Is Publically Available&lt;/h1&gt;  &lt;p&gt;&lt;strong&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Visual Studio 2010 .Net Framework 4.0 Beta 1" border="0" alt="Visual Studio 2010 .Net Framework 4.0 Beta 1" align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/VisualStudioTeamSystemgeneric2008logo_4256C2EA.png" width="177" height="79" /&gt;Downloads&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Video: &lt;a href="http://channel9.msdn.com/shows/10-4/10-4-Episode-20-Downloading-and-Installing-Visual-Studio-2010-Beta-1/"&gt;How to Download and Install the Beta&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=147415"&gt;.NET Framework 4 Beta 1&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=147407"&gt;Visual Studio Team System 2010 Team Suite Beta 1&lt;/a&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=147408"&gt;Visual Studio 2010 Professional Beta 1&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=147412"&gt;Visual Studio Team Foundation Server 2010 Beta 1&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Training and Resources&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=752CB725-969B-4732-A383-ED5740F02E93&amp;amp;displaylang=en"&gt;Visual Studio 2010 and .NET Framework 4 Training Kit - May Pre&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Visual Studio 2010 .Net Framework 4.0 Beta 1" border="0" alt="Visual Studio 2010 .Net Framework 4.0 Beta 1" align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/dotNethorizontal_5EA4050A.jpg" width="182" height="52" /&gt;view&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb386063(VS.100).aspx"&gt;What&amp;#39;s New in Visual Studio 2010&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd547188(VS.100).aspx"&gt;Visual Studio 2010 Product Highlights&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=5aca0622-d87d-4cc9-a22c-0d58205a56b4"&gt;WCF WF Samples for .NET Framework 4.0 Beta 1&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/wcfwf4/Release/ProjectReleases.aspx?ReleaseId=2698"&gt;WCF-WF 4 Training Kit Beta 1&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=300583" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/ugbQC7IUsds" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/.Net+Framework+4.0/default.aspx">.Net Framework 4.0</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF+4/default.aspx">WF 4</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/21/visual-studio-2010-and-net-framework-4-0-beta-1-is-publically-available.aspx</feedburner:origLink></item><item><title>WF/WCF using Visual Studio 2010 and .NET Framework 4 Training Kit</title><link>http://feedproxy.google.com/~r/bursteg/~3/k9SrzsQyfQ8/wf-wcf-using-visual-studio-2010-and-net-framework-4-training-kit.aspx</link><pubDate>Tue, 19 May 2009 13:22:40 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:298208</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=298208</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=298208</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-wcf-using-visual-studio-2010-and-net-framework-4-training-kit.aspx#comments</comments><description>&lt;h1&gt;WF/WCF using Visual Studio 2010 and .NET Framework 4 Training Kit&lt;/h1&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF/WCF using Visual Studio 2010 and .NET Framework 4 Training Kit" border="0" alt="WF/WCF using Visual Studio 2010 and .NET Framework 4 Training Kit" src="http://blogs.microsoft.co.il/blogs/bursteg/WF_22469ACA.png" width="263" height="51" /&gt;&amp;#160;&amp;#160; &lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF/WCF using Visual Studio 2010 and .NET Framework 4 Training Kit" border="0" alt="WF/WCF using Visual Studio 2010 and .NET Framework 4 Training Kit" src="http://blogs.microsoft.co.il/blogs/bursteg/WCF_000E8F44.png" width="310" height="47" /&gt; &lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;Microsoft WF/WCF using Visual Studio 2010 and .NET Framework 4 Training Kit&lt;/strong&gt; includes presentations, hands-on labs, and demos. This content is designed to help you learn how to utilize the Visual Studio 2010 features and a variety of WF and WCF new features.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Learn &lt;strong&gt;basic workflow creation&lt;/strong&gt;, hosting and running , and test-drive workflow development. &lt;/li&gt;    &lt;li&gt;Get an introduction to workflow services, communication between workflows and content based correlation of workflow instances. &lt;/li&gt;    &lt;li&gt;Use the flexibility of &lt;strong&gt;Flowchart&lt;/strong&gt; workflow activities to implement non-sequential workflows. &lt;/li&gt;    &lt;li&gt;Learn how to &lt;strong&gt;rehost the workflow designer&lt;/strong&gt; in a WPF desktop application and customize it in several ways. &lt;/li&gt;    &lt;li&gt;Learn how you can leverage some of the main &lt;strong&gt;WF and WCF monitoring&lt;/strong&gt; features to track application execution and troubleshoot problems with services when necessary. &lt;/li&gt;    &lt;li&gt;Learn how &lt;strong&gt;Service discovery&lt;/strong&gt; allows you to locate services on the same subnet using ad hoc discovery, or using a proxy to establish connections with servers regardless of where they are. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This version of the training kit is compatible with &lt;a href="http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/18/visual-studio-2010-beta-1-is-available-for-msdn-subscribers.aspx"&gt;Visual Studio 2010 Beta 1&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Download &lt;a href="http://code.msdn.microsoft.com/wcfwf4/Release/ProjectReleases.aspx?ReleaseId=2698"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=298208" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/k9SrzsQyfQ8" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF/default.aspx">WF</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/.Net+Framework+4.0/default.aspx">.Net Framework 4.0</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF+4/default.aspx">WF 4</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-wcf-using-visual-studio-2010-and-net-framework-4-training-kit.aspx</feedburner:origLink></item><item><title>WF 4.0: Long Running Custom Activities with Bookmarks and NativeActivity</title><link>http://feedproxy.google.com/~r/bursteg/~3/SBLoijJF8CE/wf-4-0-long-running-custom-activities-with-bookmarks-and-nativeactivity.aspx</link><pubDate>Tue, 19 May 2009 12:37:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:298145</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=298145</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=298145</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-long-running-custom-activities-with-bookmarks-and-nativeactivity.aspx#comments</comments><description>&lt;h1&gt;WF 4.0: Long Running Custom Activities with Bookmarks and NativeActivity&lt;/h1&gt;
&lt;p&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;MARGIN:0px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" title="WF 4.0: Long Running Custom Activities Bookmarks NativeActivity" border="0" alt="WF 4.0: Long Running Custom Activities Bookmarks NativeActivity" src="http://blogs.microsoft.co.il/blogs/bursteg/WF23_6CC2589D.png" width="314" height="61" /&gt;&lt;/p&gt;
&lt;p&gt;This is another post in my &lt;a href="http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-custom-activities.aspx"&gt;WF 4.0: Custom Activities series&lt;/a&gt;. In a previous post I have talked about creating a code only custom activity that performs a simple task. In this post I’ll talk about creating a more complex activities that takes inputs from the calling program during their execution.&lt;/p&gt;
&lt;p&gt;In the previous post &lt;a href="http://blogs.msdn.com/bursteg/archive/2009/05/19/wf-4-0-code-only-custom-activities-for-atomic-actions-codeactivity-codeactivity-t.aspx"&gt;WF 4.0: Code Only Custom Activities for Atomic Actions | CodeActivity, CodeActivity&amp;lt;T&amp;gt;&lt;/a&gt; I implemented the following activity for reading a string from the console.&lt;/p&gt;
&lt;div style="FONT-FAMILY:consolas;BACKGROUND:white;COLOR:black;FONT-SIZE:11pt;"&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;class&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;ReadString2&lt;/span&gt; : &lt;span style="COLOR:#2b91af;"&gt;CodeActivity&lt;/span&gt;&amp;lt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;&amp;gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;{&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;protected&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Execute(&lt;span style="COLOR:#2b91af;"&gt;CodeActivityContext&lt;/span&gt; context)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; {&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; value = &lt;span style="COLOR:#2b91af;"&gt;Console&lt;/span&gt;.ReadLine();&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.SetValue(Result, value);&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;}&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;While this activity will perform the task it is meant to do, it is bloc&lt;strong&gt;king the calling thread and bad for scalability&lt;/strong&gt;. In addition to that It is bound to getting the value from the console only, and it is &lt;strong&gt;not generic enough&lt;/strong&gt; to support another input methods.&lt;/p&gt;
&lt;p&gt;Enter &lt;strong&gt;Bookmarks&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Using NativeActivity for Complex Activities&lt;/h3&gt;
&lt;p&gt;To create a long running activity, add a new item of type &lt;strong&gt;Workflow Element&lt;/strong&gt; item to the project. Notice that the default activity inherits from &lt;strong&gt;CodeActivity&lt;/strong&gt;.&lt;/p&gt;
&lt;div style="FONT-FAMILY:consolas;BACKGROUND:white;COLOR:black;FONT-SIZE:11pt;"&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;class&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;ReadString3&lt;/span&gt; : &lt;span style="COLOR:#2b91af;"&gt;CodeActivity&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;{&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;protected&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Execute(&lt;span style="COLOR:#2b91af;"&gt;CodeActivityContext&lt;/span&gt; context)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; {&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;}&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;To create complex activities such as long running activities, me need to change the base class and inherit from &lt;strong&gt;NativeActivity&lt;/strong&gt; or &lt;strong&gt;NativeActivity&amp;lt;T&amp;gt;.&lt;/strong&gt; In addition to that, there is a difference between the type of the parameter that the &lt;strong&gt;CodeActivity&lt;/strong&gt; takes for the Execute method and the type that &lt;strong&gt;NativeActivity&lt;/strong&gt; takes. Change the input parameter type from &lt;strong&gt;CodeActivityContext&lt;/strong&gt; to &lt;strong&gt;ActivityExecutionContext&lt;/strong&gt;.&lt;/p&gt;
&lt;div style="FONT-FAMILY:consolas;BACKGROUND:white;COLOR:black;FONT-SIZE:11pt;"&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;class&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;ReadString3&lt;/span&gt; : &lt;span style="COLOR:#2b91af;"&gt;NativeActivity&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;{&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;protected&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Execute(&lt;span style="COLOR:#2b91af;"&gt;ActivityExecutionContext&lt;/span&gt; context)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; {&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;throw&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;NotImplementedException&lt;/span&gt;();&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;}&lt;/p&gt;&lt;/div&gt;
&lt;h3&gt;Enter Bookmarks&lt;/h3&gt;
&lt;p&gt;In previous versions of &lt;strong&gt;Windows Workflow Foundation&lt;/strong&gt; we had the &lt;strong&gt;ExternalDataExchangeService&lt;/strong&gt; and &lt;strong&gt;WorkflowQueue&lt;/strong&gt; when we wanted to build a simple long running activity. In &lt;strong&gt;WF 4.0&lt;/strong&gt; this is much more simple to do using &lt;strong&gt;Bookmarks&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To use bookmarks we need to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a named bookmark and Implement a callback method &lt;/li&gt;
&lt;li&gt;Signal from the caller program &lt;/li&gt;&lt;/ul&gt;
&lt;h3&gt;Register a Named Bookmak&lt;/h3&gt;
&lt;p&gt;The following activity registers a bookmark called “input” with a callback method called &lt;strong&gt;OnBookmarkCallback&lt;/strong&gt;.&lt;/p&gt;
&lt;div style="FONT-FAMILY:consolas;BACKGROUND:white;COLOR:black;FONT-SIZE:11pt;"&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;class&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;ReadString3&lt;/span&gt; : &lt;span style="COLOR:#2b91af;"&gt;NativeActivity&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;{&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; &lt;span style="COLOR:#2b91af;"&gt;OutArgument&lt;/span&gt;&amp;lt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;&amp;gt; name;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;OutArgument&lt;/span&gt;&amp;lt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;&amp;gt; Name&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; {&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;get&lt;/span&gt; { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.name; }&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;set&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThrowIfOpen();&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.name = &lt;span style="COLOR:blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;protected&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Execute(&lt;span style="COLOR:#2b91af;"&gt;ActivityExecutionContext&lt;/span&gt; context)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; {&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;context.CreateNamedBookmark(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;input&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:#2b91af;"&gt;BookmarkCallback&lt;/span&gt;(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.OnBookmarkCallback));&lt;/strong&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; &lt;strong&gt;&lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; OnBookmarkCallback(&lt;span style="COLOR:#2b91af;"&gt;ActivityExecutionContext&lt;/span&gt; context, &lt;span style="COLOR:#2b91af;"&gt;Bookmark&lt;/span&gt; bookmark, &lt;span style="COLOR:blue;"&gt;object&lt;/span&gt; obj)&lt;/strong&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;strong&gt;&amp;nbsp; {&lt;/strong&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Name.Set(context, (&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;)obj);&lt;/strong&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;strong&gt;&amp;nbsp; }&lt;/strong&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;}&lt;/p&gt;&lt;/div&gt;
&lt;h3&gt;Signal the workflow from the caller program&lt;/h3&gt;
&lt;p&gt;In a previous post I have talked about &lt;a href="http://blogs.microsoft.co.il/controlpanel/blogs/WF%204.0:%20How%20to%20Execute%20a%20Worklflow%20(WorkflowInvoker%20vs%20WorkflowInstance)"&gt;the code that is needed to execute a workflow&lt;/a&gt;. Since we are now talking about long running workflows we will start with the default code that is generated for us when we create a new sequential workflow console application that uses the &lt;strong&gt;WorkflowInstance&lt;/strong&gt; that lets know when the workflow instance is idle, and to resume a bookmark:&lt;/p&gt;
&lt;div style="FONT-FAMILY:consolas;BACKGROUND:white;COLOR:black;FONT-SIZE:11pt;"&gt;
&lt;p style="MARGIN:0px;"&gt;...&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;myInstance.Run();&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:green;"&gt;//Get a string from the console and resume the bookmark called “input”&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;strong&gt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; input = &lt;span style="COLOR:#2b91af;"&gt;Console&lt;/span&gt;.ReadLine();&lt;/strong&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;strong&gt;myInstance.ResumeBookmark(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;input&amp;quot;&lt;/span&gt;, input);&lt;/strong&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;syncEvent.WaitOne(); &lt;br /&gt;... &lt;br /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The main program performs the input and delivers the value to the workflow. Using this approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The main program is flexible in how it wants to get values from the user and any other input source &lt;/li&gt;
&lt;li&gt;The workflow becomes idle when it is waiting for the input and during that time not consuming any resources from the machine. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;To query the available bookmarks in a workflow instance, we can use the following code:&lt;/p&gt;
&lt;div style="FONT-FAMILY:consolas;BACKGROUND:white;COLOR:black;FONT-SIZE:11pt;"&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:#2b91af;"&gt;IList&lt;/span&gt; bookmarks = myInstance.GetAllBookmarks();&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR:#2b91af;"&gt;BookmarkInfo&lt;/span&gt; info &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; bookmarks)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;{&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp; &lt;span style="COLOR:#2b91af;"&gt;Console&lt;/span&gt;.Write(info.BookmarkName);&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;}&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=298145" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/SBLoijJF8CE" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF/default.aspx">WF</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/.Net+Framework+4.0/default.aspx">.Net Framework 4.0</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF+4/default.aspx">WF 4</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-long-running-custom-activities-with-bookmarks-and-nativeactivity.aspx</feedburner:origLink></item><item><title>WF 4.0: Code Only Custom Activities for Atomic Actions | CodeActivity, CodeActivity&lt;T&gt;</title><link>http://feedproxy.google.com/~r/bursteg/~3/BY9blKf2G4M/wf-4-0-code-only-custom-activities-for-atomic-actions-codeactivity-codeactivity-lt-t-gt.aspx</link><pubDate>Tue, 19 May 2009 11:00:54 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:298039</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=298039</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=298039</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-code-only-custom-activities-for-atomic-actions-codeactivity-codeactivity-lt-t-gt.aspx#comments</comments><description>&lt;h1&gt;WF 4.0: Code Only Custom Activities for Atomic Actions | CodeActivity, CodeActivity&amp;lt;T&amp;gt;&lt;/h1&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF 4.0  Code Custom Activities CodeActivity CodeActivity&amp;lt;T&amp;gt;" border="0" alt="WF 4.0  Code Custom Activities CodeActivity CodeActivity&amp;lt;T&amp;gt;" src="http://blogs.microsoft.co.il/blogs/bursteg/WF2_2679EB3B.png" width="314" height="61" /&gt;&lt;/p&gt;  &lt;p&gt;This is another post in my &lt;a href="http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-custom-activities.aspx"&gt;WF 4.0: Custom Activities series&lt;/a&gt;. In this post I’ll talk about creating a code only custom activity that performs a simple task. I’ll also use input and output parameters and talk about activities that returns a single value.&lt;/p&gt;  &lt;h3&gt;A Simple Code Activity&lt;/h3&gt;  &lt;p&gt;Lets start by building a simple activity that outputs a certain string to the console. To to that, lets add a new item of type &lt;strong&gt;Workflow Element&lt;/strong&gt; (under the Workflow node in the item templates).&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF 4.0  Code Custom Activities CodeActivity CodeActivity&amp;lt;T&amp;gt;" border="0" alt="WF 4.0  Code Custom Activities CodeActivity CodeActivity&amp;lt;T&amp;gt;" src="http://blogs.microsoft.co.il/blogs/bursteg/image_1CD17D05.png" width="480" height="275" /&gt; &lt;/p&gt;  &lt;p&gt;Visual Studio adds a new code file (remember – this is a code-only activity) with a class that inherits from the abstract class &lt;strong&gt;System.Activities.CodeActivity&lt;/strong&gt;.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;OutputString&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;CodeActivity&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Execute(&lt;span style="color:#2b91af;"&gt;CodeActivityContext&lt;/span&gt; context)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;To implement the logic of the atomic action, we just have to code it here. Notice that we don’t have to tell the runtime that the status of this activity is closed or something like this like we had to in WF 3.5.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;OutputString&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;CodeActivity&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Execute(&lt;span style="color:#2b91af;"&gt;CodeActivityContext&lt;/span&gt; context)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Hello world&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;After building the project, the new custom activity will appear in the Toolbox, and can be used in the workflow.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF 4.0  Code Custom Activities CodeActivity CodeActivity&amp;lt;T&amp;gt;" border="0" alt="WF 4.0  Code Custom Activities CodeActivity CodeActivity&amp;lt;T&amp;gt;" src="http://blogs.microsoft.co.il/blogs/bursteg/image_48257832.png" width="333" height="153" /&gt;&lt;/p&gt;  &lt;h3&gt;Adding Input Parameters to the Custom Activity&lt;/h3&gt;  &lt;p&gt;To add a new input parameter to the activity, we declare a InArgument&amp;lt;T&amp;gt; field and property where T is the type of the parameter.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;     &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;OutputString&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;CodeActivity&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;{&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160; &lt;strong&gt;&lt;span style="color:#2b91af;"&gt;InArgument&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; name;&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InArgument&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; Name&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;{ &lt;/strong&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; name; &lt;/strong&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;set &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ThrowIfOpen();&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Execute(&lt;span style="color:#2b91af;"&gt;CodeActivityContext&lt;/span&gt; context)&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Hello,&amp;#160; &amp;quot;&lt;/span&gt; + &lt;strong&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.Name.Get(context)&lt;/strong&gt;);&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;}&lt;/p&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Note that in the property setter implementation I am calling the base class’ &lt;strong&gt;ThrowIfOpen()&lt;/strong&gt; method. This method throws an InvalidOperationException if the activity has already been prepared for execution and the value cannot be set.&lt;/p&gt;  &lt;p&gt;Also note that in order to get the property value, we do not store the value in a private member in the class, but instead – we use the &lt;strong&gt;InArgument&lt;/strong&gt; class and using the &lt;strong&gt;Get&lt;/strong&gt; method passing it the activity context.&lt;/p&gt;  &lt;h3&gt;Output Parameters to Custom Activities&lt;/h3&gt;  &lt;p&gt;Lets create a simple activity that reads the name from the console.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ReadString&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;CodeActivity&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;strong&gt;&lt;span style="color:#2b91af;"&gt;OutArgument&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; outputString;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;OutArgument&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; Output&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return&lt;/span&gt; outputString; }&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;set &lt;/span&gt;{&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ThrowIfOpen();&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; outputString = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Execute(&lt;span style="color:#2b91af;"&gt;CodeActivityContext&lt;/span&gt; context)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; value = &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ReadLine();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; context.SetValue(Output, value);&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Notice how the code required for an output argument is similar to the one required for an input argument. Also notice how we set the value back to the output value using the &lt;strong&gt;ActivityContext&lt;/strong&gt; instance.&lt;/p&gt;  &lt;h3&gt;Activities with a Single Output Parameter - CodeActivity&amp;lt;T&amp;gt;&lt;/h3&gt;  &lt;p&gt;The above sample read a string from the console and placed the value in the output parameter. If this is the case we can also inherit from &lt;strong&gt;CodeActivity&amp;lt;T&amp;gt;&lt;/strong&gt;:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ReadString2&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;CodeActivity&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Execute(&lt;span style="color:#2b91af;"&gt;CodeActivityContext&lt;/span&gt; context)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; value = &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ReadLine();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; context.SetValue(&lt;strong&gt;Result&lt;/strong&gt;, value);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Inheriting from &lt;strong&gt;CodeActivity&amp;lt;T&amp;gt;&lt;/strong&gt; makes it more simple to write a custom activity that has a single output parameter. It has additional benefits which I’ll talk about in a subsequent post.&lt;/p&gt;  &lt;h3&gt;Summary&lt;/h3&gt;  &lt;p&gt;In this post I talked about creating a &lt;strong&gt;code only custom activities&lt;/strong&gt; that performs a simple task. I have also talked about input and output parameters.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=298039" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/BY9blKf2G4M" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF/default.aspx">WF</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/.Net+Framework+4.0/default.aspx">.Net Framework 4.0</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF+4/default.aspx">WF 4</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-code-only-custom-activities-for-atomic-actions-codeactivity-codeactivity-lt-t-gt.aspx</feedburner:origLink></item><item><title>WF 4.0: Custom Activities</title><link>http://feedproxy.google.com/~r/bursteg/~3/zIQTJXYxZUE/wf-4-0-custom-activities.aspx</link><pubDate>Tue, 19 May 2009 10:58:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:298034</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=298034</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=298034</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-custom-activities.aspx#comments</comments><description>&lt;h1&gt;WF 4.0: Custom Activities&lt;/h1&gt;
&lt;p&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;MARGIN:0px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" title="WF 4.0 Custom Activities" border="0" alt="WF 4.0 Custom Activities" src="http://blogs.microsoft.co.il/blogs/bursteg/WF_61366E19.png" width="314" height="61" /&gt; &lt;/p&gt;
&lt;p&gt;There are several ways to build &lt;strong&gt;custom activities in WF 4.0&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Xaml Based, Composite Activities &lt;/li&gt;
&lt;li&gt;Code Based Composite Activities &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-code-only-custom-activities-for-atomic-actions-codeactivity-codeactivity-lt-t-gt.aspx"&gt;Code Only Activities for Atomic Actions&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-long-running-custom-activities-with-bookmarks-and-nativeactivity.aspx"&gt;Code Only Activities for Long Running Operations&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;In the following posts I’ll talks about each of those approaches and update the above links.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=298034" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/zIQTJXYxZUE" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF/default.aspx">WF</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/.Net+Framework+4.0/default.aspx">.Net Framework 4.0</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-custom-activities.aspx</feedburner:origLink></item><item><title>WF 4.0: How to Execute a Worklflow (WorkflowInvoker vs WorkflowInstance)</title><link>http://feedproxy.google.com/~r/bursteg/~3/g9FH9o2gb8A/wf-4-0-how-to-execute-a-worklflow-workflowinvoker-vs-workflowinstance.aspx</link><pubDate>Tue, 19 May 2009 09:13:56 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:297886</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=297886</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=297886</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-how-to-execute-a-worklflow-workflowinvoker-vs-workflowinstance.aspx#comments</comments><description>&lt;h1&gt;WF 4.0: How to Execute a Worklflow (WorkflowInvoker vs WorkflowInstance)&lt;/h1&gt;  &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This post is based on &lt;a href="http://blogs.msdn.com/bursteg/Visual%20Studio%202010%20Beta%201"&gt;Visual Studio 2010 Beta 1&lt;/a&gt; which is the latest version available in the time of writing this post, so by the time this technology ships, there are probably things that will be slight different.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Execute Worklflow (WorkflowInvoker WorkflowInstance" border="0" alt="Execute Worklflow (WorkflowInvoker WorkflowInstance" align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/WF_334432B2.png" width="314" height="61" /&gt;There are two ways to execute a workflow:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Using the &lt;strong&gt;WorkflowInstance&lt;/strong&gt; class &lt;/li&gt;    &lt;li&gt;Using the &lt;strong&gt;WorkflowInvoker&lt;/strong&gt; class &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Execute Workflows using WorkflowInstace&lt;/h3&gt;  &lt;p&gt;When you create a new &lt;strong&gt;Sequential Workflow Console Application&lt;/strong&gt;, Visual Studio creates the basic code needed to execute the workflow inside the &lt;strong&gt;Main&lt;/strong&gt; method:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#2b91af;"&gt;AutoResetEvent&lt;/span&gt; syncEvent = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AutoResetEvent&lt;/span&gt;(&lt;span style="color:blue;"&gt;false&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#2b91af;"&gt;WorkflowInstance&lt;/span&gt; myInstance = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;WorkflowInstance&lt;/span&gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Sequence1&lt;/span&gt;());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; myInstance.OnCompleted = &lt;span style="color:blue;"&gt;delegate&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;WorkflowCompletedEventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; syncEvent.Set();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; myInstance.OnUnhandledException = &lt;span style="color:blue;"&gt;delegate&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;WorkflowUnhandledExceptionEventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(e.UnhandledException.ToString());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;UnhandledExceptionAction&lt;/span&gt;.Terminate;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; myInstance.OnAborted = &lt;span style="color:blue;"&gt;delegate&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;WorkflowAbortedEventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(e.Reason);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; syncEvent.Set();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; myInstance.Run();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; syncEvent.WaitOne();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;1. A &lt;strong&gt;workflow instance&lt;/strong&gt; is created and gets a reference to the root activity of the workflow. The &lt;strong&gt;WorkflowInstance&lt;/strong&gt; class lets us control the running instance of the workflow and exposes several methods for this such as Run(), Abort(), Cancel(), Load(), Unload etc.&lt;/p&gt;  &lt;p&gt;2. Since the workflow execution is scheduled to another thread, we need to block the main thread until the workflow is completed or terminated. To do this, we:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create an &lt;strong&gt;AutoResetEvent&lt;/strong&gt; initialized to false, &lt;/li&gt;    &lt;li&gt;Set the event to true when the workflow is completed, and &lt;/li&gt;    &lt;li&gt;In the main thread - wait for the workflow to complete before exiting the method. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;3. In order to handle errors in the workflow such as exceptions or termination, in addition to handling the &lt;strong&gt;OnCompleted&lt;/strong&gt; event, we are also handling the &lt;strong&gt;OnHandledException&lt;/strong&gt; and &lt;strong&gt;OnAborted&lt;/strong&gt; events. Note that when the workflow has an unhandled exception, the program can still decide how it wants to end the workflow execution, whether it is by aborting, cancelling or terminating the workflow. If the workflow is terminated, the OnCompleted event will also be raised.&lt;/p&gt;  &lt;h3&gt;Execute Workflows using WorkflowInvoker&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;WorkflowInvoker&lt;/strong&gt; lets you invoke a workflow much more easily than the previous approach. It takes the instance of the workflow or activity to run and executes it synchronously. &lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;WorkflowInvoker&lt;/span&gt;.Invoke(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Sequence1&lt;/span&gt;());&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;There are additional overloads of this method that takes parameters and a TimeSpan in which the workflow should complete within. I’ll talk in more details about passing parameters to workflow in a subsequent post, but in general this is all we have to know about &lt;strong&gt;WorkflowInvoker&lt;/strong&gt;.&lt;/p&gt;  &lt;h3&gt;Choosing between WorkflowInstance and WorkflowInvoker&lt;/h3&gt;  &lt;p&gt;If you have a simple workflow that should run synchronously – use &lt;strong&gt;WorkflowInvoker&lt;/strong&gt;. This is useful also in when unit testing workflows (more on this in a later post).&lt;/p&gt;  &lt;p&gt;If you have a &lt;strong&gt;long running workflow&lt;/strong&gt; that you want to control – persist, abort, cancel etc – use &lt;strong&gt;WorkflowInstance&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=297886" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/g9FH9o2gb8A" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/.Net+Framework+4.0/default.aspx">.Net Framework 4.0</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF+4/default.aspx">WF 4</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-how-to-execute-a-worklflow-workflowinvoker-vs-workflowinstance.aspx</feedburner:origLink></item><item><title>WF 4.0: Building a Hello World Sequential Workflow</title><link>http://feedproxy.google.com/~r/bursteg/~3/g3adSK2pIhw/wf-4-0-building-a-hello-world-sequential-workflow.aspx</link><pubDate>Tue, 19 May 2009 09:07:24 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:297875</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=297875</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=297875</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-building-a-hello-world-sequential-workflow.aspx#comments</comments><description>&lt;h1&gt;WF 4.0: Building a Hello World Sequential Workflow&lt;/h1&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF 4.0 Hello World Sequential Workflow" border="0" alt="WF 4.0 Hello World Sequential Workflow" src="http://blogs.microsoft.co.il/blogs/bursteg/WF_0862AA83.png" width="314" height="61" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This post is based on &lt;font color="#ff0000"&gt;&lt;a&gt;Visual Studio 2010 Beta 1&lt;/a&gt;&lt;/font&gt; which is the latest version available in the time of writing this post, so by the time this technology ships, there are probably things that will be slight different.&lt;/p&gt;  &lt;p&gt;Start &lt;font color="#ff0000"&gt;&lt;a&gt;Visual Studio 2010 Beta 1&lt;/a&gt;&lt;/font&gt; and create a new &lt;strong&gt;Sequential Workflow Console Application.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF 4.0 Hello World Sequential Workflow" border="0" alt="WF 4.0 Hello World Sequential Workflow" src="http://blogs.microsoft.co.il/blogs/bursteg/image_53E1D83A.png" width="480" height="332" /&gt; &lt;/p&gt;  &lt;p&gt;After you click OK, visual studio creates the new projects and creates a new WF project, in which there are some things you should know about:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;img style="border-right-width:0px;margin:0px 0px 45px 20px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF 4.0 Hello World Sequential Workflow" border="0" alt="WF 4.0 Hello World Sequential Workflow" align="right" src="http://blogs.microsoft.co.il/blogs/bursteg/image_6DE26BD1.png" width="202" height="320" /&gt;References&lt;/strong&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;System.Xaml&lt;/strong&gt; – Now that there are several technologies based on Xaml, this is a new Assembly in .Net Framework 4.0 that contains Xaml services such as serialization. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;System.Activities&lt;/strong&gt; is the assembly that contains the implementation of WF 4.0, and as you can guess, the corresponding namespace is System.Activities and anything beneath it. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;System.Activities.Design&lt;/strong&gt; contains the designers for the activities and the designer re-hosting implementation. Since the new designer is based on WPF, you can also note references to &lt;strong&gt;WindowsBase&lt;/strong&gt;, &lt;strong&gt;PresentationCode&lt;/strong&gt; and &lt;strong&gt;PresentationFramework&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;System.ServiceModel&lt;/strong&gt; contains WCF implementation (as of .Net Framework 3.0) and now &lt;strong&gt;System.ServiceModel.Activities&lt;/strong&gt; contains the activities used for Workflow Services (the integration between WF and WCF). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Sequence.xaml&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;By default, workflows are created declaratively in WF 4.0 and represented in &lt;strong&gt;.xaml files with no code behind&lt;/strong&gt;. If you open this file with an Xml editor, you will see it clearly.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&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; &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; ?&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;p:Activity&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;x:Class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;HelloWorld.Sequence1&lt;/span&gt;&amp;quot;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns:p&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/netfx/2009/xaml/activities&lt;/span&gt;&amp;quot;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns:s&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;clr-namespace:System;assembly=mscorlib&lt;/span&gt;&amp;quot;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns:sad&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;clr-namespace:System.Activities.Debugger;assembly=System.Activities&lt;/span&gt;&amp;quot;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns:sadx&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;clr-namespace:System.Activities.Design.Xaml;assembly=System.Activities.Design&lt;/span&gt;&amp;quot;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns:x&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;p:Sequence&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;sad:XamlDebuggerXmlReader.FileName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;C:\...\HelloWorld\Sequence1.xaml&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;p:Sequence&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;p:Activity&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The new WF Designer shows an empty sequence, representing an empty block of execution. Note the warning sign that says that the sequence has no child activities.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF 4.0 Hello World Sequential Workflow" border="0" alt="WF 4.0 Hello World Sequential Workflow" src="http://blogs.microsoft.co.il/blogs/bursteg/image_0812AF29.png" width="251" height="231" /&gt; &lt;/p&gt;  &lt;p&gt;From the &lt;strong&gt;Procedural&lt;/strong&gt; section in the &lt;strong&gt;Toolbox&lt;/strong&gt;, drag the &lt;strong&gt;WriteLine&lt;/strong&gt; Activity to the design surface. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF 4.0 Hello World Sequential Workflow" border="0" alt="WF 4.0 Hello World Sequential Workflow" src="http://blogs.microsoft.co.il/blogs/bursteg/image_74854F87.png" width="259" height="213" /&gt; &lt;/p&gt;  &lt;p&gt;Now, you get a warning that the &lt;strong&gt;Text&lt;/strong&gt; property is not set. To set it, go the properties window, and open the &lt;strong&gt;Expression Editor&lt;/strong&gt;. In WF 4.0 you use the Expression to set values to variables and parameters, and you can use either static values (like in this case) or VB. &lt;strong&gt;Yes! Expression are written in VB&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;Type the text you want to display to the console and click OK.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF 4.0 Hello World Sequential Workflow" border="0" alt="WF 4.0 Hello World Sequential Workflow" src="http://blogs.microsoft.co.il/blogs/bursteg/image_4C066D73.png" width="450" height="273" /&gt; &lt;/p&gt;  &lt;p&gt;Now, that the simple workflow is completed, you can use Ctrl + F5 to run it like you normally do.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF 4.0 Hello World Sequential Workflow" border="0" alt="WF 4.0 Hello World Sequential Workflow" src="http://blogs.microsoft.co.il/blogs/bursteg/image_113EC49D.png" width="480" height="250" /&gt; &lt;/p&gt;  &lt;h3&gt;Debugging a Workflow&lt;/h3&gt;  &lt;p&gt;The debugging experience when debugging a workflow in WF 4.0 is very similar to the debugging experience when using code. You can right click an activity the in designer and select &lt;strong&gt;Insert Breakpoint&lt;/strong&gt;, or use &lt;strong&gt;F9&lt;/strong&gt; to do this.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF 4.0 Hello World Sequential Workflow" border="0" alt="WF 4.0 Hello World Sequential Workflow" src="http://blogs.microsoft.co.il/blogs/bursteg/image_6E9A8621.png" width="480" height="392" /&gt; &lt;/p&gt;  &lt;p&gt;Once you do this and run the workflow, the debugger highlights the current activity using a yellow border (similar to the yellow background for the current statement when debugging code).&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WF 4.0 Hello World Sequential Workflow" border="0" alt="WF 4.0 Hello World Sequential Workflow" src="http://blogs.microsoft.co.il/blogs/bursteg/image_23776592.png" width="243" height="184" /&gt; &lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=297875" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/g3adSK2pIhw" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF/default.aspx">WF</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF+4/default.aspx">WF 4</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/19/wf-4-0-building-a-hello-world-sequential-workflow.aspx</feedburner:origLink></item><item><title>XAML in .Net 4.0: Attached Properties, IAttachedPropertyStore and AttachablePropertyServices</title><link>http://feedproxy.google.com/~r/bursteg/~3/4fVjJo-Ulhw/xaml-in-net-4-0-attached-properties-iattachedpropertystore-and-attachablepropertyservices.aspx</link><pubDate>Mon, 18 May 2009 14:36:14 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:296597</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=296597</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=296597</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/18/xaml-in-net-4-0-attached-properties-iattachedpropertystore-and-attachablepropertyservices.aspx#comments</comments><description>&lt;h1&gt;XAML in .Net 4.0: Attached Properties, IAttachedPropertyStore and AttachablePropertyServices&amp;#160; &lt;/h1&gt;  &lt;p&gt;&lt;strong&gt;&lt;img style="border-right-width:0px;margin:0px 20px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="new dot net logo" border="0" alt="new dot net logo" align="left" src="http://blogs.microsoft.co.il/blogs/bursteg/newdotnetlogo_69F3FB7E.jpg" width="175" height="49" /&gt; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This post is based on &lt;font color="#ff0000"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/18/visual-studio-2010-beta-1-is-available-for-msdn-subscribers.aspx"&gt;Visual Studio 2010 Beta 1&lt;/a&gt;&lt;/font&gt; which is the latest version available in the time of writing this post, so by the time this technology ships, there are probably things that will be slight different.&lt;/p&gt;  &lt;p&gt;In a previous post I’ve talked about &lt;font color="#ff0000"&gt;&lt;a href="http://blogs.msdn.com/bursteg/archive/2009/05/18/xaml-in-net-4-0-serialization-and-deserialization-using-xamlservices.aspx"&gt;XAML Serialization and Deserialization using XamlServices in .Net Framework 4.0&lt;/a&gt;&lt;/font&gt;. In this post I’ll add to my data classes support for &lt;strong&gt;Attached Properties&lt;/strong&gt;, so that they will be extensible during serialization.&lt;/p&gt;  &lt;h3&gt;Implement System.Xaml.IAttachedPropertyStore interface&lt;/h3&gt;  &lt;p&gt;This interface should be implemented by classes that can store &lt;strong&gt;attached properties&lt;/strong&gt;.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;interface&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IAttachedPropertyStore&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;int&lt;/span&gt; PropertyCount { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;void&lt;/span&gt; CopyPropertiesTo(&lt;span style="color:#2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;AttachableMemberIdentifier&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;[] array,       &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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;int&lt;/span&gt; index);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; RemoveProperty(&lt;span style="color:#2b91af;"&gt;AttachableMemberIdentifier&lt;/span&gt; mi);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SetProperty(&lt;span style="color:#2b91af;"&gt;AttachableMemberIdentifier&lt;/span&gt; mi, &lt;span style="color:blue;"&gt;object&lt;/span&gt; value);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; TryGetProperty(&lt;span style="color:#2b91af;"&gt;AttachableMemberIdentifier&lt;/span&gt; mi, &lt;span style="color:blue;"&gt;out&lt;/span&gt; &lt;span style="color:blue;"&gt;object&lt;/span&gt; value);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The simplest way of implementing it, is using a &lt;strong&gt;Dictionary&amp;lt;AttachableMemberIdentifier, object&amp;gt;&lt;/strong&gt; that holds the attached properties. For example, the Book class from the previous post that now implements &lt;strong&gt;IAttachedPropertyStore:&lt;/strong&gt;&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;[&lt;span style="color:#2b91af;"&gt;RuntimeNameProperty&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;[&lt;span style="color:#2b91af;"&gt;ContentProperty&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Related&amp;quot;&lt;/span&gt;)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;&lt;strong&gt;IAttachedPropertyStore&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; ISBN { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Name { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt;&amp;gt; related = &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;Book&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt;&amp;gt; Related { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;this&lt;/span&gt;.related; } }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160; &lt;strong&gt;#region&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt; IAttachedPropertyStore Members&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; &lt;span style="color:#2b91af;"&gt;IDictionary&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;AttachableMemberIdentifier&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt; attachedProperties =         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;AttachableMemberIdentifier&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;();&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; CopyPropertiesTo(&lt;span style="color:#2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;AttachableMemberIdentifier&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;[] array,&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;int&lt;/span&gt; index)&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; attachedProperties.CopyTo(array, index);&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; PropertyCount&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; attachedProperties.Count; }&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; RemoveProperty(&lt;span style="color:#2b91af;"&gt;AttachableMemberIdentifier&lt;/span&gt; member)&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; attachedProperties.Remove(member);&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SetProperty(&lt;span style="color:#2b91af;"&gt;AttachableMemberIdentifier&lt;/span&gt; member, &lt;span style="color:blue;"&gt;object&lt;/span&gt; value)&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; attachedProperties[member] = value;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; TryGetProperty(&lt;span style="color:#2b91af;"&gt;AttachableMemberIdentifier&lt;/span&gt; member, &lt;span style="color:blue;"&gt;out&lt;/span&gt; &lt;span style="color:blue;"&gt;object&lt;/span&gt; value)&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; attachedProperties.TryGetValue(member, &lt;span style="color:blue;"&gt;out&lt;/span&gt; value);&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;strong&gt;&amp;#160; #endregion&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;h3&gt;Use AttachablePropertyServices&amp;#160; to Attach Properties to Stores&lt;/h3&gt;  &lt;p&gt;After adding support for &lt;strong&gt;Attached Properties&lt;/strong&gt; to our object we can attach additional properties to it. This can be done directly with &lt;strong&gt;System.Xaml.AttachablePropertyServices&lt;/strong&gt; class, but usually, we would prefer creating a class that provides strongly typed methods for those kinds of operations. For example, if we want to add more metadata to the book, such as an indication whether it is in stock or not we can create a class like this:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;StockInfo&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; InStock { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; Quantity { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;In order to store and retrieve the data from a class that implements &lt;strong&gt;IAttachedPropertyStore&lt;/strong&gt; we can add the following static methods to the StockInfo class:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;StockInfo&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; InStock { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; Quantity { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;strong&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;StockInfo&lt;/span&gt; GetStockInfo(&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; book)&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;StockInfo&lt;/span&gt; stockInfo = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;AttachablePropertyServices&lt;/span&gt;.TryGetProperty&amp;lt;&lt;span style="color:#2b91af;"&gt;StockInfo&lt;/span&gt;&amp;gt;(&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; book,&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AttachableMemberIdentifier&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;StockInfo&lt;/span&gt;), &lt;span style="color:#a31515;"&gt;&amp;quot;StockInfo&amp;quot;&lt;/span&gt;),&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;out&lt;/span&gt; stockInfo);&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; stockInfo;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; &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; SetStockInfo(&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; book, &lt;span style="color:#2b91af;"&gt;StockInfo&lt;/span&gt; stockInfo)&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;AttachablePropertyServices&lt;/span&gt;.SetProperty(&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; book,&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AttachableMemberIdentifier&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;StockInfo&lt;/span&gt;), &lt;span style="color:#a31515;"&gt;&amp;quot;StockInfo&amp;quot;&lt;/span&gt;),&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; stockInfo);&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Now, we can attach and retrieve the additional data from the instance:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; book1 = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; { Name = &lt;span style="color:#a31515;"&gt;&amp;quot;First&amp;quot;&lt;/span&gt;, ISBN = 123 };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;StockInfo&lt;/span&gt;.SetStockInfo(book1, &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;StockInfo&lt;/span&gt; { InStock = &lt;span style="color:blue;"&gt;true&lt;/span&gt;, Quantity = 27 }); &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;StockInfo&lt;/span&gt; info = &lt;span style="color:#2b91af;"&gt;StockInfo&lt;/span&gt;.GetStockInfo(book1);&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;If we decided to serialize the instance with the attached properties assigned to it, we would get a serialized content like this:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:red;"&gt; ISBN&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;123&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt; Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;First&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt; xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;clr-namespace:XamlSamples;assembly=XamlSamples&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StockInfo.StockInfo&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StockInfo&lt;/span&gt;&lt;span style="color:red;"&gt; InStock&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt; Quantity&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;27&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StockInfo.StockInfo&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;h3&gt;Summary&lt;/h3&gt;  &lt;p&gt;In this post I extended my data class (Book) with additional properties using the &lt;strong&gt;Attached Properties&lt;/strong&gt; support in &lt;strong&gt;Xaml&lt;/strong&gt;: Implementing the &lt;strong&gt;IAttachedPropertyStore&lt;/strong&gt; interface by the data class and setting and getting the values using &lt;strong&gt;AttachablePropertyServices&lt;/strong&gt;.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=296597" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/4fVjJo-Ulhw" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/.Net+Framework+4.0/default.aspx">.Net Framework 4.0</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF+4/default.aspx">WF 4</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/18/xaml-in-net-4-0-attached-properties-iattachedpropertystore-and-attachablepropertyservices.aspx</feedburner:origLink></item><item><title>XAML in .Net 4.0: Serialization and Deserialization using XamlServices</title><link>http://feedproxy.google.com/~r/bursteg/~3/FWkaw8PBQuI/xaml-in-net-4-0-serialization-and-deserialization-using-xamlservices.aspx</link><pubDate>Mon, 18 May 2009 14:30:19 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:296591</guid><dc:creator>Guy Burstein</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/bursteg/rsscomments.aspx?PostID=296591</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/bursteg/commentapi.aspx?PostID=296591</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/18/xaml-in-net-4-0-serialization-and-deserialization-using-xamlservices.aspx#comments</comments><description>&lt;h1&gt;XAML in .Net 4.0: Serialization and Deserialization using XamlServices&lt;/h1&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 20px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Serialization and Deserialization using XamlServices" border="0" alt="Serialization and Deserialization using XamlServices" align="left" src="http://blogs.microsoft.co.il/blogs/bursteg/newdotnetlogo_4CCC6B7F.jpg" width="175" height="49" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This post is based on &lt;font color="#ff0000"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/18/visual-studio-2010-beta-1-is-available-for-msdn-subscribers.aspx"&gt;Visual Studio 2010 Beta 1&lt;/a&gt;&lt;/font&gt; which is the latest version available in the time of writing this post, so by the time this technology ships, there are probably things that will be slight different.&lt;/p&gt;  &lt;p&gt;In order to &lt;strong&gt;serialize and deserialize using XAML in .Net Framework 4.0&lt;/strong&gt; we have to reference a new assembly called &lt;strong&gt;System.Xaml.dll&lt;/strong&gt;. Since XAML was originally used only in WPF, some features are dependent on classes that are inside &lt;strong&gt;WindowsBase.dll&lt;/strong&gt;.&lt;/p&gt;  &lt;h3&gt;Serialize to Xaml with XamlServices&lt;/h3&gt;  &lt;p&gt;Assuming we have a class called &lt;strong&gt;Book&lt;/strong&gt;, that is defined like this:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Name { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; ISBN { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;In order to serialize it, we use &lt;strong&gt;System.Xaml.XamlServices&lt;/strong&gt; class:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; book1 = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; { Name = &lt;span style="color:#a31515;"&gt;&amp;quot;First&amp;quot;&lt;/span&gt;, ISBN = 123 };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; bookFileName = &lt;span style="color:#a31515;"&gt;&amp;quot;book.xaml&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;TextWriter&lt;/span&gt; writer = &lt;span style="color:#2b91af;"&gt;File&lt;/span&gt;.CreateText(bookFileName))&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#2b91af;"&gt;XamlServices&lt;/span&gt;.Save(writer, book1);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The output file should contain the following content:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:red;"&gt; ISBN&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;123&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;My first book&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;clr-namespace:XamlSamples;assembly=XamlSamples&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;If we have a more complex object graph, for example if each book had a list of related books:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; ...&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;strong&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt;&amp;gt; related = &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;Book&lt;/span&gt;&amp;gt;();&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt;&amp;gt; Related { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;this&lt;/span&gt;.related; } }&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Then for the following books with relations:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;     &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;       &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; book1 = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; { Name = &lt;span style="color:#a31515;"&gt;&amp;quot;First&amp;quot;&lt;/span&gt;, ISBN = 123 };&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; book2 = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; { Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Second&amp;quot;&lt;/span&gt;, ISBN = 456 };&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; book3 = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; { Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Third&amp;quot;&lt;/span&gt;, ISBN = 789 };&lt;/p&gt;        &lt;p style="margin:0px;"&gt;book1.Related.Add(book2);&lt;/p&gt;        &lt;p style="margin:0px;"&gt;book1.Related.Add(book3);&lt;/p&gt;        &lt;p style="margin:0px;"&gt;book2.Related.Add(book1);&lt;/p&gt;        &lt;p style="margin:0px;"&gt;book3.Related.Add(book1);&lt;/p&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The result will be:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;     &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&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;=&amp;quot;__ReferenceID0&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;ISBN&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;123&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;First&amp;quot;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;clr-namespace:XamlSamples;assembly=XamlSamples&amp;quot;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book.Related&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:red;"&gt; ISBN&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;456&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Second&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book.Related&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;__ReferenceID0&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book.Related&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:red;"&gt; ISBN&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;789&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Third&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book.Related&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;__ReferenceID0&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book.Related&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book.Related&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;   &lt;/div&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Notice that the first book is now being identified using the &lt;strong&gt;x:Name&lt;/strong&gt; property and its unique id is &lt;strong&gt;__ReferenceID0&lt;/strong&gt;. This ID is also used to list the related books of the second book. Also note that there is no need to create a unique id to the second book because it is represented as a child element of the first one.&lt;/p&gt;  &lt;p&gt;If we wanted to use the Name property of the books as the unique identifier, we could use the &lt;strong&gt;System.Windows.Markup.RuntimeNamePropertyAttribute&lt;/strong&gt; in &lt;strong&gt;WindowsBase.dll&lt;/strong&gt;:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;strong&gt;[&lt;span style="color:#2b91af;"&gt;RuntimeNameProperty&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;)]&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; ...&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Now, the output will be:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;     &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;       &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:red;"&gt; ISBN&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;123&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;First&amp;quot;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;clr-namespace:XamlSamples;assembly=XamlSamples&amp;quot;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book.Related&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:red;"&gt; ISBN&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;456&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Second&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book.Related&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;First&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book.Related&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:red;"&gt; ISBN&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;789&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Third&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book.Related&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;First&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book.Related&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book.Related&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Note that there is no x:Name attribute.&lt;/p&gt;  &lt;p&gt;If we also want to take out the &amp;lt;Book.Related&amp;gt; nodes, and set its content to be the content node of the Book type, we can use the &lt;strong&gt;System.Windows.Markup.ContentPropertyAttribute&lt;/strong&gt; in &lt;strong&gt;WindowsBase.dll&lt;/strong&gt;.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;[&lt;span style="color:#2b91af;"&gt;RuntimeNameProperty&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;strong&gt;[&lt;span style="color:#2b91af;"&gt;ContentProperty&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Related&amp;quot;&lt;/span&gt;)]&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; ...&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Now, the result is much simpler:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;     &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:red;"&gt; ISBN&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;123&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt; Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;First&amp;quot;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;clr-namespace:XamlSamples;assembly=XamlSamples&amp;quot;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:red;"&gt; ISBN&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;456&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt; Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Second&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;First&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:red;"&gt; ISBN&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;789&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt; Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Third&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;First&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Book&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;   &lt;/div&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;h3&gt;Deserialize from Xaml with XamlServices&lt;/h3&gt;  &lt;p&gt;In order to deserialize an object graph from .xaml file, we can use &lt;strong&gt;XamlServices.Load&lt;/strong&gt; method:&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:11pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;TextReader&lt;/span&gt; reader = &lt;span style="color:#2b91af;"&gt;File&lt;/span&gt;.OpenText(bookFileName))&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; book = (&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt;)&lt;span style="color:#2b91af;"&gt;XamlServices&lt;/span&gt;.Load(reader);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Book {0} (ISBN:{1})&amp;quot;&lt;/span&gt;, book.Name, book.ISBN);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Related Books:&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Book&lt;/span&gt; relatedBook &lt;span style="color:blue;"&gt;in&lt;/span&gt; book.Related)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;\t{0} (ISBN:{1})&amp;quot;&lt;/span&gt;, relatedBook.Name, relatedBook.ISBN);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;After deserialization, the object graph is just as it was before serialization, and the output is:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Serialization and Deserialization using XamlServices" border="0" alt="Serialization and Deserialization using XamlServices" src="http://blogs.microsoft.co.il/blogs/bursteg/image_393F0BDE.png" width="480" height="297" /&gt; &lt;/p&gt;  &lt;h3&gt;Summary&lt;/h3&gt;  &lt;p&gt;In this post I showed basic samples of &lt;strong&gt;serialization and deserialization of object graphs uisng XamlServices in System.Xaml as part of the .Net Framework 4.0&lt;/strong&gt;. In later post I&amp;#39;ll talk about some more advanced features such as Attached Properties and more.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=296591" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/bursteg/~4/FWkaw8PBQuI" height="1" width="1"/&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF/default.aspx">WF</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/.Net+Framework+4.0/default.aspx">.Net Framework 4.0</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://blogs.microsoft.co.il/blogs/bursteg/archive/tags/WF+4/default.aspx">WF 4</category><feedburner:origLink>http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/05/18/xaml-in-net-4-0-serialization-and-deserialization-using-xamlservices.aspx</feedburner:origLink></item></channel></rss>
