<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Mark's Blog of Random Thoughts</title>
    <link>http://www.julmar.com/blog/mark/</link>
    <description>Wandering through the Wilderness</description>
    <language>en-us</language>
    <copyright>Mark Smith</copyright>
    <lastBuildDate>Fri, 25 Jul 2008 20:09:45 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.8.5223.2</generator>
    <managingEditor>mark@julmar.com</managingEditor>
    <webMaster>mark@julmar.com</webMaster>
    <item>
      <trackback:ping>http://www.julmar.com/blog/mark/Trackback.aspx?guid=adc227ac-2da6-4ad4-8b7e-e7d5aee32fb2</trackback:ping>
      <pingback:server>http://www.julmar.com/blog/mark/pingback.aspx</pingback:server>
      <pingback:target>http://www.julmar.com/blog/mark/PermaLink,guid,adc227ac-2da6-4ad4-8b7e-e7d5aee32fb2.aspx</pingback:target>
      <dc:creator>mark@julmar.com (Mark)</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">It's been a long time since I blogged anything
   specific on WPF -- I've been doing a lot of it lately, along with some Silverlight. 
   Recently I was experimenting with dragging tabs around on a TabControl at runtime. 
   My end goal is really to implement it with Silverlight 2, but I've found it's much
   easier to prototype things in WPF and then port them over because the debugging experience
   is easier with WPF.<br /><br />
   I didn't want to create derived implementations of any classes - I wanted something
   that was non-intrusive to my code so I decided to use an <a href="http://msdn.microsoft.com/en-us/library/ms749011.aspx">attached
   property</a>.  Attached properties are basically property values "attached" to
   a class at runtime - where the property itself isn't defined on the target but instead
   on some other type.  The cool thing about attached properties is they can register
   a change notification handler which gives them a reference to the object they are
   being placed on -- this is how the Spell Checker works with the TextBox in WPF. 
   All the code for the spell checking lives in the SpellChecker class and when you add
   the SpellCheck.IsEnabled property onto the TextBox, it adds handlers to the TextBlock's
   TextChanged property and adds all the nifty spell checking goodness <i>without changing
   the code in TextBox</i>.<br /><br />
   Back to my drag/drop prototype.  So with this code, I can add the property to
   any TabControl and get a nice, simple drag/drop experience.  It's far from complete
   - it would be cooler if the tabs moved around as you dragged (they don't), but I was
   just prototyping here.<br /><br />
   Here's the code:<br /><br /><br /><p><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"></span><br /></span></p><br /><p></p><!-- code formatted by http://manoli.net/csharpformat/ --><style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style><pre class="csharpcode"><span class="kwrd">using</span> System; <span class="kwrd">using</span> System.Diagnostics; <span class="kwrd">using</span> System.Windows; <span class="kwrd">using</span> System.Windows.Controls; <span class="kwrd">using</span> System.Windows.Input; <span class="kwrd">using</span> System.Windows.Media; <span class="kwrd">namespace</span> WpfApplication1
   { <span class="kwrd">public</span><span class="kwrd">class</span> DragDropTabManager
   { <span class="kwrd">private</span><span class="kwrd">static</span><span class="kwrd">readonly</span> DependencyProperty
   ManagerProperty = DependencyProperty.Register(<span class="kwrd">typeof</span> (DragDropTabManager).ToString(), <span class="kwrd">typeof</span> (DragDropTabManager), <span class="kwrd">typeof</span> (DragDropTabManager)); <span class="kwrd">public</span><span class="kwrd">static</span><span class="kwrd">readonly</span> DependencyProperty
   EnabledProperty = DependencyProperty.RegisterAttached(<span class="str">"Enabled"</span>, <span class="kwrd">typeof</span>(<span class="kwrd">bool</span>), <span class="kwrd">typeof</span>(DragDropTabManager), <span class="kwrd">new</span> PropertyMetadata(<span class="kwrd">false</span>,
   DDTM_EnabledChanged)); <span class="kwrd">private</span><span class="kwrd">static</span><span class="kwrd">void</span> DDTM_EnabledChanged(DependencyObject
   d, DependencyPropertyChangedEventArgs e) { var tc = d <span class="kwrd">as</span> TabControl; <span class="kwrd">if</span> (tc
   != <span class="kwrd">null</span>) { var oldValue = (<span class="kwrd">bool</span>)
   e.OldValue; var newValue = (<span class="kwrd">bool</span>) e.NewValue; <span class="kwrd">if</span> (oldValue
   == <span class="kwrd">true</span> &amp;&amp; newValue == <span class="kwrd">false</span>)
   { var ddtm = tc.GetValue(ManagerProperty) <span class="kwrd">as</span> DragDropTabManager; <span class="kwrd">if</span> (ddtm
   != <span class="kwrd">null</span>) { tc.PreviewMouseDown -= ddtm.TabItem_PreviewMouseDown;
   tc.SetValue(ManagerProperty, <span class="kwrd">null</span>); } } <span class="kwrd">else</span><span class="kwrd">if</span> (oldValue
   == <span class="kwrd">false</span> &amp;&amp; newValue == <span class="kwrd">true</span>)
   { var ddtm = <span class="kwrd">new</span> DragDropTabManager(); tc.SetValue(ManagerProperty,
   ddtm); tc.PreviewMouseDown += ddtm.TabItem_PreviewMouseDown; } } } <span class="kwrd">public</span><span class="kwrd">static</span><span class="kwrd">bool</span> GetEnabled(DependencyObject
   obj) { <span class="kwrd">return</span> (<span class="kwrd">bool</span>)obj.GetValue(EnabledProperty);
   } <span class="kwrd">public</span><span class="kwrd">static</span><span class="kwrd">void</span> SetEnabled(DependencyObject
   obj, <span class="kwrd">bool</span><span class="kwrd">value</span>) { obj.SetValue(EnabledProperty, <span class="kwrd">value</span>);
   } <span class="kwrd">private</span><span class="kwrd">bool</span> isMoving; <span class="kwrd">private</span> TabItem
   movingTabItem; <span class="kwrd">private</span> TabItem lastTab; <span class="kwrd">private</span> Point
   ptStart; <span class="kwrd">void</span> TabItem_PreviewMouseDown(<span class="kwrd">object</span> sender,
   MouseEventArgs e) { var ti = e.Source <span class="kwrd">as</span> TabItem; <span class="kwrd">if</span> (ti
   != <span class="kwrd">null</span> &amp;&amp; e.LeftButton == MouseButtonState.Pressed)
   { var tc = ti.Parent <span class="kwrd">as</span> TabControl; <span class="kwrd">if</span> (tc
   != <span class="kwrd">null</span>) { tc.MouseMove += tc_MouseMove; tc.MouseLeftButtonUp
   += tc_MouseLeftButtonUp; ptStart = e.GetPosition(tc); movingTabItem = ti; } } } <span class="kwrd">void</span> tc_MouseMove(<span class="kwrd">object</span> sender,
   MouseEventArgs e) { var tc = sender <span class="kwrd">as</span> TabControl; <span class="kwrd">if</span> (tc
   == <span class="kwrd">null</span>) <span class="kwrd">return</span>; Point pt = e.GetPosition(tc); <span class="kwrd">if</span> (isMoving
   == <span class="kwrd">false</span>) { <span class="kwrd">if</span> (Math.Abs(pt.X
   - ptStart.X) &gt; 10) { movingTabItem.IsHitTestVisible = <span class="kwrd">false</span>;
   movingTabItem.RenderTransformOrigin = <span class="kwrd">new</span> Point(.5, .5);
   movingTabItem.RenderTransform = <span class="kwrd">new</span> TranslateTransform(0,
   0); tc.Cursor = Cursors.Hand; Panel.SetZIndex(movingTabItem, 1); isMoving = <span class="kwrd">true</span>;
   tc.CaptureMouse(); } <span class="kwrd">return</span>; } TabItem newPos = FindTabItem(tc,
   pt); <span class="kwrd">if</span> (newPos == <span class="kwrd">null</span>) tc.Cursor
   = Cursors.No; <span class="kwrd">else</span> { lastTab = newPos; var xform = movingTabItem.RenderTransform <span class="kwrd">as</span> TranslateTransform; <span class="kwrd">if</span> (xform
   != <span class="kwrd">null</span>) xform.X = pt.X - ptStart.X; tc.Cursor = Cursors.Hand;
   } } <span class="kwrd">void</span> tc_MouseLeftButtonUp(<span class="kwrd">object</span> sender,
   MouseButtonEventArgs e) { var tc = sender <span class="kwrd">as</span> TabControl;
   Debug.Assert(tc != <span class="kwrd">null</span>); tc.ReleaseMouseCapture(); tc.MouseMove
   -= tc_MouseMove; tc.MouseLeftButtonUp -= tc_MouseLeftButtonUp; <span class="kwrd">if</span> (isMoving
   == <span class="kwrd">true</span>) { isMoving = <span class="kwrd">false</span>; tc.Cursor
   = Cursors.Arrow; movingTabItem.RenderTransform = <span class="kwrd">null</span>; movingTabItem.IsHitTestVisible
   = <span class="kwrd">true</span>; Panel.SetZIndex(movingTabItem, 0); <span class="kwrd">if</span> (lastTab
   != <span class="kwrd">null</span>) { <span class="kwrd">if</span> (lastTab != <span class="kwrd">null</span> &amp;&amp;
   movingTabItem != lastTab) { <span class="kwrd">int</span> targetIndex = tc.Items.IndexOf(lastTab);
   tc.Items.Remove(movingTabItem); tc.Items.Insert(targetIndex, movingTabItem); movingTabItem.Focus();
   } } } movingTabItem = lastTab = <span class="kwrd">null</span>; } <span class="kwrd">private</span><span class="kwrd">static</span> TabItem
   FindTabItem(UIElement parent, Point pt) { var fe = parent.InputHitTest(pt) <span class="kwrd">as</span> FrameworkElement; <span class="kwrd">while</span> (fe
   != <span class="kwrd">null</span> &amp;&amp; fe.GetType() != <span class="kwrd">typeof</span>(TabItem))
   fe = VisualTreeHelper.GetParent(fe) <span class="kwrd">as</span> FrameworkElement; <span class="kwrd">return</span> fe <span class="kwrd">as</span> TabItem;
   } } } </pre><img width="0" height="0" src="http://www.julmar.com/blog/mark/aggbug.ashx?id=adc227ac-2da6-4ad4-8b7e-e7d5aee32fb2" /></body>
      <title>Implementing Drag/Drop with TabControl</title>
      <guid>http://www.julmar.com/blog/mark/PermaLink,guid,adc227ac-2da6-4ad4-8b7e-e7d5aee32fb2.aspx</guid>
      <link>http://www.julmar.com/blog/mark/PermaLink,guid,adc227ac-2da6-4ad4-8b7e-e7d5aee32fb2.aspx</link>
      <pubDate>Fri, 25 Jul 2008 20:09:45 GMT</pubDate>
      <description>It's been a long time since I blogged anything specific on WPF -- I've been doing a lot of it lately, along with some Silverlight.&amp;nbsp; Recently I was experimenting with dragging tabs around on a TabControl at runtime.&amp;nbsp; My end goal is really to implement it with Silverlight 2, but I've found it's much easier to prototype things in WPF and then port them over because the debugging experience is easier with WPF.&lt;br&gt;
&lt;br&gt;
I didn't want to create derived implementations of any classes - I wanted something
that was non-intrusive to my code so I decided to use an &lt;a href="http://msdn.microsoft.com/en-us/library/ms749011.aspx"&gt;attached
property&lt;/a&gt;.&amp;nbsp; Attached properties are basically property values "attached" to
a class at runtime - where the property itself isn't defined on the target but instead
on some other type.&amp;nbsp; The cool thing about attached properties is they can register
a change notification handler which gives them a reference to the object they are
being placed on -- this is how the Spell Checker works with the TextBox in WPF.&amp;nbsp;
All the code for the spell checking lives in the SpellChecker class and when you add
the SpellCheck.IsEnabled property onto the TextBox, it adds handlers to the TextBlock's
TextChanged property and adds all the nifty spell checking goodness &lt;i&gt;without changing
the code in TextBox&lt;/i&gt;.&lt;br&gt;
&lt;br&gt;
Back to my drag/drop prototype.&amp;nbsp; So with this code, I can add the property to
any TabControl and get a nice, simple drag/drop experience.&amp;nbsp; It's far from complete
- it would be cooler if the tabs moved around as you dragged (they don't), but I was
just prototyping here.&lt;br&gt;
&lt;br&gt;
Here's the code:&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
   &lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;/span&gt;
   &lt;br&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Controls; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Input; &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Media; &lt;span class="kwrd"&gt;namespace&lt;/span&gt; WpfApplication1
{ &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DragDropTabManager
{ &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; DependencyProperty
ManagerProperty = DependencyProperty.Register(&lt;span class="kwrd"&gt;typeof&lt;/span&gt; (DragDropTabManager).ToString(), &lt;span class="kwrd"&gt;typeof&lt;/span&gt; (DragDropTabManager), &lt;span class="kwrd"&gt;typeof&lt;/span&gt; (DragDropTabManager)); &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; DependencyProperty
EnabledProperty = DependencyProperty.RegisterAttached(&lt;span class="str"&gt;"Enabled"&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;bool&lt;/span&gt;), &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(DragDropTabManager), &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyMetadata(&lt;span class="kwrd"&gt;false&lt;/span&gt;,
DDTM_EnabledChanged)); &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DDTM_EnabledChanged(DependencyObject
d, DependencyPropertyChangedEventArgs e) { var tc = d &lt;span class="kwrd"&gt;as&lt;/span&gt; TabControl; &lt;span class="kwrd"&gt;if&lt;/span&gt; (tc
!= &lt;span class="kwrd"&gt;null&lt;/span&gt;) { var oldValue = (&lt;span class="kwrd"&gt;bool&lt;/span&gt;)
e.OldValue; var newValue = (&lt;span class="kwrd"&gt;bool&lt;/span&gt;) e.NewValue; &lt;span class="kwrd"&gt;if&lt;/span&gt; (oldValue
== &lt;span class="kwrd"&gt;true&lt;/span&gt; &amp;amp;&amp;amp; newValue == &lt;span class="kwrd"&gt;false&lt;/span&gt;)
{ var ddtm = tc.GetValue(ManagerProperty) &lt;span class="kwrd"&gt;as&lt;/span&gt; DragDropTabManager; &lt;span class="kwrd"&gt;if&lt;/span&gt; (ddtm
!= &lt;span class="kwrd"&gt;null&lt;/span&gt;) { tc.PreviewMouseDown -= ddtm.TabItem_PreviewMouseDown;
tc.SetValue(ManagerProperty, &lt;span class="kwrd"&gt;null&lt;/span&gt;); } } &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (oldValue
== &lt;span class="kwrd"&gt;false&lt;/span&gt; &amp;amp;&amp;amp; newValue == &lt;span class="kwrd"&gt;true&lt;/span&gt;)
{ var ddtm = &lt;span class="kwrd"&gt;new&lt;/span&gt; DragDropTabManager(); tc.SetValue(ManagerProperty,
ddtm); tc.PreviewMouseDown += ddtm.TabItem_PreviewMouseDown; } } } &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; GetEnabled(DependencyObject
obj) { &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;bool&lt;/span&gt;)obj.GetValue(EnabledProperty);
} &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetEnabled(DependencyObject
obj, &lt;span class="kwrd"&gt;bool&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;) { obj.SetValue(EnabledProperty, &lt;span class="kwrd"&gt;value&lt;/span&gt;);
} &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; isMoving; &lt;span class="kwrd"&gt;private&lt;/span&gt; TabItem
movingTabItem; &lt;span class="kwrd"&gt;private&lt;/span&gt; TabItem lastTab; &lt;span class="kwrd"&gt;private&lt;/span&gt; Point
ptStart; &lt;span class="kwrd"&gt;void&lt;/span&gt; TabItem_PreviewMouseDown(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender,
MouseEventArgs e) { var ti = e.Source &lt;span class="kwrd"&gt;as&lt;/span&gt; TabItem; &lt;span class="kwrd"&gt;if&lt;/span&gt; (ti
!= &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; e.LeftButton == MouseButtonState.Pressed)
{ var tc = ti.Parent &lt;span class="kwrd"&gt;as&lt;/span&gt; TabControl; &lt;span class="kwrd"&gt;if&lt;/span&gt; (tc
!= &lt;span class="kwrd"&gt;null&lt;/span&gt;) { tc.MouseMove += tc_MouseMove; tc.MouseLeftButtonUp
+= tc_MouseLeftButtonUp; ptStart = e.GetPosition(tc); movingTabItem = ti; } } } &lt;span class="kwrd"&gt;void&lt;/span&gt; tc_MouseMove(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender,
MouseEventArgs e) { var tc = sender &lt;span class="kwrd"&gt;as&lt;/span&gt; TabControl; &lt;span class="kwrd"&gt;if&lt;/span&gt; (tc
== &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;; Point pt = e.GetPosition(tc); &lt;span class="kwrd"&gt;if&lt;/span&gt; (isMoving
== &lt;span class="kwrd"&gt;false&lt;/span&gt;) { &lt;span class="kwrd"&gt;if&lt;/span&gt; (Math.Abs(pt.X
- ptStart.X) &amp;gt; 10) { movingTabItem.IsHitTestVisible = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
movingTabItem.RenderTransformOrigin = &lt;span class="kwrd"&gt;new&lt;/span&gt; Point(.5, .5);
movingTabItem.RenderTransform = &lt;span class="kwrd"&gt;new&lt;/span&gt; TranslateTransform(0,
0); tc.Cursor = Cursors.Hand; Panel.SetZIndex(movingTabItem, 1); isMoving = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
tc.CaptureMouse(); } &lt;span class="kwrd"&gt;return&lt;/span&gt;; } TabItem newPos = FindTabItem(tc,
pt); &lt;span class="kwrd"&gt;if&lt;/span&gt; (newPos == &lt;span class="kwrd"&gt;null&lt;/span&gt;) tc.Cursor
= Cursors.No; &lt;span class="kwrd"&gt;else&lt;/span&gt; { lastTab = newPos; var xform = movingTabItem.RenderTransform &lt;span class="kwrd"&gt;as&lt;/span&gt; TranslateTransform; &lt;span class="kwrd"&gt;if&lt;/span&gt; (xform
!= &lt;span class="kwrd"&gt;null&lt;/span&gt;) xform.X = pt.X - ptStart.X; tc.Cursor = Cursors.Hand;
} } &lt;span class="kwrd"&gt;void&lt;/span&gt; tc_MouseLeftButtonUp(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender,
MouseButtonEventArgs e) { var tc = sender &lt;span class="kwrd"&gt;as&lt;/span&gt; TabControl;
Debug.Assert(tc != &lt;span class="kwrd"&gt;null&lt;/span&gt;); tc.ReleaseMouseCapture(); tc.MouseMove
-= tc_MouseMove; tc.MouseLeftButtonUp -= tc_MouseLeftButtonUp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (isMoving
== &lt;span class="kwrd"&gt;true&lt;/span&gt;) { isMoving = &lt;span class="kwrd"&gt;false&lt;/span&gt;; tc.Cursor
= Cursors.Arrow; movingTabItem.RenderTransform = &lt;span class="kwrd"&gt;null&lt;/span&gt;; movingTabItem.IsHitTestVisible
= &lt;span class="kwrd"&gt;true&lt;/span&gt;; Panel.SetZIndex(movingTabItem, 0); &lt;span class="kwrd"&gt;if&lt;/span&gt; (lastTab
!= &lt;span class="kwrd"&gt;null&lt;/span&gt;) { &lt;span class="kwrd"&gt;if&lt;/span&gt; (lastTab != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp;
movingTabItem != lastTab) { &lt;span class="kwrd"&gt;int&lt;/span&gt; targetIndex = tc.Items.IndexOf(lastTab);
tc.Items.Remove(movingTabItem); tc.Items.Insert(targetIndex, movingTabItem); movingTabItem.Focus();
} } } movingTabItem = lastTab = &lt;span class="kwrd"&gt;null&lt;/span&gt;; } &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; TabItem
FindTabItem(UIElement parent, Point pt) { var fe = parent.InputHitTest(pt) &lt;span class="kwrd"&gt;as&lt;/span&gt; FrameworkElement; &lt;span class="kwrd"&gt;while&lt;/span&gt; (fe
!= &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; fe.GetType() != &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(TabItem))
fe = VisualTreeHelper.GetParent(fe) &lt;span class="kwrd"&gt;as&lt;/span&gt; FrameworkElement; &lt;span class="kwrd"&gt;return&lt;/span&gt; fe &lt;span class="kwrd"&gt;as&lt;/span&gt; TabItem;
} } } &lt;/pre&gt;
&lt;img width="0" height="0" src="http://www.julmar.com/blog/mark/aggbug.ashx?id=adc227ac-2da6-4ad4-8b7e-e7d5aee32fb2" /&gt;</description>
      <category>.NET;Code;WPF</category>
    </item>
    <item>
      <trackback:ping>http://www.julmar.com/blog/mark/Trackback.aspx?guid=599288b9-351f-471d-abda-f75ba99219e8</trackback:ping>
      <pingback:server>http://www.julmar.com/blog/mark/pingback.aspx</pingback:server>
      <pingback:target>http://www.julmar.com/blog/mark/PermaLink,guid,599288b9-351f-471d-abda-f75ba99219e8.aspx</pingback:target>
      <dc:creator>mark@julmar.com (Mark)</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      It's been a while since I updated the ATAPI assembly, I've fixed a couple of minor
      bugs that were reported and updated the samples to compile with VS2008.  I've
      also added two new events onto the TapiPhone class so you can see state changes and
      button presses - somehow I missed that when I added the phone support.
   </p>
        <p>
      Finally, there's now online documentation available at 
   </p>
        <p>
          <a href="http://www.julmar.com/atapi_help/index.aspx">http://www.julmar.com/atapi_help/index.aspx</a>
        </p>
        <p>
      You can download the updated assembly, help file and samples from 
   </p>
        <p>
          <a href="http://www.julmar.com/tapi/atapinet.zip">http://www.julmar.com/tapi/atapinet.zip</a>
        </p>
        <p>
      Have fun!
   </p>
        <img width="0" height="0" src="http://www.julmar.com/blog/mark/aggbug.ashx?id=599288b9-351f-471d-abda-f75ba99219e8" />
      </body>
      <title>ATAPI assembly updated!</title>
      <guid>http://www.julmar.com/blog/mark/PermaLink,guid,599288b9-351f-471d-abda-f75ba99219e8.aspx</guid>
      <link>http://www.julmar.com/blog/mark/PermaLink,guid,599288b9-351f-471d-abda-f75ba99219e8.aspx</link>
      <pubDate>Wed, 23 Jul 2008 17:54:45 GMT</pubDate>
      <description>&lt;p&gt;
   It's been a while since I updated the ATAPI assembly, I've fixed a couple of minor
   bugs that were reported and updated the samples to compile with VS2008.&amp;nbsp; I've
   also added two new events onto the TapiPhone class so you can see state changes and
   button presses - somehow I missed that when I added the phone support.
&lt;/p&gt;
&lt;p&gt;
   Finally, there's now online documentation available at 
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://www.julmar.com/atapi_help/index.aspx"&gt;http://www.julmar.com/atapi_help/index.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   You can download the updated assembly, help file and samples from 
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://www.julmar.com/tapi/atapinet.zip"&gt;http://www.julmar.com/tapi/atapinet.zip&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   Have fun!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.julmar.com/blog/mark/aggbug.ashx?id=599288b9-351f-471d-abda-f75ba99219e8" /&gt;</description>
      <category>.NET;Tapi</category>
    </item>
    <item>
      <trackback:ping>http://www.julmar.com/blog/mark/Trackback.aspx?guid=d18594fb-c544-4398-821d-1c0391129f88</trackback:ping>
      <pingback:server>http://www.julmar.com/blog/mark/pingback.aspx</pingback:server>
      <pingback:target>http://www.julmar.com/blog/mark/PermaLink,guid,d18594fb-c544-4398-821d-1c0391129f88.aspx</pingback:target>
      <dc:creator>mark@julmar.com (Mark)</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I often show students in my classes how to add ILDasm to their tools menu - it's handy
      because you can then click on ILDasm and it will open the current module allowing
      you to look at the manifest, IL, etc.<br /><br />
      1. Select Tools | External Tools. You’ll get the tools dialog:
   </p>
        <div align="left">
          <img src="http://www.julmar.com/blog/mark/content/binary/Tools1.png" width="325" height="366" alt="Tools1.png" />
          <br />
          <br />
      2. Enter ILDASM for the title and set the Command to the path for ILDASM. The path
      varies a bit from version to version of Visual Studio. For VS2008 you will find it
      at <b>C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe</b><br /><br />
      3. Click the button to the right of Arguments and select "Target Path" and select
      the "Use Output Window" checkbox.<br /><br /><img src="http://www.julmar.com/blog/mark/content/binary/Tools2.png" border="0" height="298" width="354" name="Tools2.png" style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(0, 0, 0); border-right-color: rgb(0, 0, 0); border-bottom-color: rgb(0, 0, 0); border-left-color: rgb(0, 0, 0); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid;" id="Tools2.png" /><br /><br />
      5. You should now be able to access Tools | ILDASM.<br /><br />
      One student in another class recently asked how to get a keyboard shortcut to this. <a href="http://www.michaelckennedy.net">Michael
      Kennedy</a> - our resident VS.NET shortcut king showed exactly how to do this. It
      turns out to be really simple -- go to Tools | Options and select Keyboard. Then 1,2,3:<br /></div>
        <br />
        <img src="http://www.julmar.com/blog/mark/content/binary/CustomLauncher.png" border="0" width="484" height="282" />
        <br />
        <img width="0" height="0" src="http://www.julmar.com/blog/mark/aggbug.ashx?id=d18594fb-c544-4398-821d-1c0391129f88" />
      </body>
      <title>Adding ILDasm to VS.NET with a keyboard shortcut</title>
      <guid>http://www.julmar.com/blog/mark/PermaLink,guid,d18594fb-c544-4398-821d-1c0391129f88.aspx</guid>
      <link>http://www.julmar.com/blog/mark/PermaLink,guid,d18594fb-c544-4398-821d-1c0391129f88.aspx</link>
      <pubDate>Tue, 13 May 2008 19:13:09 GMT</pubDate>
      <description>&lt;p&gt;
   I often show students in my classes how to add ILDasm to their tools menu - it's handy
   because you can then click on ILDasm and it will open the current module allowing
   you to look at the manifest, IL, etc.&lt;br /&gt;
   &lt;br /&gt;
   1. Select Tools | External Tools. You&amp;#8217;ll get the tools dialog:
&lt;/p&gt;
&lt;div align="left"&gt;
   &lt;img src="http://www.julmar.com/blog/mark/content/binary/Tools1.png" width="325" height="366" alt="Tools1.png" /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
   2. Enter ILDASM for the title and set the Command to the path for ILDASM. The path
   varies a bit from version to version of Visual Studio. For VS2008 you will find it
   at &lt;b&gt;C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe&lt;/b&gt;
   &lt;br /&gt;
   &lt;br /&gt;
   3. Click the button to the right of Arguments and select "Target Path" and select
   the "Use Output Window" checkbox.&lt;br /&gt;
   &lt;br /&gt;
   &lt;img src="http://www.julmar.com/blog/mark/content/binary/Tools2.png" border="0" height="298" width="354" name="Tools2.png" style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(0, 0, 0); border-right-color: rgb(0, 0, 0); border-bottom-color: rgb(0, 0, 0); border-left-color: rgb(0, 0, 0); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid;" id="Tools2.png" /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
   5. You should now be able to access Tools | ILDASM.&lt;br /&gt;
   &lt;br /&gt;
   One student in another class recently asked how to get a keyboard shortcut to this. &lt;a href="http://www.michaelckennedy.net"&gt;Michael
   Kennedy&lt;/a&gt; - our resident VS.NET shortcut king showed exactly how to do this. It
   turns out to be really simple -- go to Tools | Options and select Keyboard. Then 1,2,3:&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;img src="http://www.julmar.com/blog/mark/content/binary/CustomLauncher.png" border="0" width="484" height="282" /&gt;
&lt;br /&gt;
&lt;img width="0" height="0" src="http://www.julmar.com/blog/mark/aggbug.ashx?id=d18594fb-c544-4398-821d-1c0391129f88" /&gt;</description>
      <category>.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.julmar.com/blog/mark/Trackback.aspx?guid=4990c08c-16d7-4592-a4c3-123d0caece7f</trackback:ping>
      <pingback:server>http://www.julmar.com/blog/mark/pingback.aspx</pingback:server>
      <pingback:target>http://www.julmar.com/blog/mark/PermaLink,guid,4990c08c-16d7-4592-a4c3-123d0caece7f.aspx</pingback:target>
      <dc:creator>mark@julmar.com (Mark)</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">Thanks to all who attended the Guerrilla
   .NET event in Boston last week. Speaking as one of the instructors, it was a blast
   to get to know each of you! As promised, <a href="http://www.julmar.com/DMStuff/GNET_demos.zip">here
   are the demos</a> -- ping me using email if you have any questions!<img width="0" height="0" src="http://www.julmar.com/blog/mark/aggbug.ashx?id=4990c08c-16d7-4592-a4c3-123d0caece7f" /></body>
      <title>Demos from Guerrilla .NET</title>
      <guid>http://www.julmar.com/blog/mark/PermaLink,guid,4990c08c-16d7-4592-a4c3-123d0caece7f.aspx</guid>
      <link>http://www.julmar.com/blog/mark/PermaLink,guid,4990c08c-16d7-4592-a4c3-123d0caece7f.aspx</link>
      <pubDate>Mon, 12 May 2008 18:10:09 GMT</pubDate>
      <description>Thanks to all who attended the Guerrilla .NET event in Boston last week.  Speaking as one of the instructors, it was a blast to get to know each of you!  As promised, &lt;a href="http://www.julmar.com/DMStuff/GNET_demos.zip"&gt;here
are the demos&lt;/a&gt; -- ping me using email if you have any questions!&lt;img width="0" height="0" src="http://www.julmar.com/blog/mark/aggbug.ashx?id=4990c08c-16d7-4592-a4c3-123d0caece7f" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://www.julmar.com/blog/mark/Trackback.aspx?guid=4e4f6f4e-ca26-48e3-b096-c8dfc282209f</trackback:ping>
      <pingback:server>http://www.julmar.com/blog/mark/pingback.aspx</pingback:server>
      <pingback:target>http://www.julmar.com/blog/mark/PermaLink,guid,4e4f6f4e-ca26-48e3-b096-c8dfc282209f.aspx</pingback:target>
      <dc:creator>mark@julmar.com (Mark)</dc:creator>
      <title>Creating Extensible Applications with MAF (System.AddIn)</title>
      <guid>http://www.julmar.com/blog/mark/PermaLink,guid,4e4f6f4e-ca26-48e3-b096-c8dfc282209f.aspx</guid>
      <link>http://www.julmar.com/blog/mark/PermaLink,guid,4e4f6f4e-ca26-48e3-b096-c8dfc282209f.aspx</link>
      <pubDate>Tue, 06 May 2008 21:46:26 GMT</pubDate>
      <description>
&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0in;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:"Times New Roman";
	mso-ascii-font-family:Cambria;
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:Cambria;
	mso-hansi-theme-font:minor-latin;}
