﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Blog of Helmut Obertanner (en)</title>
    <description>Blog about VSTO, Office and Outlook development using .net languages.
News, Tips &amp; Tricks.</description>
    <link>http://www.outlooksharp.de/Home/tabid/36/BlogId/3/Default.aspx</link>
    <language>en-US</language>
    <managingEditor>Helmut Obertanner</managingEditor>
    <webMaster>flash@x4u.de</webMaster>
    <pubDate>Sat, 31 Jul 2010 01:04:59 GMT</pubDate>
    <lastBuildDate>Sat, 31 Jul 2010 01:04:59 GMT</lastBuildDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Blog RSS Generator Version 3.5.1.19887</generator>
    <item>
      <title>DotNetPro 07/2010: Going beyond the Outlook Object Model</title>
      <description>&lt;p&gt;In&lt;a href="http://www.dotnetpro.de/articles/articlearchive1750.aspx"&gt; Issue 07/2010 of the DotNetPro magazin&lt;/a&gt; is an article that I wrote about going behind the Outlook Object Model and using the Windows API to implement an additional event that is missing in the Outlook Version 2003, but new in Outlook 2007. This event is called Inspector "PageChanged" and is fired when the user has selected another page in the Inspector Window. I find this useful and had a requirement for a customer to have this also available in Outlook 2003. So I hacked something together and published an &lt;a href="http://www.dotnetpro.de/articles/articlearchive1750.aspx"&gt;article&lt;/a&gt; about it.
&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.dotnetpro.de/articles/articlearchive1750.aspx"&gt;&lt;img src="/Portals/0/Blog/Files/3/79/061910_1039_DotNetPro071.jpg" alt="" border="0"/&gt;&lt;/a&gt;
	&lt;/p&gt;&lt;p&gt;On this way I also want to say a big THANK YOU to the team of DotNetPro for supporting us at the Office Community Day 2010 at Microsoft/Unterschleißheim.
&lt;/p&gt;&lt;p&gt;Helmut Obertanner&lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/79/DotNetPro-07-2010-Going-beyond-the-Outlook-Object-Model.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/79/DotNetPro-07-2010-Going-beyond-the-Outlook-Object-Model.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/79/DotNetPro-07-2010-Going-beyond-the-Outlook-Object-Model.aspx</guid>
      <pubDate>Sat, 19 Jun 2010 10:39:44 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=79</trackback:ping>
    </item>
    <item>
      <title>Microsoft releases updated Time Zone Data Update Tool for Microsoft Office Outlook</title>
      <description>&lt;p&gt;&lt;span style="color:black; font-family:Verdana; font-size:13pt"&gt;Outlook Time Zone Data Update Tool 3.0
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana; font-size:13pt"&gt;&lt;span style="color:black"&gt;This tool solves problems with DSTs and time zones by updating Microsoft Outlook calendar entries.&lt;br/&gt;The knowledgebase article can be found here: &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;931667"/&gt;&lt;/span&gt;http://support.microsoft.com/default.aspx?scid=kb;EN-US;931667&lt;span style="color:black"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:black; font-family:Verdana; font-size:13pt"&gt;Affected Outlook versions: 2002 to 2010.&lt;br/&gt;There is a 32-bit and a 64-bit version of this tool available, also there's an extra tool for updating Exchange servers. 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana; font-size:13pt"&gt;&lt;span style="color:black"&gt;32-bit Version: &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=%20E343A233-B9C8-4652-9DD8-AE0F1AF62568"/&gt;&lt;/span&gt;http://www.microsoft.com/downloads/details.aspx?familyid=%20E343A233-B9C8-4652-9DD8-AE0F1AF62568&lt;span style="color:black"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana; font-size:13pt"&gt;&lt;span style="color:black"&gt;64-bit Version: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=4bf28882-789e-4a66-a56f-a3c3ef23e5a7"/&gt;&lt;/span&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=4bf28882-789e-4a66-a56f-a3c3ef23e5a7&lt;span style="color:black"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana; font-size:13pt"&gt;&lt;span style="color:black"&gt;Knowledgebase article for updating Exchangeservers: &lt;a href="http://support.microsoft.com/kb/941018/"/&gt;&lt;/span&gt;http://support.microsoft.com/kb/941018/&lt;span style="color:black"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana; font-size:13pt"&gt;&lt;span style="color:black"&gt;Exchangeserver Version: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=27BB0EE2-03AC-4E5B-AEC5-3E878490FCE1&amp;displaylang=en"/&gt;&lt;/span&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=27BB0EE2-03AC-4E5B-AEC5-3E878490FCE1&amp;displaylang=en&lt;span style="color:black"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/72/Microsoft-releases-updated-Time-Zone-Data-Update-Tool-for-Microsoft-Office-Outlook.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/72/Microsoft-releases-updated-Time-Zone-Data-Update-Tool-for-Microsoft-Office-Outlook.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/72/Microsoft-releases-updated-Time-Zone-Data-Update-Tool-for-Microsoft-Office-Outlook.aspx</guid>
      <pubDate>Fri, 04 Jun 2010 06:24:02 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=72</trackback:ping>
    </item>
    <item>
      <title>Windows7 tastes good!</title>
      <description>&lt;p&gt; &lt;/p&gt;&lt;a href=http://www.outlooksharp.de/Home/tabid/36/EntryId/64/Windows7-tastes-good.aspx&gt;More...&lt;/a&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/64/Windows7-tastes-good.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/64/Windows7-tastes-good.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/64/Windows7-tastes-good.aspx</guid>
      <pubDate>Mon, 08 Mar 2010 09:09:00 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=64</trackback:ping>
    </item>
    <item>
      <title>Outlook Personal Folders File Format specification available</title>
      <description>&lt;p&gt;Microsoft released documentation for the Outlook PST-File format.
&lt;/p&gt;&lt;p&gt;You can download the documentation as PDF-Files from this site:&lt;br/&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff385210.aspx"&gt;http://msdn.microsoft.com/en-us/library/ff385210.aspx&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/62/Outlook-Personal-Folders-File-Format-specification-available.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/62/Outlook-Personal-Folders-File-Format-specification-available.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/62/Outlook-Personal-Folders-File-Format-specification-available.aspx</guid>
      <pubDate>Mon, 08 Mar 2010 07:57:23 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=62</trackback:ping>
    </item>
    <item>
      <title>Enforcing business rules for Outlook Items</title>
      <description>&lt;p&gt;Recently I had a customer request helping forcing business rules when saving Outlook Contact Items. Luckily I programmed a sample on how to do this some time ago and published it on &lt;a href="http://www.outlookcode.com/codedetail.aspx?id=1336"&gt;Outlookcode.com&lt;/a&gt;. While this sample was programmed using a shared Add-in I decided to give it a refresh and update this sample using VSTO.