&lt;/style&gt;
&lt;![endif]--&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;o:shapedefaults v:ext="edit" spidmax="2050"/&gt;
&lt;/xml&gt;&lt;![endif]--&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;o:shapelayout v:ext="edit"&gt;
  &lt;o:idmap v:ext="edit" data="1"/&gt;
 &lt;/o:shapelayout&gt;&lt;/xml&gt;&lt;![endif]--&gt;
&lt;div class="Section1"&gt;
   &lt;h1&gt;
   &lt;/h1&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;br&gt;
      Last month, my colleague, &lt;a href="http://www.develop.com/us/technology/bio.aspx?id=87"&gt;Pinku
      Surana&lt;/a&gt;, wrote an article about .NET AppDomains and how they can be used to provide
      component isolation and make your applications more reliable.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;If
      you missed it, you can read the &lt;a href="http://www.develop.com/us/technology/technology.aspx?tech=all"&gt;Developments
      archives&lt;/a&gt; on Developmentor’s website.&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;This month,
      I’d like to continue exploring reliability and extensibility by introducing you to
      a new framework included with .NET 3.5: The Managed Add-in Framework (MAF), sometimes
      referred to as System.AddIn.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      Developers (and managers) have long desired a way to easily create extensible applications
      that allow new features to be added without jeopardizing the stability of the existing
      code base.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;The .NET framework has provided the underlying
      support to accomplish this from the very beginning through the reflection API and
      AppDomain support Pinku examined last month.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;MAF builds
      on that fundamental support to provide a higher-level service that allow you to dynamically
      discover, load, secure and interact with external assemblies used to provide features
      for your application.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Several common architectural requirements
      are made trivial with MAF:
   &lt;/p&gt;
   &lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"&gt;
      &lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;1)&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;!--[endif]--&gt;Isolate aspects of your code for security reasons or partial-trust scenarios.
   &lt;/p&gt;
   &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"&gt;
      &lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;2)&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;!--[endif]--&gt;Allow business partners to extend your application safely without access
      to the source code; Adobe Illustrator is a great example of this style of application.
   &lt;/p&gt;
   &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"&gt;
      &lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;3)&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;!--[endif]--&gt;Separate volatile sections of your application out – where depending
      on the customer the application needs to execute different sets of code.
   &lt;/p&gt;
   &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"&gt;
      &lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;4)&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;!--[endif]--&gt;Add or change code without unloading the application – for example pay-to-play
      scenarios, or where you need to update an assembly but the application must continue
      to run.
   &lt;/p&gt;
   &lt;p class="MsoListParagraphCxSpLast" style="text-indent: -0.25in;"&gt;
      &lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;5)&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;!--[endif]--&gt;Develop and evolve different sections of the application in parallel
      without any fear of destabilizing one based on the other.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      If any of these scenarios sound like something you could utilize in your application
      then you should know about MAF!
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      At the center of the MAF-based application is the pipeline.
   &lt;/p&gt;
   &lt;h2&gt;The Pipeline
   &lt;/h2&gt;
   &lt;p class="MsoNormal"&gt;
      Communication between add-ins and the host application is strictly regulated by the
      pipeline.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;The pipeline is dynamically created by MAF through
      a set of loosely-coupled components which are used to version, marshal and transform
      the data as it passes back and forth between the host and each loaded add-in.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;span style=""&gt;
      &lt;!--[if gte vml 1]&gt;&lt;v:shapetype
 id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
 path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"&gt;
 &lt;v:stroke joinstyle="miter"/&gt;
 &lt;v:formulas&gt;
  &lt;v:f eqn="if lineDrawn pixelLineWidth 0"/&gt;
  &lt;v:f eqn="sum @0 1 0"/&gt;
  &lt;v:f eqn="sum 0 0 @1"/&gt;
  &lt;v:f eqn="prod @2 1 2"/&gt;
  &lt;v:f eqn="prod @3 21600 pixelWidth"/&gt;
  &lt;v:f eqn="prod @3 21600 pixelHeight"/&gt;
  &lt;v:f eqn="sum @0 0 1"/&gt;
  &lt;v:f eqn="prod @6 1 2"/&gt;
  &lt;v:f eqn="prod @7 21600 pixelWidth"/&gt;
  &lt;v:f eqn="sum @8 21600 0"/&gt;
  &lt;v:f eqn="prod @7 21600 pixelHeight"/&gt;
  &lt;v:f eqn="sum @10 21600 0"/&gt;
 &lt;/v:formulas&gt;
 &lt;v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/&gt;
 &lt;o:lock v:ext="edit" aspectratio="t"/&gt;
&lt;/v:shapetype&gt;&lt;v:shape id="O_x0020_2" o:spid="_x0000_i1028" type="#_x0000_t75"
 style='width:6in;height:81pt;visibility:visible' o:gfxdata="UEsDBBQABgAIAAAAIQCxpCU+/wAAAOEBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRwU7DMAyG

70i8Q5QralJ2QAi13YGOIyA0HsBK3DZa60RxKNvbk27sgISGOCb2//n372q9n0YxY2TnqZa3qpQC

yXjrqK/l+/apuJeCE5CF0RPW8oAs1831VbU9BGSR1cS1HFIKD1qzGXACVj4g5Urn4wQpP2OvA5gd

9KhXZXmnjaeElIq0MGRTtdjBx5jEZp+/T06yXIrHU98yqpYQwugMpGxUL1XdVC/ZeHQWxSvE9AxT

7tI2ssaVb71RlxkzWTVx4bvOGVRt5M1RdfMH2/pPijj/F95m2RvOZ/ovG0cc+cLKi92fuRbfmaqs

PMbCgwt8nqCPB2q+AAAA//8DAFBLAwQUAAYACAAAACEAOP0h/9YAAACUAQAACwAAAF9yZWxzLy5y

ZWxzpJDBasMwDIbvg72D0X1xmsMYo04vo9Br6R7A2IpjGltGMtn69jODwTJ621G/0PeJf3/4TIta