&lt;/p&gt;&lt;h2&gt;Inspector Wrapper
&lt;/h2&gt;&lt;p&gt;It all begins with an Inspector Wrapper template. I blogged about it and you can read it here: &lt;a href="http://www.outlooksharp.dehttp://www.outlooksharp.de/Home/tabid/36/EntryId/44/Outlook-Inspector-Wrapper-explained.aspx"&gt;http://www.outlooksharp.dehttp://www.outlooksharp.dehttp://www.outlooksharp.de/Home/tabid/36/EntryId/44/Outlook-Inspector-Wrapper-explained.aspx&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;The base for this code sample is to handle each Outlook Item individually. When an Item is opened within Outlook it is monitored by the Inspector. With the Wrapper code it is easy to handle all the &lt;em&gt;Inspectors&lt;/em&gt; gracefully. The Item behind the &lt;em&gt;Inspector&lt;/em&gt; is exposed by the &lt;em&gt;Inspector.CurrentItem&lt;/em&gt; property.  In this scenario we are enforcing business rules for Contacts.&lt;br/&gt;A &lt;em&gt;ContactItem&lt;/em&gt; exposes some Events that can be used to implement a small Framework that checks if all rules are met before a contact form is closed, or when someone is going to save the contact. We need to monitor the &lt;em&gt;write&lt;/em&gt; and the close events of all contact items. The &lt;em&gt;write&lt;/em&gt; and the &lt;em&gt;close&lt;/em&gt; events of the &lt;em&gt;ContactItem&lt;/em&gt; have a &lt;em&gt;Cancel&lt;/em&gt; Property that is passed by reference. When setting the &lt;em&gt;Cancel&lt;/em&gt; property to true, the operation is interrupted. First create a new Outlook Add-in solution.
&lt;/p&gt;&lt;p&gt;&lt;img src="/Portals/0/Blog/Files/1/53/122909_1815_Enforcingbu1.png" alt=""/&gt;
	&lt;/p&gt;&lt;p&gt;&lt;span style="color:#4f81bd; font-size:9pt"&gt;&lt;strong&gt;Picture 1: Create an Outlook Add-in
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;After creating the Add-in go on and implement the Inspector Wrapper code to handle all Items individually. The base class called InspectorWrapper.cs implements all Inspector events and handles them individually. If you want to handle ContactItems you need to derive a class of it and implement the code to handle ContactItems events and businesslogic here.&lt;br/&gt;Below is the code for the InspectorWrapper base class:
&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt; Eventhandler used to correctly clean up resources&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;param name="id"&gt;&lt;span style="color:green"&gt;The unique id of the Inspector instance&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
					&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;internal&lt;/span&gt;
			&lt;span style="color:blue"&gt;delegate&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;InspectorWrapperClosedEventHandler&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;Guid&lt;/span&gt; id);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt; The base class for all InspectorWrappers&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;internal&lt;/span&gt;
			&lt;span style="color:blue"&gt;abstract&lt;/span&gt;
			&lt;span style="color:blue"&gt;class&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;InspectorWrapper&lt;/span&gt; {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Event notifier for the InspectorWrapper.Closed event.&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Is raised when an Inspector has been closed.&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;event&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;InspectorWrapperClosedEventHandler&lt;/span&gt; Closed;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; The unique Id the identifies the Inspector Window&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;Guid&lt;/span&gt; Id { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;set&lt;/span&gt;; }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; The Outlook Inspector Instance&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;Inspector&lt;/span&gt; Inspector { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;set&lt;/span&gt;; }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; .ctor&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="inspector"&gt;&lt;span style="color:green"&gt;The Outlook Inspector instance that should be handled&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt; InspectorWrapper(Outlook.&lt;span style="color:#2b91af"&gt;Inspector&lt;/span&gt; inspector) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Id = &lt;span style="color:#2b91af"&gt;Guid&lt;/span&gt;.NewGuid();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Inspector = inspector;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// register for Inspector events here&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).Close += &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_CloseEventHandler&lt;/span&gt;(Inspector_Close);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).Activate += &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_ActivateEventHandler&lt;/span&gt;(Activate);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).Deactivate += &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_DeactivateEventHandler&lt;/span&gt;(Deactivate);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).BeforeMaximize += &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_BeforeMaximizeEventHandler&lt;/span&gt;(BeforeMaximize);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).BeforeMinimize += &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_BeforeMinimizeEventHandler&lt;/span&gt;(BeforeMinimize);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).BeforeMove += &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_BeforeMoveEventHandler&lt;/span&gt;(BeforeMove);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).BeforeSize += &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_BeforeSizeEventHandler&lt;/span&gt;(BeforeSize);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Only Outlook 2007((Outlook.InspectorEvents_10_Event)Inspector).PageChange += new Outlook.InspectorEvents_10_PageChangeEventHandler(PageChange);&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Initialize is called to give the derived Wrappers a chance to do initialization&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Initialize();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Eventhandler for the Inspector close event&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; Inspector_Close() {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// call the Close Method - the derived classes can implement cleanup code&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// by overriding the Close method&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Close();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// unregister Inspector events&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).Close -= &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_CloseEventHandler&lt;/span&gt;(Inspector_Close);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).Activate -= &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_ActivateEventHandler&lt;/span&gt;(Activate);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).Deactivate -= &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_DeactivateEventHandler&lt;/span&gt;(Deactivate);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).BeforeMaximize -= &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_BeforeMaximizeEventHandler&lt;/span&gt;(BeforeMaximize);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).BeforeMinimize -= &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_BeforeMinimizeEventHandler&lt;/span&gt;(BeforeMinimize);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).BeforeMove -= &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_BeforeMoveEventHandler&lt;/span&gt;(BeforeMove);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_Event&lt;/span&gt;)Inspector).BeforeSize -= &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;InspectorEvents_10_BeforeSizeEventHandler&lt;/span&gt;(BeforeSize);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Only Outlook 2007((Outlook.InspectorEvents_10_Event)Inspector).PageChange -= new Outlook.InspectorEvents_10_PageChangeEventHandler(PageChange);&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// clean up resources and do a GC.Collect();&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Inspector = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// raise the Close event.&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (Closed != &lt;span style="color:blue"&gt;null&lt;/span&gt;) Closed(Id);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Method is called after the internal initialization of the Wrapper&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;protected&lt;/span&gt;
			&lt;span style="color:blue"&gt;virtual&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; Initialize() { }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Method gets called when another Page of the Inspector has been selected&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="ActivePageName"&gt;&lt;span style="color:green"&gt;The active page name by reference&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;protected&lt;/span&gt;
			&lt;span style="color:blue"&gt;virtual&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; PageChange(&lt;span style="color:blue"&gt;ref&lt;/span&gt;
			&lt;span style="color:blue"&gt;string&lt;/span&gt; ActivePageName) { }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Method gets called before the Inspector is resized&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="Cancel"&gt;&lt;span style="color:green"&gt;To prevent resizing set Cancel to true&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;protected&lt;/span&gt;
			&lt;span style="color:blue"&gt;virtual&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; BeforeSize(&lt;span style="color:blue"&gt;ref&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; Cancel) { }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Method gets called before the Inspector is moved around&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="Cancel"&gt;&lt;span style="color:green"&gt;To prevent moving set Cancel to true&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;protected&lt;/span&gt;
			&lt;span style="color:blue"&gt;virtual&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; BeforeMove(&lt;span style="color:blue"&gt;ref&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; Cancel) { }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Method gets called before the Inspector is minimized&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="Cancel"&gt;&lt;span style="color:green"&gt;To prevent minimizing set Cancel to true&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;protected&lt;/span&gt;
			&lt;span style="color:blue"&gt;virtual&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; BeforeMinimize(&lt;span style="color:blue"&gt;ref&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; Cancel) { }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Method gets called before the Inspector is maximized&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="Cancel"&gt;&lt;span style="color:green"&gt;To prevent maximizing set Cancel to true&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;protected&lt;/span&gt;
			&lt;span style="color:blue"&gt;virtual&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; BeforeMaximize(&lt;span style="color:blue"&gt;ref&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; Cancel) { }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Method gets called when the Inspector is deactivated&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;protected&lt;/span&gt;
			&lt;span style="color:blue"&gt;virtual&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; Deactivate() { }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Method gets called when the Inspector is activated&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;protected&lt;/span&gt;
			&lt;span style="color:blue"&gt;virtual&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; Activate() { }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Derived classes can do a cleanup by overriding this method.&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;protected&lt;/span&gt;
			&lt;span style="color:blue"&gt;virtual&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; Close() { }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; This Fabric method returns a specific InspectorWrapper or null if not handled.&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="inspector"&gt;&lt;span style="color:green"&gt;The Outlook Inspector instance&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;returns&gt;&lt;span style="color:green"&gt;Returns the specific Wrapper or null&lt;span style="color:gray"&gt;&lt;/returns&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;static&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;InspectorWrapper&lt;/span&gt; GetWrapperFor(Outlook.&lt;span style="color:#2b91af"&gt;Inspector&lt;/span&gt; inspector) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// retrieve the message class using late binding&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;string&lt;/span&gt; messageClass = (&lt;span style="color:blue"&gt;string&lt;/span&gt;)inspector.CurrentItem.GetType().InvokeMember(&lt;span style="color:#a31515"&gt;"MessageClass"&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;BindingFlags&lt;/span&gt;.GetProperty, &lt;span style="color:blue"&gt;null&lt;/span&gt;, inspector.CurrentItem, &lt;span style="color:blue"&gt;null&lt;/span&gt;);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// depending on a messageclass you can instantiate different Wrappers&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// explicitely for a given MessageClass&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// using a switch statement&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;switch&lt;/span&gt; (messageClass) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;case&lt;/span&gt;
			&lt;span style="color:#a31515"&gt;"IPM.Contact"&lt;/span&gt;:
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;ContactItemWrapper&lt;/span&gt;(inspector);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;case&lt;/span&gt;
			&lt;span style="color:#a31515"&gt;"IPM.Journal"&lt;/span&gt;:
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;ContactItemWrapper&lt;/span&gt;(inspector);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;case&lt;/span&gt;
			&lt;span style="color:#a31515"&gt;"IPM.Note"&lt;/span&gt;:
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;MailItemWrapper&lt;/span&gt;(inspector);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;case&lt;/span&gt;
			&lt;span style="color:#a31515"&gt;"IPM.Post"&lt;/span&gt;:
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;PostItemWrapper&lt;/span&gt;(inspector);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;case&lt;/span&gt;
			&lt;span style="color:#a31515"&gt;"IPM.Task"&lt;/span&gt;:
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;TaskItemWrapper&lt;/span&gt;(inspector);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// or check if the messageclass begins with a specific fragment&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;//if (messageClass.StartsWith ("IPM.Contact.XXXX")){&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;//    return new CustomItemWrapper(inspector);&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;//}&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// or check the interface type of the Item&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (inspector.CurrentItem &lt;span style="color:blue"&gt;is&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;AppointmentItem&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;AppointmentItemWrapper&lt;/span&gt;(inspector);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// or check the interface type of the Item&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (inspector.CurrentItem &lt;span style="color:blue"&gt;is&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;ContactItem&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;ContactItemWrapper&lt;/span&gt;(inspector);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// no wrapper found&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Next you can see the ContactItemWrapper class. It is derived of the InspectorWrapper and used to handle all contacts in your application. Nothing fancy. How can you enforce business rules there? If you study the code you can see that in the Initialize method we register for the open, write and close events of the ContactItem. In C# the close event needs a special syntax, because there's already a close method for the ContactItem. To register for the event you need to cast directly to the &lt;em&gt;ItemEvents_10_Event &lt;/em&gt;interface&lt;em&gt;.&lt;/em&gt; After registering the events a method SetupBusinessRules is called. We discuss this in detail later – here is the code of the ContactItemWrapper class. 
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;internal&lt;/span&gt;
			&lt;span style="color:blue"&gt;class&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;ContactItemWrapper&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;InspectorWrapper&lt;/span&gt; {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; .ctor&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="inspector"&gt;&lt;span style="color:green"&gt;The Outlook Inspector instance that should be handled&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt; ContactItemWrapper(Outlook.&lt;span style="color:#2b91af"&gt;Inspector&lt;/span&gt; inspector)
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        : &lt;span style="color:blue"&gt;base&lt;/span&gt;(inspector) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; The Object instance behind the Inspector (CurrentItem)&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;ContactItem&lt;/span&gt; Item { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;set&lt;/span&gt;; }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Method is called when the Wrapper has been initialized&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;protected&lt;/span&gt;
			&lt;span style="color:blue"&gt;override&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; Initialize() {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Get the Item of the current Inspector&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Item = (Outlook.&lt;span style="color:#2b91af"&gt;ContactItem&lt;/span&gt;)Inspector.CurrentItem;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Register for the Item events&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Item.Open += &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;ItemEvents_10_OpenEventHandler&lt;/span&gt;(Item_Open);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Item.Write += &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;ItemEvents_10_WriteEventHandler&lt;/span&gt;(Item_Write);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;ItemEvents_10_Event&lt;/span&gt;)Item).Close += &lt;span style="color:blue"&gt;new&lt;/span&gt; Microsoft.Office.Interop.Outlook.&lt;span style="color:#2b91af"&gt;ItemEvents_10_CloseEventHandler&lt;/span&gt;(Item_Close);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        SetupBusinessRules();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; This Method is called when the Item is going to be closed&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="Cancel"&gt;&lt;/param&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; Item_Close(&lt;span style="color:blue"&gt;ref&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; Cancel) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (!Item.Saved) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            Cancel = !Validate();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; This Method is called when the Item is saved.&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="Cancel"&gt;&lt;span style="color:green"&gt;When set to true, the save operation is cancelled&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; Item_Write(&lt;span style="color:blue"&gt;ref&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; Cancel) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (!Item.Saved) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            Cancel = !Validate();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; This Method is called when the Item is visible and the UI is initialized.&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="Cancel"&gt;&lt;span style="color:green"&gt;When you set this property to true, the Inspector is closed.&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; Item_Open(&lt;span style="color:blue"&gt;ref&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; Cancel) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;//TODO: Implement something &lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; The Close Method is called when the Inspector has been closed.&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; Do your cleanup tasks here.&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; The UI is gone, can't access it here.&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;protected&lt;/span&gt;
			&lt;span style="color:blue"&gt;override&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; Close() {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// unregister events&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Item.Write -= &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;ItemEvents_10_WriteEventHandler&lt;/span&gt;(Item_Write);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Item.Open -= &lt;span style="color:blue"&gt;new&lt;/span&gt; Outlook.&lt;span style="color:#2b91af"&gt;ItemEvents_10_OpenEventHandler&lt;/span&gt;(Item_Open);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        ((Outlook.&lt;span style="color:#2b91af"&gt;ItemEvents_10_Event&lt;/span&gt;)Item).Close -= &lt;span style="color:blue"&gt;new&lt;/span&gt; Microsoft.Office.Interop.Outlook.&lt;span style="color:#2b91af"&gt;ItemEvents_10_CloseEventHandler&lt;/span&gt;(Item_Close);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        _BusinessRules.Clear();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        _BusinessRules = &lt;span style="color:blue"&gt;null&lt;/span&gt;; 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// required, just stting to NULL may keep a reference in memory of the Garbage Collector.&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Item = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;    #region&lt;/span&gt; business rule check methods
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;List&lt;/span&gt;&lt;&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt;&gt; _BusinessRules = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;List&lt;/span&gt;&lt;&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt;&gt;();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; SetupBusinessRules() {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        _BusinessRules.Add(&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt;(&lt;span style="color:#a31515"&gt;"LastNameUppercase"&lt;/span&gt;, &lt;span style="color:#a31515"&gt;"The Office Location is required and must be Uppercase."&lt;/span&gt;, &lt;span style="color:blue"&gt;this&lt;/span&gt;.BusinessRuleCheck_OfficeLocationRequiredAndUppercase));
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        _BusinessRules.Add(&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt;(&lt;span style="color:#a31515"&gt;"CompanyName3Letters"&lt;/span&gt;, &lt;span style="color:#a31515"&gt;"The Company Name must have a minimum length of 3."&lt;/span&gt;, &lt;span style="color:blue"&gt;this&lt;/span&gt;.BusinessRuleCheck_CompanyNameMinimum3Letters));
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; Validate() {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// if every business rule is valid we return true&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (_BusinessRules.TrueForAll(&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt;.IsRuleValid)) &lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:blue"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// no ?&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// show a warning to the user and &lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;StringBuilder&lt;/span&gt; message = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;StringBuilder&lt;/span&gt;(&lt;span style="color:brown"&gt;500&lt;/span&gt;);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        message.AppendLine(&lt;span style="color:#a31515"&gt;"You can't save this Item, because the following requirements are not met:"&lt;/span&gt;);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt; rule &lt;span style="color:blue"&gt;in&lt;/span&gt; _BusinessRules) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (!rule.IsValid()) message.AppendLine(rule.Description);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// display a message to the user what's wrong.&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;MessageBox&lt;/span&gt;.Show (&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;OutlookWin32Window&lt;/span&gt;(Inspector), message.ToString());
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:blue"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; BusinessRuleCheck_OfficeLocationRequiredAndUppercase() {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt; (!&lt;span style="color:blue"&gt;string&lt;/span&gt;.IsNullOrEmpty (Item.OfficeLocation) &amp;&amp; Item.OfficeLocation == Item.OfficeLocation.ToUpper());
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; BusinessRuleCheck_CompanyNameMinimum3Letters() {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt; (Item.CompanyName != &lt;span style="color:blue"&gt;null&lt;/span&gt; &amp;&amp; Item.CompanyName.Length &gt; &lt;span style="color:brown"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;    #endregion&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;h2&gt;Defining the business rules
&lt;/h2&gt;&lt;p&gt;First a class is defined that should describe a business rule. It has a name for identification and a description that should be displayed to the user if the rule is not validated successfully. It also has a pointer to a function that checks the business rule and returns true if it's valid. The Signature of such a rule check method is defined as a delegate.&lt;br/&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt; Delegate declares the Method signature that checks the BusinessRule and returns true or false&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;returns&gt;&lt;span style="color:green"&gt;True if the rule is ok&lt;span style="color:gray"&gt;&lt;/returns&gt;&lt;/span&gt;
					&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;delegate&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;BusinessRuleCheckMethod&lt;/span&gt;();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;In the constructor of the business rule you setup the name and description and the pointer to that method that validates the rule. There's another static method &lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;em&gt;IsRuleValid&lt;/em&gt;&lt;/span&gt; that just call the function and returns the result. It is defined as you can see next.
&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt; This class defines a business rule&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;class&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt; {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; The Name of the business rule&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;string&lt;/span&gt; Name { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;set&lt;/span&gt;; }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; A description displayed to the user if the rule is not met&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;string&lt;/span&gt; Description { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;set&lt;/span&gt;; }        
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;    
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; A function pointer that points to the method that checks if the business rule is valid&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;BusinessRuleCheckMethod&lt;/span&gt; IsValid { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;set&lt;/span&gt;; }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; .ctor&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="name"&gt;&lt;span style="color:green"&gt;The name&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="description"&gt;&lt;span style="color:green"&gt;The description&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="ruleValidator"&gt;&lt;span style="color:green"&gt;Function pointer to the validation method&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt; X4UBusinessRule(&lt;span style="color:blue"&gt;string&lt;/span&gt; name, &lt;span style="color:blue"&gt;string&lt;/span&gt; description, &lt;span style="color:#2b91af"&gt;BusinessRuleCheckMethod&lt;/span&gt; ruleValidator) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        IsValid = ruleValidator;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Name = name;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Description = description;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt; This method executes the method that the rule points to and returns the result&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;param name="rule"&gt;&lt;span style="color:green"&gt;The businesrule to check&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:gray"&gt;///&lt;span style="color:green"&gt;
					&lt;span style="color:gray"&gt;&lt;returns&gt;&lt;span style="color:green"&gt;True if the rule is valid&lt;span style="color:gray"&gt;&lt;/returns&gt;&lt;/span&gt;
						&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;static&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; IsRuleValid(&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt; rule) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt; rule.IsValid();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Next we take a look on setting up the rule check in the &lt;em&gt;ContactItemWrapper&lt;/em&gt; class. Just for reference there are two business rule check methods defined as you can see here:
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; BusinessRuleCheck_OfficeLocationRequiredAndUppercase() {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt; (!&lt;span style="color:blue"&gt;string&lt;/span&gt;.IsNullOrEmpty (Item.OfficeLocation) &amp;&amp; Item.OfficeLocation == Item.OfficeLocation.ToUpper());
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; BusinessRuleCheck_CompanyNameMinimum3Letters() {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt; (Item.CompanyName != &lt;span style="color:blue"&gt;null&lt;/span&gt; &amp;&amp; Item.CompanyName.Length &gt; &lt;span style="color:brown"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;The first method checks if the OfficeLocation property of the Item is not empty and uppercase. The second checks if the minimum length of the CompanyName property is 3 letters. You can define any kind of check – just make sure you return true when the rule is validated successfully. 
&lt;/p&gt;&lt;h2&gt;Validation
&lt;/h2&gt;&lt;p&gt;How and when are the rules validated? For that we define a Validate method that is called in the write and close events.&lt;br/&gt;The rules are stored in a list and so we can use the &lt;em&gt;TrueForAll&lt;/em&gt; statement to check all rules at once. If one of the rules fails, we display a message to the user and return the cause of the mistake. Here is the &lt;em&gt;Validate&lt;/em&gt; method.
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; Validate() {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// if every business rule is valid we return true&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (_BusinessRules.TrueForAll(&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt;.IsRuleValid)) &lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:blue"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// no ?&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// show a warning to the user and &lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;StringBuilder&lt;/span&gt; message = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;StringBuilder&lt;/span&gt;(&lt;span style="color:brown"&gt;500&lt;/span&gt;);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    message.AppendLine(&lt;span style="color:#a31515"&gt;"You can't save this Item, because the following requirements are not met:"&lt;/span&gt;);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt; rule &lt;span style="color:blue"&gt;in&lt;/span&gt; _BusinessRules) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (!rule.IsValid()) message.AppendLine(rule.Description);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// display a message to the user what's wrong.&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;MessageBox&lt;/span&gt;.Show (&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;OutlookWin32Window&lt;/span&gt;(Inspector), message.ToString());
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:blue"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;This is easy to implement. The Validate method is executed in the &lt;em&gt;Item.Write &lt;/em&gt;and in the &lt;em&gt;Item.Close&lt;/em&gt; event. You can see that in this method the Saved state of the Item is checked. When the Item isn't modified there's no need for a rule check. If the Validate method returns false, the &lt;em&gt;write&lt;/em&gt; or &lt;em&gt;close&lt;/em&gt; operation is canceled. The event handlers are defined as you can see here:
&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt; This Method is called when the Item is going to be closed&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;param name="Cancel"&gt;&lt;/param&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;void&lt;/span&gt; Item_Close(&lt;span style="color:blue"&gt;ref&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; Cancel) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (!Item.Saved) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Cancel = !Validate();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;summary&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt; This Method is called when the Item is saved.&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;/summary&gt;&lt;/span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Consolas; font-size:9pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;param name="Cancel"&gt;&lt;span style="color:green"&gt;When set to true, the save operation is cancelled&lt;span style="color:gray"&gt;&lt;/param&gt;&lt;/span&gt;
					&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;void&lt;/span&gt; Item_Write(&lt;span style="color:blue"&gt;ref&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; Cancel) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (!Item.Saved) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Cancel = !Validate();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;How to setup the business rule with function pointers? This is done using a single line of code.&lt;br/&gt;Just add a new Instance of a &lt;em&gt;BusinessRule&lt;/em&gt; class to the list and pass the name, description and the method as parameters to the constructor.
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:#2b91af"&gt;List&lt;/span&gt;&lt;&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt;&gt; _BusinessRules = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;List&lt;/span&gt;&lt;&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt;&gt;();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; SetupBusinessRules() {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _BusinessRules.Add(&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt;(&lt;span style="color:#a31515"&gt;"OfficeLocationRequiredAndUppercase"&lt;/span&gt;, &lt;span style="color:#a31515"&gt;"The Office Location is required and must be uppercase."&lt;/span&gt;, &lt;span style="color:blue"&gt;this&lt;/span&gt;.BusinessRuleCheck_OfficeLocationRequiredAndUppercase));
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _BusinessRules.Add(&lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;X4UBusinessRule&lt;/span&gt;(&lt;span style="color:#a31515"&gt;"CompanyName3Letters"&lt;/span&gt;, &lt;span style="color:#a31515"&gt;"The Company Name must have a minimum length of 3."&lt;/span&gt;, &lt;span style="color:blue"&gt;this&lt;/span&gt;.BusinessRuleCheck_CompanyNameMinimum3Letters));
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The code is executed whenever you modify or create a contact form and you try to save or close the form. When a rule is not valid, a MessageBox is displayed to the user as you can see in the screenshot.
&lt;/p&gt;&lt;p&gt;&lt;img src="/Portals/0/Blog/Files/1/53/122909_1815_Enforcingbu2.png" alt=""/&gt;
	&lt;/p&gt;&lt;p&gt;&lt;span style="color:#4f81bd; font-size:9pt"&gt;&lt;strong&gt;Picture 2: MessageBox showing that business rules are not valid
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;Sample code
&lt;/h2&gt;&lt;p&gt;You can download the code sample for this solution here:&lt;br/&gt;&lt;a href="http://www.outlooksharp.de/LinkClick.aspx?fileticket=QlrihpN8z2c%3d&amp;tabid=59&amp;mid=437&amp;forcedownload=true"&gt;Visual Studio 2010&lt;/a&gt;&lt;br/&gt;
	&lt;/p&gt;&lt;h2&gt;References
&lt;/h2&gt;&lt;p&gt;Outlook Inspector Object: &lt;a href="http://msdn.microsoft.com/en-us/library/bb176679.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb176679.aspx&lt;/a&gt;&lt;br/&gt;Outlook ContactItem Object: &lt;a href="http://msdn.microsoft.com/en-us/library/bb176651.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb176651.aspx&lt;/a&gt;&lt;br/&gt;InspectorWrapper: &lt;a href="http://www.outlooksharp.dehttp://www.outlooksharp.de/Home/tabid/36/EntryId/44/Outlook-Inspector-Wrapper-explained.aspx"&gt;http://www.outlooksharp.dehttp://www.outlooksharp.dehttp://www.outlooksharp.de/Home/tabid/36/EntryId/44/Outlook-Inspector-Wrapper-explained.aspx&lt;/a&gt;
	&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;br/&gt; &lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/53/Enforcing-business-rules-for-Outlook-Items.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/53/Enforcing-business-rules-for-Outlook-Items.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/53/Enforcing-business-rules-for-Outlook-Items.aspx</guid>
      <pubDate>Tue, 29 Dec 2009 18:16:18 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=53</trackback:ping>
    </item>
    <item>
      <title>Recursively Iterating Outlook Folders</title>
      <description>&lt;p&gt;In this small how-to we discuss different methods for iterating Outlook Folders and its subfolders.
&lt;/p&gt;&lt;p&gt;In the Outlook Object Model (OOM) a folder is represented by a type called MAPIFolder.&lt;br/&gt;There are different ways to retrieve a MAPIFolder instance:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Using the &lt;em&gt;Session.GetDefaultFolder(OlDefaultFolders)&lt;/em&gt; method to retrieve predefined folders like &lt;em&gt;Inbox&lt;/em&gt;
		&lt;/li&gt;&lt;li&gt;Using the &lt;em&gt;Session.GetFolderById(folderId, [optional] storeId)&lt;/em&gt; method to retrieve a Folder by its &lt;em&gt;EntryId&lt;/em&gt;
		&lt;/li&gt;&lt;li&gt;Retrieving the &lt;em&gt;Parent&lt;/em&gt;  Property of an &lt;em&gt;Item&lt;/em&gt; or another &lt;em&gt;Folder&lt;/em&gt;
		&lt;/li&gt;&lt;li&gt;Retrieving the &lt;em&gt;Explorer.CurrentFolder&lt;/em&gt; Property
&lt;/li&gt;&lt;li&gt;Iterate over the &lt;em&gt;Folders&lt;/em&gt; collection of a &lt;em&gt;Store&lt;/em&gt; or a &lt;em&gt;Folder&lt;/em&gt; instance.
&lt;/li&gt;&lt;li&gt;By creating a new &lt;em&gt;Folder&lt;/em&gt;
		&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Recursively iterating a folder tree and accessing Outlook Items can be a long running process. It depends on the amount of &lt;em&gt;Items&lt;/em&gt; in a &lt;em&gt;Folder&lt;/em&gt; and the levels of subfolders. When programming against the Outlook Object Model using .Net(managed) code you need to take care about memory management and how to use the COM Objects. Accessing and retrieving Outlook Objects like Emails, Appointments and Tasks could be very slow. This is by design and caused by the MAPI level where the Outlook Object Model is built on top.  It also depends on the configuration, if you are using an Exchangeserver, if you are working connected(online) or offline and how fast the network connection is.
&lt;/p&gt;&lt;h2&gt;RPC Connections problem
&lt;/h2&gt;&lt;p&gt;This problem occures only if you are connected to an Exchangeserver and when you access multiple Outlook Items in a short time. For each Item that you access by code, a connection (&lt;strong&gt;R&lt;/strong&gt;emote &lt;strong&gt;P&lt;/strong&gt;rocedure &lt;strong&gt;C&lt;/strong&gt;all) is made to the server and the item is retrieved or synchronized. By default the size of RPC-connections made to an Exchangeserver by one Client is limited to 256. If an Outlook solution is developed offline – or just with a few amount of test data – the developer may never run into this problem. When the solution is deployed to the customer and under heavy load you may get unexpected behavior. So whenever you iterate over Outlook Items you need to take care of this problem. First we simply iterate over Outlook Items in the Inbox. Let's discuss different possibilities. For testing purposes we define a method to get the Inbox Folder Object.
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; GetInboxFolder() {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;return&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;Globals&lt;/span&gt;.ThisAddIn.Application.Session.GetDefaultFolder(Outlook.&lt;span style="color:#2b91af"&gt;OlDefaultFolders&lt;/span&gt;.olFolderInbox);      
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;The first test iterates over the Inbox folder Items and traces the Subject of the Item.
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:green"&gt;// Get the Inbox folder&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; inboxFolder = GetInboxFolder();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:green"&gt;// Iterate over all Inbox items and get the Subject&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue"&gt;object&lt;/span&gt; item &lt;span style="color:blue"&gt;in&lt;/span&gt; inboxFolder.Items) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;Trace&lt;/span&gt;.WriteLine (item.GetType ().InvokeMember (&lt;span style="color:#a31515"&gt;"Subject"&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;BindingFlags&lt;/span&gt;.GetProperty, &lt;span style="color:blue"&gt;null&lt;/span&gt;, item, &lt;span style="color:blue"&gt;null&lt;/span&gt;)); 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;What's wrong with this code? Theoretically this code is OK, but&lt;br/&gt;- when there are more Items then available RPC-Connections?&lt;br/&gt;- an Outlook Items collection can change the number of items?&lt;br/&gt;- the process can't be interrupted until you iterated over all items&lt;br/&gt;- the process is running in the main thread of the Outlook process – this means that the GUI is not responsible until the method has finished.
&lt;/p&gt;&lt;h2&gt;How can you solve it?
&lt;/h2&gt;&lt;p&gt;First we avoid the RPC-connections problem. We will define a variable that counts the processed items. While iterating over the folder content we increase the count of it and after a predefined value we force the .Net garbage collector to release the references from memory. The problem is: The .Net Garbage Collector is intelligent. It caches the data you accessed for a while – so if you access the same item again within a specific time you get this object again very fast. This is also true for Outlook Objects. When you access an Object a reference is kept in memory - even when you set this object to null by code. The GC decides when to finally release an object. Alternatively you can force the GC to do a Cleanup. Note: A GC cleanup is very expensive by consuming CPU load and some time – GC often will slow down all Applications – so you need to find a good mix. It is absolutely a must to do a GC cleanup after using and releasing an Inspector or an Explorer object.  &lt;br/&gt;Study the next snippet.
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:green"&gt;// Get the Inbox folder&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; inboxFolder = GetInboxFolder();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;int&lt;/span&gt; watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:green"&gt;// Iterate over all Inbox items and get the Subject&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue"&gt;object&lt;/span&gt; item &lt;span style="color:blue"&gt;in&lt;/span&gt; inboxFolder.Items) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;Trace&lt;/span&gt;.WriteLine (item.GetType ().InvokeMember (&lt;span style="color:#a31515"&gt;"Subject"&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;BindingFlags&lt;/span&gt;.GetProperty, &lt;span style="color:blue"&gt;null&lt;/span&gt;, item, &lt;span style="color:blue"&gt;null&lt;/span&gt;));
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Ensures that not too many RPC connections are made to a Server&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    watchDog++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (watchDog &gt; &lt;span style="color:brown"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers(); 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The watchdog variable is used to force the Garbagecollector to release the COM objects from memory and close the RPC connections.&lt;br/&gt;Note that the &lt;em&gt;Folder.Items&lt;/em&gt; collection is not static – it can change its content at any time. Instead of iterating over the &lt;em&gt;Items&lt;/em&gt; collection using the &lt;em&gt;foreach&lt;/em&gt; statement, consider getting the collection count and process the items using a countdown loop. 
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:green"&gt;// Get the Inbox folder&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; inboxFolder = GetInboxFolder();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;int&lt;/span&gt; watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:green"&gt;// Iterate over all Inbox items and get the Subject&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; index = inboxFolder.Items.Count; index &gt; &lt;span style="color:brown"&gt;0&lt;/span&gt;; index-- ) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;object&lt;/span&gt; item = inboxFolder.Items[index];
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;Trace&lt;/span&gt;.WriteLine(item.GetType().InvokeMember(&lt;span style="color:#a31515"&gt;"Subject"&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;BindingFlags&lt;/span&gt;.GetProperty, &lt;span style="color:blue"&gt;null&lt;/span&gt;, item, &lt;span style="color:blue"&gt;null&lt;/span&gt;));
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;    
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    item = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Ensures that not too many RPC connections are made to a Server&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    watchDog++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (watchDog &gt; &lt;span style="color:brown"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The index variable is used for iterating over a number of items from last to first. This way you can delete or move items while iterating the collection. The iteration process still cannot be interrupted, because the process runs in the main thread of Outlook. To turn this into a stoppable and responsive iteration process, you need to use a thread for it. In the .Net Framework there is already a Framework that you can use called BackgroundWorker.&lt;br/&gt;Check out the next code snippet.
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt; _worker;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; ThisAddIn_Startup(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, System.&lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e)
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;{
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Setup the background thread&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt;();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker.DoWork += &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;DoWorkEventHandler&lt;/span&gt;(_worker_DoWork);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker.WorkerSupportsCancellation = &lt;span style="color:blue"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker.RunWorkerAsync();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;void&lt;/span&gt; _worker_DoWork(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af"&gt;DoWorkEventArgs&lt;/span&gt; e) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt; worker = (&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Get the Inbox folder&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; inboxFolder = GetInboxFolder();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;int&lt;/span&gt; watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Iterate over all Inbox items and get the Subject&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; index = inboxFolder.Items.Count; index &gt; &lt;span style="color:brown"&gt;0&lt;/span&gt;; index--) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// if someone interrupts the worker exit here&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (worker.CancellationPending) &lt;span style="color:blue"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;        
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;object&lt;/span&gt; item = inboxFolder.Items[index];
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;Trace&lt;/span&gt;.WriteLine(item.GetType().InvokeMember(&lt;span style="color:#a31515"&gt;"Subject"&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;BindingFlags&lt;/span&gt;.GetProperty, &lt;span style="color:blue"&gt;null&lt;/span&gt;, item, &lt;span style="color:blue"&gt;null&lt;/span&gt;));
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        item = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Ensures that not too many RPC connections are made to a Server&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        watchDog++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (watchDog &gt; &lt;span style="color:brown"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; ThisAddIn_Shutdown(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, System.&lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e)
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;{
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (_worker.IsBusy) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        _worker.CancelAsync();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Using a BackgroundWorker you can execute a long running process in a separate thread. The UI keeps responsive and you can interrupt the operation.
&lt;/p&gt;&lt;h2&gt;Recursive Operations
&lt;/h2&gt;&lt;p&gt;Next we are going to iterate recursively over a folder tree. We implement a function that calls itself recursively.
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;void&lt;/span&gt; IterateFolder(Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; folder) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;int&lt;/span&gt; watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Iterate over all Inbox items and get the Subject&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; index = folder.Items.Count; index &gt; &lt;span style="color:brown"&gt;0&lt;/span&gt;; index--) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;object&lt;/span&gt; item = folder.Items[index];
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;Trace&lt;/span&gt;.WriteLine(item.GetType().InvokeMember(&lt;span style="color:#a31515"&gt;"Subject"&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;BindingFlags&lt;/span&gt;.GetProperty, &lt;span style="color:blue"&gt;null&lt;/span&gt;, item, &lt;span style="color:blue"&gt;null&lt;/span&gt;));
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        item = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Ensures that not too many RPC connections are made to a Server&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        watchDog++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (watchDog &gt; &lt;span style="color:brown"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; index = folder.Folders.Count; index &gt; &lt;span style="color:brown"&gt;0&lt;/span&gt;; index--) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; subFolder = folder.Folders[index];
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Call this function recursively&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        IterateFolder(subFolder);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        subFolder = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Ensures that not too many RPC connections are made to a Server&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        watchDog++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (watchDog &gt; &lt;span style="color:brown"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;While this is working – it's not the best approach. Calling recursive functions can mess up the processor call stack. How can we solve this? &lt;br/&gt;One easy solution is to use a &lt;a href="http://msdn.microsoft.com/en-us/library/7977ey2c.aspx"&gt;Queue&lt;/a&gt; Object that is already part of the .Net Framework.  A Queue has two essentials Methods called &lt;em&gt;Enqueue()&lt;/em&gt; and &lt;em&gt;Dequeue().&lt;/em&gt;&lt;br/&gt;The &lt;em&gt;Enqueue&lt;/em&gt; inserts an object at the end while &lt;em&gt;Dequeue&lt;/em&gt; removes the first object of a &lt;a href="http://msdn.microsoft.com/en-us/library/7977ey2c.aspx"&gt;Queue&lt;/a&gt;. In this scenario EntryID's of the folders that needs to be iterated recursively are stored in a queue. In the worker method the number of items in the queue is checked and if there is an item in the queue, it is processed. The EntryID of the folder is removed of the &lt;a href="http://msdn.microsoft.com/en-us/library/7977ey2c.aspx"&gt;Queue&lt;/a&gt; and the folder is processed. While processing, each of the subfolders EntryID is added to the end of the Queue. This way there is no problem with the stack of the program and the process can be interrupted at any time. 
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt; _worker;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:#2b91af"&gt;Queue&lt;/span&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt; _folderIdsToProcess;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; ThisAddIn_Startup(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, System.&lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _folderIdsToProcess = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;Queue&lt;/span&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt;(); 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Get the Inbox folder&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; inboxFolder = GetInboxFolder();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// and add it to the queue&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _folderIdsToProcess.Enqueue(inboxFolder.EntryID);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Setup the background thread&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt;();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker.DoWork += &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;DoWorkEventHandler&lt;/span&gt;(_worker_DoWork);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker.WorkerSupportsCancellation = &lt;span style="color:blue"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker.RunWorkerAsync();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;void&lt;/span&gt; _worker_DoWork(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af"&gt;DoWorkEventArgs&lt;/span&gt; e) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt; worker = (&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; folder;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;int&lt;/span&gt; watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;while&lt;/span&gt; (_folderIdsToProcess.Count &gt; &lt;span style="color:brown"&gt;0&lt;/span&gt; &amp;&amp; !worker.CancellationPending) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// pick one folder&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;string&lt;/span&gt; entryId = _folderIdsToProcess.Dequeue();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        folder = &lt;span style="color:#2b91af"&gt;Globals&lt;/span&gt;.ThisAddIn.Application.Session.GetFolderFromID(entryId, &lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;.Missing);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Iterate over all Inbox items and get the Subject&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; index = folder.Items.Count; index &gt; &lt;span style="color:brown"&gt;0&lt;/span&gt;; index--) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (worker.CancellationPending) &lt;span style="color:blue"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;object&lt;/span&gt; item = folder.Items [index];
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;Trace&lt;/span&gt;.WriteLine(item.GetType().InvokeMember(&lt;span style="color:#a31515"&gt;"Subject"&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;BindingFlags&lt;/span&gt;.GetProperty, &lt;span style="color:blue"&gt;null&lt;/span&gt;, item, &lt;span style="color:blue"&gt;null&lt;/span&gt;));
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            item = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Ensures that not too many RPC connections are made to a Server&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            watchDog++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (watchDog &gt; &lt;span style="color:brown"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;                watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; index = folder.Folders.Count; index &gt; &lt;span style="color:brown"&gt;0&lt;/span&gt;; index--) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (worker.CancellationPending) &lt;span style="color:blue"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; subFolder = folder.Folders[index];
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Call this function recursively&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            _folderIdsToProcess.Enqueue(subFolder.EntryID);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            subFolder = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Ensures that not too many RPC connections are made to a Server&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            watchDog++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (watchDog &gt; &lt;span style="color:brown"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;                watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        folder = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; ThisAddIn_Shutdown(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, System.&lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (_worker.IsBusy) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        _worker.CancelAsync();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;There is no problem accessing the queue variable by different threads because the Queue is modified only by the worker thread.
&lt;/p&gt;&lt;h2&gt;Making things go faster
&lt;/h2&gt;&lt;p&gt;You may notice that iterating over a large number of Items costs a lot of time. There are a few Options that may help you to optimize your application. The first option is to use a Filter to restrict the number of items in a folder. Let's say you want to search for Items that are modified after a specific time. 
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt; _worker;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:#2b91af"&gt;Queue&lt;/span&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt; _folderIdsToProcess;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; ThisAddIn_Startup(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, System.&lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _folderIdsToProcess = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;Queue&lt;/span&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt;(); 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Get the Inbox folder&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; inboxFolder = GetInboxFolder();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// and add it to the queue&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _folderIdsToProcess.Enqueue(inboxFolder.EntryID);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// build a filter
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:green; font-family:Consolas; font-size:9pt"&gt;    // note that this filter is build a little bit complicated
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:green"&gt;    // This works even if you are using an Outlook even with another language format, not only en-us&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt; from = &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;.Now.AddMonths(-&lt;span style="color:brown"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt; to = &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;.Now;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;string&lt;/span&gt; filter = &lt;span style="color:blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515"&gt;"[LastModificationTime] &gt; '{0}/{1}/{2}' AND [LastModificationTime] &lt;='{3}/{4}/{5}'"&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        , from.Year, from.Month, from.Day
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        , to.Year, to.Month, to.Day); 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Setup the background thread&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt;();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker.DoWork += &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;DoWorkEventHandler&lt;/span&gt;(_worker_DoWork);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker.WorkerSupportsCancellation = &lt;span style="color:blue"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker.RunWorkerAsync(filter);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;void&lt;/span&gt; _worker_DoWork(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af"&gt;DoWorkEventArgs&lt;/span&gt; e) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt; worker = (&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;string&lt;/span&gt; filter = (&lt;span style="color:blue"&gt;string&lt;/span&gt;)e.Argument;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; folder;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;int&lt;/span&gt; watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;while&lt;/span&gt; (_folderIdsToProcess.Count &gt; &lt;span style="color:brown"&gt;0&lt;/span&gt; &amp;&amp; !worker.CancellationPending) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// pick one folder&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;string&lt;/span&gt; entryId = _folderIdsToProcess.Dequeue();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        folder = &lt;span style="color:#2b91af"&gt;Globals&lt;/span&gt;.ThisAddIn.Application.Session.GetFolderFromID(entryId, &lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;.Missing);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Outlook.&lt;span style="color:#2b91af"&gt;Items&lt;/span&gt; items = folder.Items.Restrict(filter);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Iterate over all Inbox items and get the Subject&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; index = items.Count; index &gt; &lt;span style="color:brown"&gt;0&lt;/span&gt;; index--) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (worker.CancellationPending) &lt;span style="color:blue"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;object&lt;/span&gt; item = items[index];
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;Trace&lt;/span&gt;.WriteLine(item.GetType().InvokeMember(&lt;span style="color:#a31515"&gt;"Subject"&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;BindingFlags&lt;/span&gt;.GetProperty, &lt;span style="color:blue"&gt;null&lt;/span&gt;, item, &lt;span style="color:blue"&gt;null&lt;/span&gt;));
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            item = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Ensures that not too many RPC connections are made to a Server&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            watchDog++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (watchDog &gt; &lt;span style="color:brown"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;                watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; index = folder.Folders.Count; index &gt; &lt;span style="color:brown"&gt;0&lt;/span&gt;; index--) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (worker.CancellationPending) &lt;span style="color:blue"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; subFolder = folder.Folders[index];
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Call this function recursively&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            _folderIdsToProcess.Enqueue(subFolder.EntryID);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            subFolder = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Ensures that not too many RPC connections are made to a Server&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            watchDog++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (watchDog &gt; &lt;span style="color:brown"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;                watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        items = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        folder = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; ThisAddIn_Shutdown(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, System.&lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (_worker.IsBusy) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        _worker.CancelAsync();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Note that you cannot use every property to restrict the number of items in a folder.
&lt;/p&gt;&lt;h2&gt;The Table Object
&lt;/h2&gt;&lt;p&gt;Starting from Outlook 2007 there is a new &lt;a href="http://msdn.microsoft.com/en-us/library/bb176406.aspx"&gt;&lt;em&gt;Table&lt;/em&gt;&lt;/a&gt; object in the OOM that provides a fast access to the Folder table. It's fast because you can decide on what columns you want to retrieve on each row. You may get the best performance if you need just information that can be retrieved directly as column in the row of a table. In the code above we used only the properties &lt;em&gt;LastModificationTime&lt;/em&gt; and &lt;em&gt;Subject&lt;/em&gt;. Let's see if we can speed things a little bit. To measure success, the code is slightly modified to count the number of items processed and the duration of the whole process. The Test using Outlook items has the following result:
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:8pt"&gt;Processing 773 items took 11262ms
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;After modifying the code to use a table object instead, the test read the following values:
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:8pt"&gt;Processing 773 items took 15162ms
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Funny. All of my tests using Outlook2010 showing that using the &lt;em&gt;Folder.Table&lt;/em&gt; object is slower than iterating over the Outlook Items. Theoretically using &lt;em&gt;GetTable()&lt;/em&gt; should be much faster than iterating over an Outlook Item collection. But it isn't.
&lt;/p&gt;&lt;p&gt;Here is the code:
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt; _worker;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:#2b91af"&gt;Queue&lt;/span&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt; _folderIdsToProcess;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; ThisAddIn_Startup(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, System.&lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e)
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;{
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _folderIdsToProcess = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;Queue&lt;/span&gt;&lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&gt;(); 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Get the Inbox folder&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; inboxFolder = GetInboxFolder();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// and add it to the queue&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _folderIdsToProcess.Enqueue(inboxFolder.EntryID);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// build a filter&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt; from = &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;.Now.AddMonths(-&lt;span style="color:brown"&gt;6&lt;/span&gt;);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt; to = &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;.Now;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;string&lt;/span&gt; filter = &lt;span style="color:blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515"&gt;"[LastModificationTime] &gt; '{0}/{1}/{2}' AND [LastModificationTime] &lt;='{3}/{4}/{5}'"&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        , from.Year, from.Month, from.Day
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        , to.Year, to.Month, to.Day); 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Setup the background thread&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt;();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker.DoWork += &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;DoWorkEventHandler&lt;/span&gt;(_worker_DoWork);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker.WorkerSupportsCancellation = &lt;span style="color:blue"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    _worker.RunWorkerAsync(filter);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;void&lt;/span&gt; _worker_DoWork(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af"&gt;DoWorkEventArgs&lt;/span&gt; e) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt; worker = (&lt;span style="color:#2b91af"&gt;BackgroundWorker&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;string&lt;/span&gt; filter = (&lt;span style="color:blue"&gt;string&lt;/span&gt;)e.Argument;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; folder;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;int&lt;/span&gt; itemsProcessed = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;Stopwatch&lt;/span&gt; watch = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;Stopwatch&lt;/span&gt;();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    watch.Start();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;int&lt;/span&gt; watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;while&lt;/span&gt; (_folderIdsToProcess.Count &gt; &lt;span style="color:brown"&gt;0&lt;/span&gt; &amp;&amp; !worker.CancellationPending) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// pick one folder&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;string&lt;/span&gt; entryId = _folderIdsToProcess.Dequeue();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        folder = &lt;span style="color:#2b91af"&gt;Globals&lt;/span&gt;.ThisAddIn.Application.Session.GetFolderFromID(entryId, &lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;.Missing);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Outlook.&lt;span style="color:#2b91af"&gt;Table&lt;/span&gt; table = folder.GetTable(filter, Outlook.&lt;span style="color:#2b91af"&gt;OlTableContents&lt;/span&gt;.olUserItems);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// try to get the first row&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Outlook.&lt;span style="color:#2b91af"&gt;Row&lt;/span&gt; row = table.GetNextRow ();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Iterate over all Inbox items and get the Subject&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;while&lt;/span&gt; (!table.EndOfTable  ) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (worker.CancellationPending) &lt;span style="color:blue"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;string&lt;/span&gt; subject = (&lt;span style="color:blue"&gt;string&lt;/span&gt;) row[&lt;span style="color:#a31515"&gt;"Subject"&lt;/span&gt;];
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;Trace&lt;/span&gt;.WriteLine(subject);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            itemsProcessed++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            row = table.GetNextRow();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Ensures that not too many RPC connections are made to a Server&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            watchDog++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (watchDog &gt; &lt;span style="color:brown"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;                watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; index = folder.Folders.Count; index &gt; &lt;span style="color:brown"&gt;0&lt;/span&gt;; index--) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (worker.CancellationPending) &lt;span style="color:blue"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            Outlook.&lt;span style="color:#2b91af"&gt;MAPIFolder&lt;/span&gt; subFolder = folder.Folders[index];
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Call this function recursively&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            _folderIdsToProcess.Enqueue(subFolder.EntryID);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            subFolder = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Ensures that not too many RPC connections are made to a Server&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            watchDog++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (watchDog &gt; &lt;span style="color:brown"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;                watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        table = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        folder = &lt;span style="color:blue"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;Trace&lt;/span&gt;.WriteLine(&lt;span style="color:blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515"&gt;"Processing {0} items took {1}ms"&lt;/span&gt;, itemsProcessed, watch.ElapsedMilliseconds));
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; ThisAddIn_Shutdown(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, System.&lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e)
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;{
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (_worker.IsBusy) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        _worker.CancelAsync();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;The next enhancement would be to use two threads that work together. One thread enumerates all folders and adds the items into a Queue, a second thread processes all the Items. 
&lt;/p&gt;&lt;h2&gt;Avoiding to collect the GC
&lt;/h2&gt;&lt;p&gt;While this is necessary to cleanly release COM objects – forcing the GC can be time consuming and affects all running .Net programs. In the loop we are calling the function to avoid a specific problem when connected online to Exchange. If Outlook is offline there's no need for the workaround.
&lt;/p&gt;&lt;p&gt;Here is the optimized code:
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;&lt;span style="color:blue"&gt;private&lt;/span&gt;
			&lt;span style="color:blue"&gt;void&lt;/span&gt; IncreaseWatchdogAndCallGCIfOnline(&lt;span style="color:blue"&gt;ref&lt;/span&gt;
			&lt;span style="color:blue"&gt;int&lt;/span&gt; watchDog) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    watchDog++;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (watchDog &gt; &lt;span style="color:brown"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        Outlook.&lt;span style="color:#2b91af"&gt;OlExchangeConnectionMode&lt;/span&gt; mode = &lt;span style="color:#2b91af"&gt;Globals&lt;/span&gt;.ThisAddIn.Application.Session.ExchangeConnectionMode;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (mode == Outlook.&lt;span style="color:#2b91af"&gt;OlExchangeConnectionMode&lt;/span&gt;.olCachedConnectedDrizzle
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            || mode == Outlook.&lt;span style="color:#2b91af"&gt;OlExchangeConnectionMode&lt;/span&gt;.olCachedConnectedFull
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            || mode == Outlook.&lt;span style="color:#2b91af"&gt;OlExchangeConnectionMode&lt;/span&gt;.olCachedConnectedHeaders
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;            || mode == Outlook.&lt;span style="color:#2b91af"&gt;OlExchangeConnectionMode&lt;/span&gt;.olOnline) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:green"&gt;// Ensures that not too many RPC connections are made to a Server&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.Collect();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;
			&lt;span style="color:#2b91af"&gt;GC&lt;/span&gt;.WaitForPendingFinalizers();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        }                    
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;        watchDog = &lt;span style="color:brown"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas; font-size:9pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;h2&gt;References
&lt;/h2&gt;&lt;p&gt;Outlook Folder Object: &lt;a href="http://msdn.microsoft.com/en-us/library/bb176362.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb176362.aspx&lt;/a&gt;&lt;br/&gt;Outlook Table Object: &lt;a href="http://msdn.microsoft.com/en-us/library/bb176406.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb176406.aspx&lt;/a&gt;&lt;br/&gt;.Net Queue Object: &lt;a href="http://msdn.microsoft.com/en-us/library/7977ey2c.aspx"&gt;http://msdn.microsoft.com/en-us/library/7977ey2c.aspx&lt;/a&gt;&lt;br/&gt;
	&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/50/Recursively-Iterating-Outlook-Folders.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/50/Recursively-Iterating-Outlook-Folders.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/50/Recursively-Iterating-Outlook-Folders.aspx</guid>
      <pubDate>Fri, 25 Dec 2009 21:01:14 GMT</pubDate>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=50</trackback:ping>
    </item>
    <item>
      <title>New developer content for Office 2010(Beta) available</title>
      <description>&lt;p&gt;&lt;span style="color:#1f497d"&gt;Today the Outlook team has posted new developer content for Office2010(Beta version) on MSDN. Enjoy!
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee692176(office.14).aspx"&gt;http://msdn.microsoft.com/en-us/library/ee692176(office.14).aspx&lt;/a&gt;&lt;span style="color:#1f497d"&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#1f497d"&gt;Here you can see what's new for Outlook developers:
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee692174(office.14).aspx"&gt;http://msdn.microsoft.com/en-us/library/ee692174(office.14).aspx&lt;/a&gt;&lt;span style="color:#1f497d"&gt;
		&lt;/span&gt;&lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/47/New-developer-content-for-Office-2010-Beta-available.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/47/New-developer-content-for-Office-2010-Beta-available.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/47/New-developer-content-for-Office-2010-Beta-available.aspx</guid>
      <pubDate>Thu, 12 Nov 2009 18:48:07 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=47</trackback:ping>
    </item>
    <item>
      <title>A Haunted House Control Unit – Talk to USB from C#</title>
      <description>&lt;p&gt; &lt;/p&gt;&lt;a href=http://www.outlooksharp.de/Home/tabid/36/EntryId/46/A-Haunted-House-Control-Unit-Talk-to-USB-from-C.aspx&gt;More...&lt;/a&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/46/A-Haunted-House-Control-Unit-Talk-to-USB-from-C.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/46/A-Haunted-House-Control-Unit-Talk-to-USB-from-C.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/46/A-Haunted-House-Control-Unit-Talk-to-USB-from-C.aspx</guid>
      <pubDate>Sun, 08 Nov 2009 19:08:08 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=46</trackback:ping>
    </item>
    <item>
      <title>Outlook Inspector Wrapper explained</title>
      <description>&lt;p&gt; &lt;/p&gt;&lt;a href=http://www.outlooksharp.de/Home/tabid/36/EntryId/44/Outlook-Inspector-Wrapper-explained.aspx&gt;More...&lt;/a&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/44/Outlook-Inspector-Wrapper-explained.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/44/Outlook-Inspector-Wrapper-explained.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/44/Outlook-Inspector-Wrapper-explained.aspx</guid>
      <pubDate>Sun, 01 Nov 2009 20:54:58 GMT</pubDate>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=44</trackback:ping>
    </item>
    <item>
      <title>All-In-One Code Framework</title>
      <description>&lt;p&gt;Found this Project on Codeplex.
&lt;/p&gt;&lt;p&gt;&lt;a href="http://cfx.codeplex.com"&gt;&lt;span style="font-family:Segoe UI; font-size:9pt"&gt;&lt;strong&gt;All-In-One Code Framework&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="color:#30332d; font-family:Segoe UI; font-size:9pt"&gt; code-name &lt;strong&gt;CodeFx&lt;/strong&gt; delineates the framework and skeleton of most Microsoft development techniques (e.g. COM, Data Access, IPC) using typical sample codes in different programming languages (e.g. Visual C#, VB.NET, Visual C++).
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#30332d; font-family:Segoe UI; font-size:9pt"&gt;The target of the project is to sketch the skeleton of most Microsoft development techniques using typical sample codes that are frequently-asked, tested or used.&lt;/span&gt;&lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/41/All-In-One-Code-Framework.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/41/All-In-One-Code-Framework.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/41/All-In-One-Code-Framework.aspx</guid>
      <pubDate>Wed, 09 Sep 2009 06:48:16 GMT</pubDate>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=41</trackback:ping>
    </item>
  </channel>
</rss>