kSVSNrDrelCYHfmYg4H3y/HpBZRUm71dKKOBGwocxseH/RkXW9uRzLGIapQsBuZay6vW4mZMVjoq

mNtmIk62tpGDLtZdbUA99P2z5t8MGDdMdfIG+OQHUJdbaeY/7BQdk9BUO0dJ0zRFd4+qPX3kM66N

YjlgNeBZvkPGtWvPgb7v3f3TG9iWOboj24Rv5LZ+HKhlP3q96XL8AgAA//8DAFBLAwQUAAYACAAA

ACEAf8D54GENAABZlQAADgAAAGRycy9lMm9Eb2MueG1s7J1bc+I4Fsfft2q+g8uvU5lgDIZQTU+l

05Oeqcr0pkJm91nYArzxbWWR26efc45kYxNIEweHTVZ5IAJfJP91LOn8fCR/+vU+jqxbLvIwTca2

80vHtnjip0GYzMf2X9fnR0PbyiVLAhalCR/bDzy3f/380z8+3WUj3k0XaRRwYcFJknx0l43thZTZ

6Pg49xc8ZvkvacYT2DhLRcwkfBXz40CwOzh7HB13Ox3v+C4VQSZSn+c5/PpVbbQ/0/lnM+7Lf85m

OZdWNLahbJI+BX1O8fP48yc2mguWLUJfF4M1KEXMwgQyLU/1lUlmLUXY4FRR6t/w4IwltyyHU0b+

qPqLLmPkv/7MbJTcfhPZJLsUWHL/++2lsMKAtElYDJWl1IENejcQ63jtqPnqBPczEeOJ0tnMuqez

PJQK83tp+fDj0HM6XgcqwodtjtcZuL2ezmUBFYXHdbtD2gN26HVcSlMl+YvffnASKJsqAyQq5aIk

FmzL5Tqubanr/SbSZWY53Vdd97by/y9LsK7A8A0VcAfDwRMjcDu9IZoJGkHvpI/pZ41gdZItRpBn

ygKeWrvjFNV/Ba0FS+YRt5wiu++3eEBh98XBOfxmTe/+TAO4SdhSpnTrr9n/tkso7ODE6fXKO8Ed

wM1AmZblZ6NM5PIbT2MLE2NbQPEoI3Z7kUtVpmIXvLg8jcLgPIwi+iLm07NIWLcMGr7zc2919tpu

UfL8kR36Q+2hXLUjF5wFvyWBJR8yECGBxt227sZ2zAPbijj0BZiiOpMsjHbZE3LA4mBGukmS9xOq

Nnn/JQ0esKRT+A/aQ4cDgixS8QiZQuM9tvP/LpmAIkR/JPnYJm2htacvvf6gC6Ykqlum1S3JMj5L

QSYwBCEjSsL+LPEhg7HtS1F8OZOq5/DTOGPyIplk0Aw7VCdYEdf3/2Yi07UloZ6/p5MFy/imSlP7

4iUl6SlY0CzUNaquEDdEuZzIh4hjOuCzS9VMQ+oKFIjAUMc2T47+mujaWe0S3UYOWiiL5lAPEV0V

tcezNJGn9OOU5apYeeZ/4TPMAlKXvlQGU1hibevpTD6zn96qi5c/QkNO5g29LOga0ucNFzhIgH6b

JKnZE/X4vDTZ4MbZZHURk2FCNjdjPtjdz3FyFEllZ5ytbeBMbfDztQ1+vtIMxCSb06KR8LdRF/WL

mbiA9gfNB+3BqEm3865qooRaTXelZtHqGTVfZpsooVazt1LT0f2GMc4X3uqooZazX5Fz2B3SsMNY

58usEzXUcnorOdVIuNp0Qu9wzaYT6ByKdgA6XOqaOLtIvogb6iaokddf4egFdHXg2l0uEx86fdXd

vuduBhXSYg0qYg16br2fMWJBn4wKabGGK7FQKRpdlDeqEQvEQoW0WCcVsbz+gDxqIxYOnYvRHiqk

0pVxNrkbK+mg9YFB4BW1UGES8AQaoLI9I8dgB7uDA9YG3jB6h2HsthZODY4j9C6wMqvjcqfqjlX3

2OsYfrqEYfj1PY32psvJY5k8B/+h/PIdXD7t301X/qgyQLJCAUPom2Ucxul/YPgPKlR9FmuDhwC7

LAtXMpcivCHHckIpIEbo5ik/M0EcGIWP/Hc6LzozUYh0Ec4QhEICNYBUHsuziDPwOApFUc4kRRcZ

Cq7dzTW3ds0Nmc43uiGcyKK6anDU1pySUxEy8Lr8BRNAHjF7lR0IgiWQn39Pc4n5gz8Fn8oKwfLw

l9LTXeZ8kiGRUMcWrnBeeIRRcsVngOuAmKkuca3kzPfBXAll0ZXC3pj5DC6+PLBrk4Eha115XvUD

9f64n7ro8uAdci2PoJzBeMqD4xDqcFPuK78P7xkqNBRfXzWm6A59huZ0N9AcqkMinBO4t5WgCZEd

un68339Ec5yuc0Ld8zqROgDO6XRgkFoYVc2JjhJkMCf9bl/fLzOwTUjGWQCIJJkXXiw2XXTpNWRU

twN5v9H0EXR8ZflCgQLKXY0VgZ0mAWjLRq2hocIGy+bGgCLUO6p0YNAfXapmBlLQ29UaXWX5q10+

AijaYqY7tclgT4YZrZDxTvf/Wwn7cfHRgS32A5OkAyv7gaHSgZV9t3zpwLq9W9R0YN3eLXU6sG7v

FkAdWDfDop48d9bPk/+vWVQ9huMc/jRJqjn9+4ZRRKTg463w3WuJ3ZuoZP0r5Hc1ZgfOYxJcMsHQ

y35/nLNN1VbCENTcCW3uwvZ6Bdu7hpgf/piGgQXBe8ScIEjxZWzPEimg2T48RUKWhhhFxy123f7Q

60LYKpK+7qAzGOh4wIL0wUN3ilhTMYz6kbFCK0UIWBGWVcQCFcWlfHYK36r74gWTJdqzjCHwTLWX

fSq8yrvkv6R5rYUwWHBj/BhGkUEFmxCyjxlCduAxHYbg0f364aLJDiysIYObni/ugWUbMrjxye0e

lDVksC1lDRlUQdAvjXU2ZLCZboYMNtPNkMFmuhkyaMjgD+ZoIRdsjQxapwHLJBc19AWsZm9Mx9vA

dPqvYjqOB4Faa1Cn73YG/T5Mc0So43onw95A5bEZ6nhux+udaNhqoM57ivVCqNM+0YEs1PzAMzMl

sB6iXMYlZv6epwQeGDsYntMSdjA8pyVhDc9pizoYntOWsobnNPMTDc9pppvhOc10MzynmW6v5jkw

sczMORxJtn3OYW2aYfiDSYG1OIl8l6AYgB/lRL7TIDiC9Ug2MRITHmRvHCOAfG2FBw0KlFRZyMlr

iJIqAUEw2Q7n3T5djKpgR8VaBrSm2eFWcjJT/8waUWbq347TsffwUN8AoZa4hQFCLQlrgNDGIcke

2gIDhNpS1gChZo6mAULNdDNAqJluBgg10+3VQAjXcjFICJZOegYJmelZG9ehUviqtdAemEOl1lWv

8BgddvPi6VoVHuMNhg6t0rltKaZyraY3ADJmLaZiKfJcz3cpVipbLWVmFu02azFVF+1uy1UwQKYl

bmCATEvCGiDTVltggExbyhog08zRM0CmmW4GyDTTzQCZZroZIGNmXB1qxpWOJ3qy1tA+J1zB0tBP

qEzxDr6XLqJToTLuwHVLKgMJ/cIxeLam39rn9PGFUBBGg1RmQHO0np9g1fx9Z67reZtnxJmVcDau

hGPepPZx36Rmpk2pBbE+2nw0A2UMlKHXZb3grYoHbgsMlDFQplymUHkZB7ZIA2WaOckGyjTTzUCZ

ZroZKGOgzKGgzBm8iEwwv9kb24Dc4MvK4N9cZOpt5ttfXtYFOqLYzAWfyaOrcL6Q1qkQ6Z3l0Go0

r3uH2dAdFq8w63dcz+1p7FMQmkHPUy+KRELjdU5W74zfsgTO3wAAAP//7JdRb+M2DMe/iqHX4dDF

TZpccC6Q5tZtQHcLmg73zMhy7EWWPUlu0376kZQSO8Vu6Lo9DelDQ0m0Rf1EmfprVfj7alv6hbXN

k7j+BHN4vHP+4vrTBcxb6/yPqqmp2zW6ym8rrbkhS1WrpbbJI+hMgJTK+JQf1139S5OH/vR7/BP4

Lphj969FEbpnfTfotoTQOx5HZ5zYHd7PYZxMrU3ylImPk3QiEgltJgoNHs26zTPhzFYkoLcmE9Jb

jufk4eN7w5R+P6LoaMLh6mjZn8GVwYmHwiJs05mcl1MqyH8weeKfW5UJ0xglKKxa5SLRCqcniz09

VPotnhiENkRKFYWS/rgHrl1Z6vb7dRt+b5r8mawN/q5wB5T1mSgb+4IhWCLi/ujAYkD6Z+MQ1QjJ

isRzYzyZptiww5HNcMR09bLBLR2hk9dsoj8YiRNkAkEHc+mxhQOyqVvwd2bdSnqGwiJ6D/uvYNuE

THxI7f2XZl1Cq9jhVYIFX3rStYvON7dVzL6wPhrQzq/9s1Zk56pYBSJo3eP6NZhtJpT58Ns6bmbv

oh/1CPnFlNC8Jo67aIxfcJ5swIWwXCtvVBHikCvpw+5z+lKCDEcXhf8bvzgaw3MvmUgxtUWyYaoV

/98pi0kywgPy3iTFrK8M518BEnNwYSvABcoSrFNIPZ47BQOf72rzQUHIS+leDUjX40OufCwiP96D

R50SyhrsXSY4jygxmOEZ7DvAEs0I9rIHy6f1DLZVIavfk7FEM4Id92BHl9PRFR3Dc8ry9+I9ZAln

JDsZkJ2lMyzpZ7L/ImcJZyR71ZNN0xmm7JAsFpUH2Kyxphw+FFiluaIpuDM3dsfVhWtDbOLTJVbI

ymxXnZFYGEKV/p9UJ4IVuU0H3KbjSyqt/Vk/cwsbfqjqBCtym/XcCBpfVY7fyDO3U24EK3L7OOB2

NZme1pYzt1NuBCvk3uAqz3qmp4jnFS+X9/w1q0yOipLNf5KL+IpXN3uUB3hP/ta3MNy+NckX2lW8

5B8v/iMSqYfb/9DjPxUJmw5F9MOeleKmW78czVsUKMfGF9SXUUxujsIwZqIy+QoskBLadXVVN7+j

wkAOQ1mU/IUIQZfuoFydt9WOdeyaraisg6w1ja1BVy/qJ34v6SVdGfTGN+SV9c9sudovtQIUNQem

BNSgmtMaQz+q2xOh/TY5PhTEqAXfontwup4Lz465hp1+fxDPnVPr9h6FdgguqGvWeey4tS3J7Qst

57qRO5UvwTyCi2PQlpX8DB6GbbSf2rlKm7LRubLXfwIAAP//AwBQSwMEFAAGAAgAAAAhAIbR737X

AAAABQEAAA8AAABkcnMvZG93bnJldi54bWxMj81qwzAQhO+FvIPYQm+NnFBMcCyHNMX4XLfkLFsb

28RaGUv+6dt320t7WRhmmP0mPa22FzOOvnOkYLeNQCDVznTUKPj8yJ8PIHzQZHTvCBV8oYdTtnlI

dWLcQu84l6ERXEI+0QraEIZESl+3aLXfugGJvZsbrQ4sx0aaUS9cbnu5j6JYWt0Rf2j1gJcW63s5

WQV+KXGY451bw1R119e8eCvyQqmnx/V8BBFwDX9h+MFndMiYqXITGS96BTwk/F72DvELy4pD8T4C

maXyP332DQAA//8DAFBLAQItABQABgAIAAAAIQCxpCU+/wAAAOEBAAATAAAAAAAAAAAAAAAAAAAA

AABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhADj9If/WAAAAlAEAAAsAAAAAAAAA

AAAAAAAAMAEAAF9yZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAhAH/A+eBhDQAAWZUAAA4AAAAAAAAA

AAAAAAAALwIAAGRycy9lMm9Eb2MueG1sUEsBAi0AFAAGAAgAAAAhAIbR737XAAAABQEAAA8AAAAA

AAAAAAAAAAAAvA8AAGRycy9kb3ducmV2LnhtbFBLBQYAAAAABAAEAPMAAADAEAAAAAA=

"&gt;
 &lt;v:imagedata src="Creating%20Extensible%20Applications%20with%20MAF_files/image001.png"
  o:title="" croptop="-786f" cropbottom="-414f"/&gt;
 &lt;o:lock v:ext="edit" aspectratio="f"/&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;
      &lt;!--[if !vml]--&gt;&lt;img src="http://www.julmar.com/blog/mark/content/binary/image001.png" alt="image001.png" border="0" height="102" width="557"&gt;
      &lt;br&gt;
      &lt;!--[endif]--&gt;&lt;/span&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      Each section of the pipeline is contained in a separate assembly, loaded as necessary
      to manage the specific add-in.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;MAF discovers each component
      and then loads them on request using reflection.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      For reliability, MAF allows optional isolation boundaries to be created between the
      add-in and host – everything to the left of the contract is loaded into the main (host)
      AppDomain and everything to the right loaded into a newly created AppDomain which
      has its own security permission set.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;The isolation can
      also be done through cross-process calls if true process-level isolation is necessary.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Under
      the covers, the system uses traditional remoting calls to do the work of marshaling
      calls back and forth.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      Breaking down the pipeline, there are three main parts starting in the center with
      the contract.
   &lt;/p&gt;
   &lt;h2&gt;Contract
   &lt;/h2&gt;
   &lt;p class="MsoNormal"&gt;
      As you might expect, MAF is based on interface contracts.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Interfaces
      allow classes in an application to be loosely coupled, reducing the risk when changes
      are made between dependent sections of the code.&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;The
      interface contract is shared between the host and add-in and once it has been established,
      it should never be changed.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      Consider the simple example of a translator program.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;The
      host will expect to load one or more translator add-ins that will do some work on
      an inbound string and return the results.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;To accomplish
      this, I might create an &lt;b style=""&gt;ITranslator&lt;/b&gt; interface that looks like:
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;[AddInContract]&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;public interface ITranslator
      : IContract&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;string
      Translate(string input);&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
      &lt;br&gt;
      }&lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;br&gt;
      Notice that the interface derives from &lt;b style=""&gt;IContract&lt;/b&gt;. &lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;This
      is a requirement for add-in contracts and is what will be used to provide marshalling
      support when the pipeline is established.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;We also need
      to decorate the interface with the &lt;b style=""&gt;[AddInContract]&lt;/b&gt; attribute – this
      is the marker used by MAF to identify the contract when it is dynamically constructing
      the pipeline.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Both of these types come from the &lt;b style=""&gt;System.AddIn.Pipeline&lt;/b&gt; namespace
      in &lt;b style=""&gt;System.AddIn.Contract.dll&lt;/b&gt;.
   &lt;/p&gt;
   &lt;h2&gt;Views
   &lt;/h2&gt;
   &lt;p class="MsoNormal"&gt;
      Moving to the edges, we find the views.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;This is the code
      that the add-in and host directly interact with.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;It represents
      a host or add-in specific “view” of the contract and, like the contract, is contained
      in a separate assembly.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      Both of the view classes will echo the structure of the contract, but not actually
      be dependent upon the contract. &lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;For example, our host
      side view might look like this:
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;public abstract class
      TranslatorHostView&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public
      abstract string Translate(string input);&lt;br&gt;
      }&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;br&gt;
      The view is commonly exposed as an abstract class to make it look more natural when
      used by the host, but an interface will work just as well.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;The
      host uses the view directly when communicating with any add-in based on the contract.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      On the add-in side, we have an almost identical class – except we decorate this type
      with the &lt;b style=""&gt;[AddInBase]&lt;/b&gt; attribute so MAF knows which side of the pipeline
      this view is for (the add-in).&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;This is located in
      the &lt;b style=""&gt;System.AddIn.Pipeline&lt;/b&gt; namespace in the &lt;b style=""&gt;System.AddIn&lt;/b&gt; assembly.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      When we create each add-in, the implementation will use this type as the base class.
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;[AddInBase]&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;public abstract class
      TranslatorAddInView&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public
      abstract string Translate(stringinp);&lt;br&gt;
      }&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;h2&gt;Adapters
   &lt;/h2&gt;
   &lt;p class="MsoNormal"&gt;
      The last piece of the pipeline is the adapters.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;The adapters
      play a very special role in the pipeline – they are the glue that binds the contract
      to the view: implementing lifetime management and any necessary data conversion between
      the two ends.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      It may seem redundant to have this class, but by separating the view from the contract
      we introduce version tolerance into our architecture – the host can version independently
      of the add-in and vice-versa.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Depending on the situation,
      the adapters can be as simple as a pass-through class, or can provide higher-level
      services to allow non-serializable types to be marshaled across the isolation boundaries.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      On the host side, the adapter will implement the view (remember it is either an interface
      or abstract class).&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;It will be passed a reference to the
      contract in the constructor and it is responsible for connecting the two together.
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;[HostAdapter]&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;public class TranslatorHostViewToContract
      : &lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TranslatorHostView&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ITranslator
      _contract;&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ContractHandle
      _lifetime;&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public
      TranslatorHostViewToContract(&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ITranslator
      contract)&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;_contract
      = contract;&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;_lifetime
      = new ContractHandle(contract);&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public
      override string Translate(string inp)&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;return
      _contract.Translate(inp);&lt;br&gt;
      &lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
      }&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;br&gt;
      In this simple example, the code caches off the contract interface.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;This
      is a remoting proxy to the actual loaded add-in.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;The adapter
      then implements the &lt;b style=""&gt;Translate&lt;/b&gt; method and passes it forward to the
      contract for implementation.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;If we had non-serializable
      types, then the adapter would be responsible for converting them into something that &lt;i style=""&gt;was&lt;/i&gt; serializable.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      It also provides some lifetime management for the contract.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Because
      the contract is a remoting proxy and is likely running in a separate AppDomain (or
      even process) we have to be concerned with how long it lives.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;MAF
      provides all the support for this through the &lt;b style=""&gt;ContractHandle&lt;/b&gt; class.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Most
      of the time, all you will need to do is store a &lt;b style=""&gt;ContractHandle&lt;/b&gt; in
      your host adapter and then pass it the inbound contract to wrap in your constructor.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      Finally, in order for MAF to identify this class, it must be decorated with the &lt;b style=""&gt;[HostAdapter]&lt;/b&gt; attribute
      from the &lt;b style=""&gt;System.AddIn.Pipeline&lt;/b&gt; namespace out of the &lt;b style=""&gt;System.AddIn.dll&lt;/b&gt;. 
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      The add-in side looks very similar, but does the opposite: it makes the add-in view
      look like the contract.
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;[AddInAdapter]&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;public class TranslatorAddInViewToContract
      : 
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ContractBase,
      ITranslator&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TranslatorAddInView
      _view;&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public
      TranslatorAddInViewToContract(&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TranslatorView
      view)&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;_view
      = view;&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public
      string Translate(string inp)&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;{&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return
      _view.Translate(inp);&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} 
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;}&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;
      &lt;br&gt;
      MAF passes the view to the constructor and the class caches the reference off in a
      field.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;It implements the contract (&lt;b style=""&gt;ITranslator&lt;/b&gt;)
      and &lt;b style=""&gt;ContractBase&lt;/b&gt; which provides the implementation of the &lt;b style=""&gt;IContract&lt;/b&gt; interface
      for us (remember this was a required interface on our contract).&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;As
      the host makes calls to the contract interface, this class will translate those calls
      to the add-in view, which as you will see is the implementation provided by the add-in
      itself.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Note how the &lt;b style=""&gt;[AddInAdapter]&lt;/b&gt; attribute
      is used to mark this class so MAF can discover it.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      If it seems like all the above is a lot of repetitious, boilerplate code well.. you’re
      right!&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;To make it easier on the developer to create the
      pipeline components, the MAF team has created a &lt;a href="http://www.codeplex.com/clraddins"&gt;pipeline
      builder&lt;/a&gt; available at http://www.codeplex.com/clraddins.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;It
      takes the contract assembly and then generates the views and adapters from it: 
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;span style=""&gt;
      &lt;!--[if gte vml 1]&gt;&lt;v:shape
 id="P_x0020_3" o:spid="_x0000_i1027" type="#_x0000_t75" alt="image1.jpg"
 style='width:6in;height:284pt;visibility:visible;mso-wrap-style:square'&gt;
 &lt;v:imagedata src="Creating%20Extensible%20Applications%20with%20MAF_files/image003.jpg"
  o:title="image1.jpg"/&gt;
 &lt;v:textbox style='mso-rotate-with-shape:t'/&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;
      &lt;!--[if !vml]--&gt;&lt;img src="http://www.julmar.com/blog/mark/content/binary/image003.jpg" alt="image003.jpg" border="0" height="623" width="947"&gt;
      &lt;br&gt;
      &lt;!--[endif]--&gt;&lt;/span&gt;
   &lt;/p&gt;
   &lt;h2&gt;Creating an add-in
   &lt;/h2&gt;
   &lt;p class="MsoNormal"&gt;
      Once the pipeline pieces are built you can create add-ins.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Each
      add-in provides an implementation of the abstract add-in view.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;For
      example, we might provide a BabelFish add-in for universalized translation:
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;[AddIn(“BabelFishTranslator”, 
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Description=“Universal
      translator”, 
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;Version=“1.0.0.0”,
      Publisher=“Zaphod Beeblebrox”]&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;public class BabelFishAddIn
      : TranslatorAddInView&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public
      string Translate(string input) 
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;...&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
      }&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;br&gt;
      The add-in implements the &lt;b style=""&gt;AddInView&lt;/b&gt;, providing a concrete implementation
      of the &lt;b style=""&gt;Translate&lt;/b&gt; method.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;It is decorated
      with the &lt;b style=""&gt;[AddIn]&lt;/b&gt; attribute that allows it to provide a name, version,
      description and other data the host can use to decide whether it is a useful translator.
   &lt;/p&gt;
   &lt;h2&gt;Putting the pieces together – the directory structure
   &lt;/h2&gt;
   &lt;p class="MsoNormal"&gt;
      To properly identify each of the components necessary, MAF enforces a particular directory
      structure you need to follow for deployment.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Each piece
      is stored in a sub-directory off the root of the pipeline directory (this is typically
      the APPBASE where the host executable is stored).&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;span style=""&gt;
      &lt;!--[if gte vml 1]&gt;&lt;v:shape
 id="O_x0020_4" o:spid="_x0000_i1026" type="#_x0000_t75" style='width:6in;
 height:182pt;visibility:visible' o:gfxdata="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

"&gt;
 &lt;v:imagedata src="Creating%20Extensible%20Applications%20with%20MAF_files/image005.png"
  o:title="" croptop="-1068f" cropbottom="-276f" cropleft="-247f" cropright="-7858f"/&gt;
 &lt;o:lock v:ext="edit" aspectratio="f"/&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;
      &lt;!--[if !vml]--&gt;&lt;img src="http://www.julmar.com/blog/mark/content/binary/image006.png" alt="image006.png" border="0" height="184" width="434"&gt;
      &lt;br&gt;
      &lt;!--[endif]--&gt;
      &lt;/span&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;!--[if gte vml 1]&gt;&lt;v:shape id="O_x0020_5" o:spid="_x0000_s1026"
 type="#_x0000_t75" style='position:absolute;margin-left:251.55pt;margin-top:36.6pt;
 width:196.3pt;height:156.5pt;z-index:1;visibility:visible;
 mso-wrap-distance-left:9pt;mso-wrap-distance-top:.48pt;
 mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:1.04pt;
 mso-position-horizontal:absolute;mso-position-horizontal-relative:text;
 mso-position-vertical:absolute;mso-position-vertical-relative:text'
 wrapcoords="-221 0 -221 21327 21186 21327 21628 16132 21628 15311 21186 0 -221 0"
 o:gfxdata="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

CwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy

MjIy/8AAEQgAvgDEAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//E

ALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJ

ChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeI

iYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq

8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQH

BQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJico

KSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZ

mqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/a

AAwDAQACEQMRAD8A9isZ0t9DsXfOPIjHH+6Kf/atv/t/lVMf8i3Y/wDXKP8A9BrjtUW7n1mWG2F2

ZBaxmJorjZHE5ZxuZdw3DgcYbp0rRRTZEpNHe/2rb/7f5Uf2rb/7f5VxK6lfPESDbq0l41tExjYh

Apb5m+YZyFxgY5NMGq30zW0MbWscjicPJIjFSYmAyo3Dg89+PU45ORC52dz/AGrb/wC3+VH9q2/+

3+VcKutX9zLYpa2YbzII55gccKxwcEsuMYJzhu3Apkl5qVzcWjpcQRR/2hJCFEbEsqhx8x3DP3em

OuD7U+RBzv8Ar7zvf7Vt/R/yo/tW39H/ACrgpNWvlRIbK2EtxJPcAA/MNqORj5nXrkd+OwrTiu7g

6s1vOqxRmPdEuwkv03HeDgYJxjHoc0KCYc7Oq/tW39H/ACo/tW3/ANv8qxKKORBzs2/7Vt/9v8qP

7Vt/R/yrEoo5EHOzb/tW29H/ACo/tW29H/KsSijkQc7Nv+1bb0f8qP7VtvR/yrEoo5EHOzb/ALVt

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

BQYAAAAABgAGAH0BAABfLAAAAAA=

"&gt;
 &lt;v:imagedata src="Creating%20Extensible%20Applications%20with%20MAF_files/image007.png"
  o:title=""/&gt;
 &lt;o:lock v:ext="edit" aspectratio="f"/&gt;
 &lt;w:wrap type="tight"/&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;
      &lt;!--[if !vml]--&gt;
      &lt;!--[endif]--&gt;The directory names are required, but not case sensitive – each directory
      holding a single piece of the pipeline that MAF will load dynamically when it is loading
      the add-in.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;The host-side view is always located in the
      same directory as the host executable itself so it does not need a dedicated directory.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;When
      creating your Visual Studio project, it is important to set the output directories
      appropriately so that you create the above directory structure.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;In
      addition, all references between the components should be marked as CopyLocal = “false”
      in Visual Studio to ensure a local copy of the assembly isn’t placed into the sub-directory:&amp;nbsp; &lt;span style=""&gt;
      &lt;br&gt;
      &lt;/span&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;span style=""&gt;&lt;img src="http://www.julmar.com/blog/mark/content/binary/image008.png" alt="image008.png" border="0" height="159" width="198"&gt;
      &lt;br&gt;
      &lt;/span&gt;
   &lt;/p&gt;
   &lt;h2&gt;Discovering and loading add-ins from the host
   &lt;/h2&gt;
   &lt;p class="MsoNormal"&gt;
      The last piece of the puzzle is the actual loading of add-ins from the host.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;This
      is done in three basic steps:
   &lt;/p&gt;
   &lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"&gt;
      &lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;1.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;!--[endif]--&gt;Identify and catalog the add-ins
   &lt;/p&gt;
   &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"&gt;
      &lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;2.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;!--[endif]--&gt;Retrieve the list of specific add-ins based on view or name
   &lt;/p&gt;
   &lt;p class="MsoListParagraphCxSpLast" style="text-indent: -0.25in;"&gt;
      &lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;3.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;!--[endif]--&gt;Activate and use the add-in
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      The first step is to identify the available add-ins for the host.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;This
      is done through the &lt;b style=""&gt;System.AddIn.AddInStore&lt;/b&gt; class:
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;string[] errorList
      = AddInStore.Rebuild(&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;PipelineStoreLocation.ApplicationBase);&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      Calling &lt;b style=""&gt;Rebuild&lt;/b&gt; forces MAF to walk the directory structure and create
      the pipeline database.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;It stores this information in the
      pipeline root directory and returns a list of errors, if any occur.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;The
      most common errors are missing pipeline components – where MAF is unable to locate
      some required portion of the pipeline such as a View or Adapter.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      Next, the host will retrieve a list of add-ins based on the host view through the &lt;b style=""&gt;FindAddIns&lt;/b&gt; method
      – these will be the add-ins conforming to a specific contract (whatever the view/adapter
      is bound to):
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;Collection&amp;lt;AddInToken&amp;gt;
      addinTokens = AddInStore.FindAddIns(&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;typeof(TranslatorHostView),&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;PipelineStoreLocation.ApplicationBase);&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      The first parameter is the host view type – so MAF knows what add-ins we are looking
      for, the second is the pipeline root directory, which is the same directory passed
      to the &lt;b style=""&gt;Rebuild&lt;/b&gt; method and indicates where the pipeline database is
      stored.
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      The returning collection represents a series of &lt;i style=""&gt;tokens &lt;/i&gt;that are used
      to identify and control the add-ins.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;This is how the host
      can examine, activate and unload the add-in.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;To activate
      a specific add-in, you can take the token and call &lt;b style=""&gt;Activate&lt;/b&gt;:
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;Collection&amp;lt;AddInToken&amp;gt;
      addinTokens;&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;...&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;foreach (AddInToken token in
      addinTokens)&lt;br&gt;
      {&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;TranslatorHostView
      view =&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;token.Activate&amp;lt;TranslatorHostView&amp;gt;(&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AddInSecurityLevel.Internet);&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;string
      hello = view.Translate(“Bonjour”);&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;...&lt;br&gt;
      }&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      The &lt;b style=""&gt;Activate&lt;/b&gt; call loads all the required components, instantiates
      the add-in type and returns the host view used to interact with the add-in.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Calls
      made to this object will be marshaled back and forth to the add-in using the pipeline.
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      Notice that the parameter passed to &lt;b style=""&gt;Activate&lt;/b&gt; indicates the security
      level required.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;There are several overrides that allow
      you to dictate exactly how the add-in is loaded.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;You can
      load the add-in into a specific AppDomain – the current one for best performance:
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;token.Activate&amp;lt;TranslatorHostView&amp;gt;(AppDomain.CurrentDomain)&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      You can specify a specific permission set to restrict the things the add-in can do
      on your behalf:
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;PermissionSet pset = ...;&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;token.Activate&amp;lt;TranslatorHostView&amp;gt;(pset);&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;br&gt;
      Or you can specify a known permission set based on the CAS zones:
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;img src="http://www.julmar.com/blog/mark/content/binary/image010.png" alt="image010.png" border="0" height="102" width="244"&gt;
      &lt;br&gt;
      &lt;span style=""&gt;
      &lt;!--[if gte vml 1]&gt;&lt;v:shape id="P_x0020_11" o:spid="_x0000_i1025"
 type="#_x0000_t75" alt="image1.JPG" style='width:242pt;height:100pt;
 visibility:visible;mso-wrap-style:square'&gt;
 &lt;v:imagedata src="Creating%20Extensible%20Applications%20with%20MAF_files/image009.png"
  o:title="image1.JPG" chromakey="#f4f4f4"/&gt;
 &lt;v:textbox style='mso-rotate-with-shape:t'/&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;
      &lt;!--[if !vml]--&gt;
      &lt;!--[endif]--&gt;&lt;/span&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      Once the add-in is activated, the host can call it just like any other object – but
      never forget that you are likely crossing an isolation barrier!&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Make
      sure to design your contracts so that you minimize the number of calls between the
      host and add-ins to ensure your performance doesn’t suffer.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      When you are finished with the add-in, you can tell MAF to unload it through the &lt;b style=""&gt;AddInController&lt;/b&gt; associated
      with the view:
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;AddInController ctrl
      = &lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AddInController.GetAddInController(view);&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNoSpacing"&gt;
      &lt;b style=""&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;ctrl.Shutdown();&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;&lt;/b&gt;
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      &lt;br&gt;
      This will unload the add-in side pipeline and then destroy the containing AppDomain
      so you release the resources associated with it.
   &lt;/p&gt;
   &lt;p class="MsoNormal"&gt;
      There are many other capabilities MAF provides such as versioning, passing collections
      and WPF visuals, passing non-serializable types, etc.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;You
      can get a pretty decent overview of the features from &lt;a href="http://msdn.microsoft.com/en-us/library/bb384241.aspx"&gt;MSDN&lt;/a&gt; and
      the MAF team has a blog at &lt;a href="http://blogs.msdn.com/clraddins/"&gt;&lt;span style="font-family: &amp;quot;Lucida Grande&amp;quot;;"&gt;http://blogs.msdn.com/clraddins/&lt;/span&gt;&lt;/a&gt; that
      has some great, practical information on using this new framework.&lt;span style="font-family: &amp;quot;Lucida Grande&amp;quot;; color: black;"&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;
   &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.julmar.com/blog/mark/aggbug.ashx?id=4e4f6f4e-ca26-48e3-b096-c8dfc282209f" /&gt;</description>
      <category>.NET;Code;Real World</category>
    </item>
    <item>
      <trackback:ping>http://www.julmar.com/blog/mark/Trackback.aspx?guid=725cf1d9-3dc7-48f1-89f0-da8e3f3cfccb</trackback:ping>
      <pingback:server>http://www.julmar.com/blog/mark/pingback.aspx</pingback:server>
      <pingback:target>http://www.julmar.com/blog/mark/PermaLink,guid,725cf1d9-3dc7-48f1-89f0-da8e3f3cfccb.aspx</pingback:target>
      <dc:creator>mark@julmar.com (Mark)</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">A colleague at <a href="http://www.develop.com">DevelopMentor</a> recently
   asked me about creating popup windows in XAML browser applications (XBAP). Normally
   this is not allowed - if you try to create a top-level window you will get a <strong>SecurityException</strong> because
   WPF asks for <strong>UIPermission</strong> which is strictly prohibited when hosted
   in the browser. It turns out, however, that you <em>can</em> get a popup window -
   there's a hidden little gem in the <strong>System.Windows.Controls.Primitive</strong> namespace
   that is your friend: <strong>Popup</strong>. It's the same underlying class that ToolTip,
   Menu, and ComboBox use to display drop-down menus and overlays and it is browser-hosting
   aware! It's pretty limited in functionality - I'm not sure you can get it to move
   around with the mouse for example, but for simple cases it works great. Here's a code
   snippet - wire this up to a button in an XBAP:<br />
     <style type="text/css">

.csharpcode, .csharpcode pre

{

	font-size: small;

	color: black;

	font-family: Consolas, "Courier New", Courier, Monospace;

	background-color: #ffffff;

	/*white-space: pre;*/

}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 

{

	background-color: #f4f4f4;

	width: 100%;

	margin: 0em;

}

.csharpcode .lnum { color: #606060; }

</style><div class="csharpcode"><pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">void</span> OnClick(<span class="kwrd">object</span> sender,
      EventArgs e)</pre><pre><span class="lnum"> 2: </span>{</pre><pre class="alt"><span class="lnum"> 3: </span> Popup window = <span class="kwrd">new</span> Popup();</pre><pre><span class="lnum"> 4: </span> </pre><pre class="alt"><span class="lnum"> 5: </span> StackPanel sp = <span class="kwrd">new</span> StackPanel
      { Margin = <span class="kwrd">new</span> Thickness(5) };</pre><pre><span class="lnum"> 6: </span> sp.Children.Add(<span class="kwrd">new</span> TextBlock
      { Text = <span class="str">"Hi from a popup"</span> });</pre><pre class="alt"><span class="lnum"> 7: </span> Button newButton = <span class="kwrd">new</span> Button
      { Content = <span class="str">"Another button"</span> };</pre><pre><span class="lnum"> 8: </span> newButton.Click += <span class="kwrd">delegate</span> {
      window.IsOpen = <span class="kwrd">false</span>; };</pre><pre class="alt"><span class="lnum"> 9: </span> sp.Children.Add(newButton);</pre><pre><span class="lnum"> 10: </span> sp.Children.Add(<span class="kwrd">new</span> Slider
      { Minimum = 0, Maximum = 50, Value = 25, Width = 100 });</pre><pre class="alt"><span class="lnum"> 11: </span> </pre><pre><span class="lnum"> 12: </span> window.Child = <span class="kwrd">new</span> Border
      { Background = Brushes.White, BorderBrush = Brushes.Black, 
      <br />
      BorderThickness = <span class="kwrd">new</span> Thickness(2), Child = sp };</pre><pre class="alt"><span class="lnum"> 13: </span><b>window.PlacementTarget = <span class="kwrd">this<