﻿<?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 von Helmut Obertanner</title>
    <description>Deutscher Blog über VSTO und andere aktivitäten</description>
    <link>http://www.outlooksharp.de/Home/tabid/36/BlogId/2/Default.aspx</link>
    <language>en-US</language>
    <managingEditor>Helmut Obertanner</managingEditor>
    <webMaster>flash@x4u.de</webMaster>
    <pubDate>Thu, 11 Mar 2010 10:40:01 GMT</pubDate>
    <lastBuildDate>Thu, 11 Mar 2010 10:40:01 GMT</lastBuildDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Blog RSS Generator Version 3.5.1.19887</generator>
    <item>
      <title>Windows7 schmeckt gut!</title>
      <description>&lt;p&gt;Kollegen lieben MVPs!
&lt;/p&gt;&lt;p&gt;&lt;img src="/Portals/0/Blog/Files/2/63/030810_0907_Windows7sch1.png" alt=""/&gt;&lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/63/Windows7-schmeckt-gut.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/63/Windows7-schmeckt-gut.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/63/Windows7-schmeckt-gut.aspx</guid>
      <pubDate>Mon, 08 Mar 2010 09:07:24 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=63</trackback:ping>
    </item>
    <item>
      <title>Dokumentation für Outlook PST-Format veröffentlicht</title>
      <description>&lt;p&gt;&lt;span style="color:#2c2c2c"&gt;Unter folgendem Link:
&lt;/span&gt;&lt;/p&gt;&lt;p&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;&lt;p&gt;Steht seit kurzem die Dokumentation für das Microsoft Outlook PST Datei-Format zur Verfügung.&lt;br/&gt;&lt;span style="color:#444444"&gt;Im Rahmen der &lt;a href="http://co1piltwb.partners.extranet.microsoft.com/mcoeredir/mcoeredirect.aspx?linkId=13292220&amp;s1=b3afca32-89ac-1b23-c80f-d3e925ae79c6" target="_blank"/&gt;&lt;/span&gt;Interoperabilitätsoffensive&lt;span style="color:#444444"&gt; steht jetzt in der MSDN Library die angekündigte Dokumentation für das PST-Dateiformat der Outlook-Datendateien zum Abruf bereit. Somit ist der Zugriff auf E-Mails, Kalender, Kontakte und andere Outlook-generierte Daten auch außerhalb dokumentierter APIs geöffnet. Selbstverständlich stehen auch die Seiten bereits &lt;a href="http://co1piltwb.partners.extranet.microsoft.com/mcoeredir/mcoeredirect.aspx?linkId=13292221&amp;s1=b3afca32-89ac-1b23-c80f-d3e925ae79c6" target="_blank"/&gt;&lt;/span&gt;veröffentlichter Dokumentationen der Office- und Windows-Dateiformate und -Protokolle&lt;span style="color:#444444"&gt; weiterhin kostenfrei zur Lektüre bereit.
&lt;/span&gt;&lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/61/Dokumentation-fur-Outlook-PST-Format-veroffentlicht.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/61/Dokumentation-fur-Outlook-PST-Format-veroffentlicht.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/61/Dokumentation-fur-Outlook-PST-Format-veroffentlicht.aspx</guid>
      <pubDate>Mon, 08 Mar 2010 07:51:54 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=61</trackback:ping>
    </item>
    <item>
      <title>10 Lizenzen zu verschenken – 30% Rabatt</title>
      <description>&lt;p&gt;Instyler Software hat ein Outlook-Add-in zur Verwaltung von Fahrtzeiten entwickelt.&lt;br/&gt;Das Add-in ist ideal für Geschäftsreisende und Freiberufler und unterstützt bei der Fahrtzeitenplanung.&lt;br/&gt;&lt;a href="http://www.instyler.com/"&gt;http://www.instyler.com/&lt;/a&gt;
	&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.instyler.com/"&gt;&lt;img src="/Portals/0/Blog/Files/2/59/012910_1951_10Lizenzenz1.png" alt="" border="0"/&gt;&lt;/a&gt;
	&lt;/p&gt;&lt;p&gt;Dank der guten Zusammenarbeit kann ich meinen treuen Blog-Lesern freundlicherweise 10 Lizenzen (Max. 1 Lizenz pro Benutzer) gratis zur Verfügung stellen.&lt;br/&gt;Die ersten 10 Leser welche eine Email mit Betreff: &lt;strong&gt;Travel Add-in&lt;/strong&gt; über das &lt;a href="http://www.x4u.de/Impressum/Feedback.aspx"&gt;Feedbackformular&lt;/a&gt; an mich senden, erhalten eine Travel Add-in Lizenz gratis. 
&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.instyler.com/"&gt;&lt;img src="/Portals/0/Blog/Files/2/59/012910_1951_10Lizenzenz2.png" alt="" border="0"/&gt;&lt;/a&gt;
	&lt;/p&gt;&lt;p&gt;Wenn Sie nicht zu den Gewinnern zählen und Ihnen die Software trotzdem gefällt, können Sie beim Kauf den&lt;br/&gt;Gutscheincode: &lt;strong&gt;TRAVELX4U&lt;/strong&gt;&lt;br/&gt;angeben, sie erhalten auf jede Lizenz einen Rabatt von 30% auf den aktuellen Kaufpreis.
&lt;/p&gt;&lt;p&gt;Das Add-in kann heruntergeladen werden, und vor dem Kauf 30 Tage ohne Einschränkungen getestet werden.
&lt;/p&gt;&lt;p&gt;Helmut Obertanner&lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/59/10-Lizenzen-zu-verschenken-30-Rabatt.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/59/10-Lizenzen-zu-verschenken-30-Rabatt.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/59/10-Lizenzen-zu-verschenken-30-Rabatt.aspx</guid>
      <pubDate>Fri, 29 Jan 2010 19:51:13 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=59</trackback:ping>
    </item>
    <item>
      <title>Kostenloses SharePoint eMagazin</title>
      <description>&lt;p&gt;Die Niederländische Benutzergruppe (DIUWG) hat ein SharePoint eMagazin herausgegeben. Das Magazin richtet sich an Entwickler, IT-Profis und Power-Benutzer. Es ist die erste Ausgabe des Magazins und es ist pro Jahr 4 eMagazine und 4 Magazine im Papierformat herauszugeben.
&lt;/p&gt;&lt;p&gt;Das Magazin ist in englischer Sprache.
&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.sdn.nl/IW/FreeMagazine/tabid/139/Default.aspx"&gt;http://www.sdn.nl/IW/FreeMagazine/tabid/139/Default.aspx&lt;/a&gt;
	&lt;/p&gt;&lt;p&gt;Viel Spaß.&lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/58/Kostenloses-SharePoint-eMagazin.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/58/Kostenloses-SharePoint-eMagazin.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/58/Kostenloses-SharePoint-eMagazin.aspx</guid>
      <pubDate>Mon, 18 Jan 2010 20:04:46 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=58</trackback:ping>
    </item>
    <item>
      <title>Outlook Formular per Code schliessen</title>
      <description>&lt;p&gt;In diesem Beispiel möchte ich über meine Erfahrungen zum über das Schliessen eines Formulars per Programmcode berichten.
&lt;/p&gt;&lt;p&gt;Vor kurzem habe ich ein Beispiel zum Überprüfen und Absichern von Geschäftsregeln in einem Outlook Add-in berichtet:&lt;br/&gt;&lt;a href="http://www.outlooksharp.de/Home/tabid/36/EntryId/54/Geschaftsregeln-fur-Outlook-Formulare.aspx"&gt;http://www.outlooksharp.dehttp://www.outlooksharp.de/Home/tabid/36/EntryId/54/Geschaftsregeln-fur-Outlook-Formulare.aspx&lt;/a&gt;
	&lt;/p&gt;&lt;h2&gt;Das Problem:
&lt;/h2&gt;&lt;p&gt;Implementiert man eine Lösung zum Sicherstellen von Geschäftsregeln möchte man den Benutzer darauf hinweisen, dass irgendetwas nicht korrekt ausgefüllt ist. Dazu kann man dem Benutzer einen modalen Dialog(MessageBox) anzeigen. Ist eine der Regeln ungültig, kann der Benutzer weder speichern – noch das Formular schliessen. Man sollte dem Benutzer aber immer die Möglichkeit geben einen Vorgang abzubrechen. Zu diesem Zweck kann man dem Benutzer im der Close-Benachrichtigung einen Dialog mit zwei Schaltflächen anzeigen z.B. Ok und Abbrechen. Klickt der benutzer in  diesem Fall auf Abbrechen – soll das Formular einfach geschlossen werden ohne die modifizierten Daten zu speichern. &lt;br/&gt;Prinzipiell sieht die Lösung wie folgt aus:
&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&gt;///&lt;span style="color:green"&gt; Flag is used to close the Form when Cancel is clicked
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&gt;&lt;span style="color:blue"&gt;bool&lt;/span&gt; _closeAfterCancel = &lt;span style="color:blue"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&gt;///&lt;span style="color:green"&gt; Validates the BusinessRules and returns true if all rules are valid
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;param name="showCancelButton"&gt;&lt;span style="color:green"&gt;If true, a OK/Cancel MessageBox is displayed to the user&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="color:gray; font-family:Lucida Console; font-size:8pt"&gt;///&lt;span style="color:green"&gt;
				&lt;span style="color:gray"&gt;&lt;returns&gt;&lt;span style="color:green"&gt;true when all rules are 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;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;bool&lt;/span&gt; Validate(&lt;span style="color:blue"&gt;bool&lt;/span&gt; showCancelButton) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (Item.Saved) &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:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:green"&gt;// Default value
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;    _closeAfterCancel = &lt;span style="color:blue"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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;(500);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:#2b91af"&gt;DialogResult&lt;/span&gt; messageBoxResult  = &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),
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;        message.ToString(), &lt;span style="color:green"&gt;// Message
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:#a31515"&gt;"Warning!"&lt;/span&gt;,         &lt;span style="color:green"&gt;// Caption
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;        showCancelButton ? &lt;span style="color:#2b91af"&gt;MessageBoxButtons&lt;/span&gt;.OKCancel :  &lt;span style="color:#2b91af"&gt;MessageBoxButtons&lt;/span&gt;.OK, &lt;span style="color:green"&gt;// Which Buttons should we display
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:#2b91af"&gt;MessageBoxIcon&lt;/span&gt;.Exclamation, &lt;span style="color:green"&gt;// The Icon
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:#2b91af"&gt;MessageBoxDefaultButton&lt;/span&gt;.Button1 &lt;span style="color:green"&gt;// The Default Button 
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;        );
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:green"&gt;// when OK-Button is clicked, we cancel the Operation
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (showCancelButton &amp;&amp; messageBoxResult==&lt;span style="color:#2b91af"&gt;DialogResult&lt;/span&gt;.Cancel ){
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;        _closeAfterCancel = &lt;span style="color:blue"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;    
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Wenn eine der geschäftsregeln nicht eingehalten wird, liefert die &lt;em&gt;Validate&lt;/em&gt;-Methode &lt;em&gt;false&lt;/em&gt; zurück.&lt;br/&gt;Klickt der Benutzer auf die Abbrechen-Schaltfläche im angezeigten Dialog, soll das Formular ohne die Daten zu speichern geschlossen werden.&lt;br/&gt;Um das zu erreichen wird ein Flag  &lt;em&gt;_closeAfterCancel&lt;/em&gt; auf true gesetzt. Normalerweise könnte man jetzt einfach die Methode &lt;em&gt;Inspector.Close(Outlook.OlInspectorClose.OlDiscard)&lt;/em&gt; im  Item_Close event aufrufen.
&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (!_closeAfterCancel) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;        Cancel = !Validate(&lt;span style="color:blue"&gt;true&lt;/span&gt;); &lt;span style="color:green"&gt;// MessageBox with OK + Cancel Button
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (_closeAfterCancel) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;            Inspector.Close(Outlook.&lt;span style="color:#2b91af"&gt;OlInspectorClose&lt;/span&gt;.olDiscard); 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Leider musste ich feststellen, dass dies so nicht funktioniert. Anstatt das Formular zu schliessen, wird ein &lt;em&gt;"Möchten Sie die Änderungen Speichern"&lt;/em&gt;-Dialog angezeigt.&lt;br/&gt;Außerdem wurden im  Outlook Objekt Model(OOM) einige Änderungen durchgeführt, welche eine korrekte Funktion verschiedener Methoden im Close-Event verhindern, siehe &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;929593"&gt;KB929593&lt;/a&gt;.&lt;br/&gt;Als Lösungsansatz kann man einen Timer starten und im Timer_Tick event die Methode Inspector.Close aufrufen.&lt;br/&gt;So sieht der modifizierte Programmcode dazu aus:
&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&gt;///&lt;span style="color:green"&gt; Used to call Close() out of the Item_Close event.
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&gt;&lt;span style="color:#2b91af"&gt;Timer&lt;/span&gt; _closeTimer;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="color:gray; font-family:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&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:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (!_closeAfterCancel) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;        Cancel = !Validate(&lt;span style="color:blue"&gt;true&lt;/span&gt;); &lt;span style="color:green"&gt;// MessageBox with OK + Cancel Button
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:blue"&gt;if&lt;/span&gt; (_closeAfterCancel) {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;            _closeTimer = &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;Timer&lt;/span&gt;();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;            _closeTimer.Tick += &lt;span style="color:blue"&gt;new&lt;/span&gt;
			&lt;span style="color:#2b91af"&gt;EventHandler&lt;/span&gt;(_closeTimer_Tick);
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;            _closeTimer.Start();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;&lt;span style="color:blue"&gt;void&lt;/span&gt; _closeTimer_Tick(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, &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:Lucida Console; font-size:8pt"&gt;    _closeTimer.Stop();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;    _closeTimer.Dispose(); 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:green"&gt;// Close the current Form without saving
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;    Inspector.Close(Outlook.&lt;span style="color:#2b91af"&gt;OlInspectorClose&lt;/span&gt;.olDiscard); 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Jedoch wenn man dies ausführt kommt folgendes Resultat:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Es wird kein &lt;em&gt;"Möchten Sie die Änderungen Speichern"&lt;/em&gt;-Dialog angezeigt
&lt;/li&gt;&lt;li&gt;Das Formular wird geschlossen
&lt;/li&gt;&lt;li&gt;Die Daten werden gespeichert
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Es funktioniert einfach nicht wie gewünscht.&lt;br/&gt;Nach meinen Erkenntnissen ist die einzig funktionierene Form anstatt der Inspector.Close(olDiscard)- die Item.Close(olDiscard)-Mehtode aufzurufen.&lt;br/&gt;Der korrekte Code sieht dementsprechend aus:
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;&lt;span style="color:blue"&gt;void&lt;/span&gt; _closeTimer_Tick(&lt;span style="color:blue"&gt;object&lt;/span&gt; sender, &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:Lucida Console; font-size:8pt"&gt;    _closeTimer.Stop();
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;    _closeTimer.Dispose(); 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;
			&lt;span style="color:green"&gt;// Close the current Form without saving
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;    Item.Close(Outlook.&lt;span style="color:#2b91af"&gt;OlInspectorClose&lt;/span&gt;.olDiscard); 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Lucida Console; font-size:8pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Nur mit dieser Implementierung wird das Formular geschlossen ohne die Daten zu speichern.
&lt;/p&gt;&lt;p&gt;Herzlichen Dank an &lt;a href="http://www.slovaktech.com/"&gt;Ken Slovak&lt;/a&gt;, durch Ihn bin ich auf die korrekte Lösung gekommen.
&lt;/p&gt;&lt;p&gt;Viele Grüße – Helmut Obertanner&lt;br/&gt;&lt;a href="http://www.x4u.de"&gt;http://www.x4u.de&lt;/a&gt;
	&lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/56/Outlook-Formular-per-Code-schliessen.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/56/Outlook-Formular-per-Code-schliessen.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/56/Outlook-Formular-per-Code-schliessen.aspx</guid>
      <pubDate>Fri, 08 Jan 2010 20:06:23 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=56</trackback:ping>
    </item>
    <item>
      <title>Geschäftsregeln für Outlook Formulare</title>
      <description>&lt;p&gt;Vor kurzem musste ich einem Kunden helfen Geschäftsregeln für Outlook Objekte(Kontakte) zu implementieren. Glücklicherweise habe ich dafür schon mal ein Programmierbeispiel auf der Webseite &lt;a href="http://www.outlookcode.com/codedetail.aspx?id=1336"&gt;Outlookcode.com&lt;/a&gt; veröffentlicht. Dieses Beispiel ist aber schon ziemlich alt und als Vorlage diente ein sogenanntes "Shared" COM Add-in. Deshalb habe ich mich dazu entschlossen ein aktualisiertes Beispiel hier auf dem Blog zu veröffentlichen und VSTO-Technologie dazu zu benutzen.
&lt;/p&gt;&lt;h2&gt;Inspector Wrapper
&lt;/h2&gt;&lt;p&gt;Aller Anfang bildet wie immer ein Inspector Wrapper als Vorlage. Vor kurzem habe ich darüber geschrieben – hier kann man das Nachlesen: &lt;a href="http://www.outlooksharp.dehttp://www.outlooksharp.de/Home/tabid/36/EntryId/45/Outlook-InspectorWrapper-erklart.aspx"&gt;http://www.outlooksharp.dehttp://www.outlooksharp.dehttp://www.outlooksharp.de/Home/tabid/36/EntryId/45/Outlook-InspectorWrapper-erklart.aspx&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;Die Grundlage der meisten Outlook-Applikationen ist das korrekte bearbeiten der verschiedenen Outlook Datenobjekte(Item) und deren Fenster(Inspector). Wenn in Outlook ein Item erstellt oder bearbeitet und in einem Formular angezeigt wird, wird dies von dem dazugehörigen Inspector überwacht. Der vorgestellte inspector Wrapper code macht es einfach die verschiedenen Datenobjekte und Formulare sauber in der Anwendung zu verarbeiten. Das aktuelle Datenobjekt, welches sich hinter einem Inspector verbirgt, ist über dessen &lt;em&gt;CurrentItem&lt;/em&gt;-Eigenschaft erreichbar.  Als Szenario in diesem Beispiel sollen für Kontakte Geschäftsregeln erzwungen werden.&lt;br/&gt;Ein Outlook &lt;em&gt;ContactItem&lt;/em&gt; stellt verschiedene Benachrichtigungen zur Verfügung welche dazu benutzt werden können, um ein kleines Framework Sicherstellung von Geschäftsregeln zu programmieren. Es kann sowohl das Speichern eines Objekts als auch das Schliessen eines Formulars überwacht und abgebrochen warden. Dazu muss man die Nachrichten &lt;em&gt;write&lt;/em&gt; und close der entsprechenden Objekte überwachen. Die &lt;em&gt;write(schreiben)&lt;/em&gt; und &lt;em&gt;close(schliessen)&lt;/em&gt; Benachrichtigungen eines &lt;em&gt;ContactItems&lt;/em&gt; verfügen über eine &lt;em&gt;Cancel(Abbrechen)&lt;/em&gt; Eigenschaft welche als Referenztyp der Methode übergeben wird. Wird die Eigenschaft &lt;em&gt;Cancel&lt;/em&gt; auf true(wahr) gesetzt, wird der entsprechende Vorgang abgebrochen – das Speichern der Daten oder das Schliessen des Formulars wird abgebrochen. Zunächst erstellen wir ein neues Outlook Add-in.
&lt;/p&gt;&lt;p&gt;&lt;img src="/Portals/0/Blog/Files/2/54/122909_1954_Geschftsreg1.png" alt=""/&gt;
	&lt;/p&gt;&lt;p&gt;&lt;span style="color:#4f81bd; font-size:9pt"&gt;&lt;strong&gt;Abbildung 1: Erstellen eines Outlook Add-ins
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Nach der Fertigstellung des Assistenten erhält man den üblichen VSTO Anwendungscode. Hier wird sogleich der InspectorWrapper implementiert welcher dazu dient alle individuellen Formularfenster zu verarbeiten. Die Basisklasse dazu nennt sich InspectorWrapper.cs und implementiert alle Nachrichten des Inspector Objekts. Möchte man Code für ein Kontakt-Objekt implementieren leitet man dazu eine Klasse von diesem InspectorWrapper ab und implementiert spezifischen Code für Kontakt-Objekte(ContactItem). In dieser Klasse lassen sich dann die Nachrichten für die Objekte monitoren und die Geschäftslogik implementieren. &lt;br/&gt;Hier sehen Sie den Code für die &lt;em&gt;InspectorWrapper&lt;/em&gt; Basisklasse:
&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;Als nächstes sieht man die Implementierung der &lt;em&gt;ContactItemWrapper&lt;/em&gt;-Klasse. Sie ist von der &lt;em&gt;InspectorWrapper&lt;/em&gt;-Klasse abgeleitet und ist ab jetzt für alle Kontakt-Objekte in Outlook zuständig. Bis jetzt nichts neues. Wie lassen sich die Geschäftsregeln implementieren? Studiert man den Code etwas genauer kann man sehen, dass in der &lt;em&gt;Initialize&lt;/em&gt;-Methode die Benachrichtigungen des Kontakts abgehöhrt werden - und zwar die open, write and close Nachrichten. In C# benötigt die close-Nachricht leider eine Spezialbehandlung. Das Problem ist, dass das ContactItem bereits eine Close() Methode hat und der Generator für die sog. Primary Interop Assemblies nicht zwischen der Close Nachricht und der Close Methode unterscheiden kann. Deshalb muss man hier als Syntax speziell das &lt;em&gt;ItemEvents_10_Event &lt;/em&gt;Interface verwenden. Sobald die Nachrichtenregistrierung abgeschlossen ist, wird eine Methode namens SetupBusinessRules aufgerufen. Dies wird aber nochmals im Detail erklärt. Zunächst hier mal der Beispielcode der Klasse &lt;em&gt;ContactItemWrapper&lt;/em&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;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;Definieren von Geschäftsregeln
&lt;/h2&gt;&lt;p&gt;Zunächst wird eine KLasse definiert, welche eine Geschäftsregel beschreiben soll. Sie hat als Eigenschaften einen Namen und eine Beschreibung welche später dem Benutzer angezeigt werden soll, falls die Regel nicht eingehalten wird. Außerdem hat sie einen Zeiger auf eine Methode, welche die eigentliche Überprüfung der Regel durchführt. Die Signatur solch einer Methode wird dazu in einem Delegaten definiert.&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;Im Konstruktor der Geschäftsregel werden die Eigenschaften und der Funktionszeiger übergeben. Es gibt noch eine weitere Statische Methode(&lt;em&gt;IsRuleValid&lt;/em&gt;), welche von einer Liste als Prüfmethode aufgerufen werden kann, dazu später mehr Infos. Hier zunächst die Klasse für die Geschäftsregel.
&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;Als nächstes sehen wir uns an wie die Geschäftsregeln in der Klasse &lt;em&gt;ContactItemWrapper&lt;/em&gt; initialisiert werden. Nur zur Demonstration habe ich zunächst zwei einfache Regeln definiert und ausprogrammiert. Und so sehen diese aus:
&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;Die erste Methode überprüft die OfficeLocation-Eigenschaft des Kontakts. Sie darf nicht leer sein und darf nur aus Großbuchstaben bestehen. Die zweite Funktion überprüft die Eigenschaft CompanyName – diese muss mindestens drei Zeichen enthalten. Man kann verschiedenste Regeln implementieren, mann muss nur darauf achten dass die jeweilige Methode true zurückliefert wenn die Regel erfolgreich überprüft ist.
&lt;/p&gt;&lt;h2&gt;Validierung
&lt;/h2&gt;&lt;p&gt;Wie und wann werden diese Regeln überprüft? Dafür wird eine &lt;em&gt;Validate&lt;/em&gt;-Methode bereitgestellt welche immer in den &lt;em&gt;write&lt;/em&gt; und &lt;em&gt;close&lt;/em&gt; Benachrichtigungen aufgerufen wird. Die Regeln werden in einer Liste gespeichert, dadurch können alle Regeln mit einem Methodenaufruf (TrueForAll) überprüft werden. Ist nur eine Regel nicht erfolgreich validiert, wird dem Benutzer eine Nachricht angezeigt mit dem entsprechenden Hinweis auf die Ursache der Meldung. Hier ist die &lt;em&gt;Validate-&lt;/em&gt;Methode.
&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;Das ist sehr einfach zu implementieren. Die &lt;em&gt;Validate&lt;/em&gt;-Methode wird in der &lt;em&gt;Item.Write &lt;/em&gt;und in der &lt;em&gt;Item.Close&lt;/em&gt; Benachrichtigung aufgerufen. In diesen Methoden wird der Saved-Status des Kontaktes überprüft. Wenn der Kontakt nicht modifiziert wurde ist eine Regelüberprüfung nicht notwendig. Liefert die &lt;em&gt;Validate&lt;/em&gt;-Methode false, wird die &lt;em&gt;write&lt;/em&gt;- oder &lt;em&gt;close&lt;/em&gt; Operation abgebrochen. Als nächstes kann man die Methoden der Benachrichtigungen sehen:
&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;Wie werden die Geschäftsregeln mit den Funktionszeigern initialisiert? Dies wird mit einer einzigen Codezeile erreicht.&lt;br/&gt;Einfach eine neue Instanz einer &lt;em&gt;BusinessRule&lt;/em&gt;-Klasse erzeugen. Dem Konstruktor wird der Name, die Beschreibung und die Methode zum Überprüfen als Parameter übergeben.
&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;Sobald ein Kontakt erzeugt oder bearbeitet - und dieser gespeichert oder geschlossen wird, werden die Geschäftsregeln überprüft. Wird dabei eine Misachtung festgestellt wird diese, wie im Bild zu sehen, dem Benutzer angezeigt.
&lt;/p&gt;&lt;p&gt;&lt;img src="/Portals/0/Blog/Files/2/54/122909_1954_Geschftsreg2.png" alt=""/&gt;
	&lt;/p&gt;&lt;p&gt;&lt;span style="color:#4f81bd; font-size:9pt"&gt;&lt;strong&gt;Abbildung 2: Ein hinweis zeigt dem Benutzer welche Regeln misachtet wurden
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;Beispielcode
&lt;/h2&gt;&lt;p&gt;Der Beispielcode zu diesem Blog kann hier heruntergeladen werden:&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;Referenzen
&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/45/Outlook-InspectorWrapper-erklart.aspx"&gt;http://www.outlooksharp.dehttp://www.outlooksharp.dehttp://www.outlooksharp.de/Home/tabid/36/EntryId/45/Outlook-InspectorWrapper-erklart.aspx&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/54/Geschaftsregeln-fur-Outlook-Formulare.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/54/Geschaftsregeln-fur-Outlook-Formulare.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/54/Geschaftsregeln-fur-Outlook-Formulare.aspx</guid>
      <pubDate>Tue, 29 Dec 2009 19:54:52 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=54</trackback:ping>
    </item>
    <item>
      <title>Geschäftsapplikationen mit Infragistics und Silverlight</title>
      <description>&lt;p&gt;Dieser Artikel hat zwar nichts mit Outlook und VSTO zu tun, dennoch hat zumindest die Optik eine gewisse Ähnlichkeit mit der neuen Oberfläche der Microsoft Office Anwendungen. In der aktuellen Silverlight CTP von Infragistics ist jetzt ein Ribbon Control (XamlWebRibbon) enthalten. Dadurch ist es sehr einfach Geschäftsanwendungen mit Silverlight zu erstellen. Wie es der Zufall gerade will, arbeite ich mit einem Team an der zukünftigen Lizenzierung von Applikationen. Hierbei geht es nicht alleine um die technische implementierung einer Softwarelizenzierung – nein – auch das ganze drumherum, das Backend, Infrastruktur und die Verwaltung muss natürlich bereitgestellt werden. Ich habe sofort die Chance ergriffen und versuche dieses Backend mit neuesten Technologien mit Hilfe von Silverlight, RIA und Infragistics zu erstellen.
&lt;/p&gt;&lt;p&gt;&lt;img src="/Portals/0/Blog/Files/2/52/122709_1249_Geschftsapp1.png" alt=""/&gt;
	&lt;/p&gt;&lt;p&gt;&lt;span style="color:#4f81bd; font-size:9pt"&gt;&lt;strong&gt;Abbildung 1: Screenshot des Infragistics Ribbon Controls für Silverlight
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Normalerweise würde ich die Anwendung mit Visual Studio 2010 Beta und Silverlight 4 erstellen, da die Anwendung aber tatsächlich funktionieren soll, habe ich mich dazu entschieden Visual Studio 2008 zu verwenden. Für Silverlight 4 gibt es noch keine Runtime.&lt;br/&gt;Als Datenbank soll ein Microsoft SQL-Server arbeiten, der Zugriff erfolgt mit RIA-Services mit LINQ oder Entity Framework.
&lt;/p&gt;&lt;p&gt;Als erstes starten wir eine neue Silverlight-Applikation.
&lt;/p&gt;&lt;h2&gt;Benötigte Software und Tools
&lt;/h2&gt;&lt;p&gt;Um so eine Anwendung nachprogrammieren zu können, benötigen Sie folgende Software:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Microsoft Visual Studio 2008 SP1
&lt;/li&gt;&lt;li&gt;Silverlight SDK, Tools und Dokumentation - &lt;a href="http://www.silverlight.net/getstarted/"&gt;http://www.silverlight.net/getstarted/&lt;/a&gt;
		&lt;/li&gt;&lt;li&gt;Silverlight ToolKit - &lt;a href="http://silverlight.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=36060"&gt;http://silverlight.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=36060&lt;/a&gt;
		&lt;/li&gt;&lt;li&gt;Microsoft Expression Blend
&lt;/li&gt;&lt;li&gt;RIA Services - &lt;a href="http://www.silverlight.net/getstarted/riaservices/"&gt;http://www.silverlight.net/getstarted/riaservices/&lt;/a&gt;
		&lt;/li&gt;&lt;li&gt;Infragistics Silverlight Controls CTP - &lt;a href="http://www.infragistics.com/dotnet/netadvantage/silverlight/line-of-business.aspx"&gt;http://www.infragistics.com/dotnet/netadvantage/silverlight/line-of-business.aspx&lt;/a&gt;
		&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Erstellen der Anwendung
&lt;/h2&gt;&lt;p&gt;Nun bin ich kein Spezialist für Webanwendungen oder Silverlight, deshalb werde ich dieses Projekt ebenfalls als Lernapplikation verwenden. Bestenfalls habe ich eine gute Vorstellung davon, wie die Lizensierungsapplikation auszusehen hat. Vermutlich gibt es auch schon jede Menge fertige Applikationen oder Portale, welche diesen Zweck gut erfüllen und schon tausendfach erpropt sind. Egal, hier geht es um das Erlernen der Anwendung und den Einsatz moderner und neuer Technologien.
&lt;/p&gt;&lt;p&gt;Wir beginnen also zunächst mit der Erstellung der Anwendung mit Visual Studio 2008.
&lt;/p&gt;&lt;p&gt;&lt;img src="/Portals/0/Blog/Files/2/52/122709_1249_Geschftsapp2.png" alt=""/&gt;
	&lt;/p&gt;&lt;p&gt;&lt;span style="color:#4f81bd; font-size:9pt"&gt;&lt;strong&gt;Abbildung 2: Silverlight RIA Anwendung erstellen
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Nachdem man alles korrekt installiert hat, findet man in den Visual Studio Projektvorlagen under dem Eintrag Silverlight die entsprechenden Templates. Als Vorlage wähle ich das Template "Silverlight Application". Als nächstes erscheind folgender Screen:
&lt;/p&gt;&lt;p&gt;&lt;img src="/Portals/0/Blog/Files/2/52/122709_1249_Geschftsapp3.png" alt=""/&gt;
	&lt;/p&gt;&lt;p&gt;&lt;span style="color:#4f81bd; font-size:9pt"&gt;&lt;strong&gt;Abbildung 3: Erstellen einer Silverlight Anwendung
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Ja, die Silverlight Anwendung wird in einer Webseite gehostet und ja, ich möchte RIA Services verwenden.&lt;br/&gt;Nach dem Beenden das Assistenten hat man zumindest schon mal eine funktionierende Anwendungsvorlage. Ein Start der Anwendung startet den Browser und zeigt ein leeres Browserfenster. 
&lt;/p&gt;&lt;h2&gt;Verwendung von Infragistics Controls
&lt;/h2&gt;&lt;p&gt;Als nächstes soll das Infragistics Ribbon in die Anwendung integriert werden.&lt;br/&gt;Als erstes muss man die entsprechende DLL im Projekt referenzieren. Die Infragistics DLLs habe ich in einem Unterordner des Projektes bereitgestellt. Ich füge die DLL als Referenz hinzu.
&lt;/p&gt;&lt;p&gt;&lt;img src="/Portals/0/Blog/Files/2/52/122709_1249_Geschftsapp4.png" alt=""/&gt;
	&lt;/p&gt;&lt;p&gt;&lt;span style="color:#4f81bd; font-size:9pt"&gt;&lt;strong&gt;Abbildung 4: Hinzufügen der Infragistics Referenzen zum Projekt
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Jetzt wird die "Main.xaml" Datei aus Visual Studio heraus mit Expression Blend 3 geöffnet. Die Infragistics Controls findet man unter "Assets|Locactions|Infragistics...".
&lt;/p&gt;&lt;p&gt;&lt;img src="/Portals/0/Blog/Files/2/52/122709_1249_Geschftsapp5.png" alt=""/&gt;
	&lt;/p&gt;&lt;p&gt;&lt;span style="color:#4f81bd; font-size:9pt"&gt;&lt;strong&gt;Abbildung 5: Expression Blend mit Infragistics Controls
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Der Seite wird das XamlWebRibbon als Control hinzugefügt. Ein Ribbon hat üblicherweise verschiedene Tabs, die Tabs enthalten wiederum Gruppen und die Gruppen enthalten Bedienelemente. So stelle ich mir zunächst ein einfaches Menü für den Anwender bereit.&lt;br/&gt;Der Anwender soll sein eigenes Konto sehen und die gekaufte Software oder Musik, als auch Rechnungsdokumente, Bedienungsanleitungen und andere wichtige persönliche Dokumente sofort im Zugriff haben. In Expression Blend bin ich mit den Infragistics Control leider nicht so zurecht gekommen, deshalb habe ich die Tabs und Gruppen manuell im XML hinzugefügt.
&lt;/p&gt;&lt;p&gt;Der XAML-Code sieht dementsprechend aus:&lt;br/&gt;&lt;img src="/Portals/0/Blog/Files/2/52/122709_1249_Geschftsapp6.png" alt=""/&gt;
	&lt;/p&gt;&lt;p&gt;&lt;span style="color:#4f81bd; font-size:9pt"&gt;&lt;strong&gt;Abbildung 6: Blend mit XAML Code und Vorschau
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Startet man die Anwendung im Debugger, kann man sogleich das Ergebnis sehen.&lt;br/&gt;&lt;img src="/Portals/0/Blog/Files/2/52/122709_1249_Geschftsapp7.png" alt=""/&gt;
	&lt;/p&gt;&lt;p&gt;&lt;span style="color:#4f81bd; font-size:9pt"&gt;&lt;strong&gt;Abbildung 7: Die Anwendung mit Ribbon im Browser
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Mit dem XamlWebRibbon Control von &lt;a href="http://www.infragistics.com/"&gt;Infragistics&lt;/a&gt; lässt sich im Handumdrehen ein tolles Userinterface für eine Webanwendung erstellen. Ich bin wirklich beeindruckt wie schnell man hier eine kleine Applikation erstellen kann. Die Integration in Blend ist aber durchaus noch verbesserungswürdig. Die Anwendung ist auf meinem Webserver unter der Adresse: &lt;a href="http://silver.x4u.de"&gt;http://silver.x4u.de&lt;/a&gt; erreichbar. Ich werde weiter darüber bloggen, wie sich die Funktionalität der Anwendung mit Webservices erweitern lässt. Bleibt für mich jedenfalls ein spannendes Thema.
&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt; 
 &lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/52/Geschaftsapplikationen-mit-Infragistics-und-Silverlight.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/52/Geschaftsapplikationen-mit-Infragistics-und-Silverlight.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/52/Geschaftsapplikationen-mit-Infragistics-und-Silverlight.aspx</guid>
      <pubDate>Sun, 27 Dec 2009 12:49:47 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=52</trackback:ping>
    </item>
    <item>
      <title>Rekursiv über Outlook Ordner iterieren</title>
      <description>&lt;p&gt;In diesem wie-wird's-gemacht Artikel möchte ich verschiedene Überlegungen zum Thema Rekursiver Zugriff auf Outlook Ordner und deren Unterordner.
&lt;/p&gt;&lt;p&gt;Im Outlook Objekt Model (OOM) wird ein Outlook Ordner durch den MAPIFolderTyp representiert .&lt;br/&gt;Es gibt verschiedene Möglichkeiten auf eine MAPIFolder-Instanz zuzugreifen:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Verwendung der &lt;em&gt;Session.GetDefaultFolder(OlDefaultFolders)&lt;/em&gt; Methode um Zugriff euf einen der vordefinierten Ordner zu erhalten
&lt;/li&gt;&lt;li&gt;Mit der &lt;em&gt;Session.GetFolderById(folderId, [optional] storeId)&lt;/em&gt; Methode wird ein Ordner anhand seiner &lt;em&gt;EntryId geladen&lt;/em&gt;
		&lt;/li&gt;&lt;li&gt;Über die &lt;em&gt;Parent&lt;/em&gt; Eigenschaft eines &lt;em&gt;Item&lt;/em&gt; Objekts oder eines anderen Ordners
&lt;/li&gt;&lt;li&gt;Über die &lt;em&gt;Explorer.CurrentFolder&lt;/em&gt; Eigenschaft
&lt;/li&gt;&lt;li&gt;Iterieren über die &lt;em&gt;Folders&lt;/em&gt; ansammlung eines &lt;em&gt;Stores&lt;/em&gt; oder einer &lt;em&gt;Folder&lt;/em&gt; Instanz.
&lt;/li&gt;&lt;li&gt;Durch erstellen eines neuen &lt;em&gt;Folders&lt;/em&gt;
		&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Das rekursive iterieren über einen Ordnerbaum und der Zugriff auf dessen Outlook Objekte kann ein ziemlich langsames unterfangen werden. Es hängt ab von der Anzahl der &lt;em&gt;Items&lt;/em&gt; in einem &lt;em&gt;Ordner&lt;/em&gt; und der ebenentiefe der Unterordner. Wenn das Outlook Object Model mit .Net(managed) code verwendet wird, muss man sich über die verwendung des Speichers und der COM Objekte Gedanken machen. Der Zugriff und die Verwendung von Objekten wie Emails, Termine(Appointments) and Aufgaben(Tasks) kann sehr langsam sein. Dies liegt leider am internen Design der MAPI Struktur, und wie die Daten gespeichert sind. Das Outlook Objekt Model basiert auf dieser Technologie. Ausserdem spielt die Konfiguration eine Rolle, wenn ein Exchangeserver verwendet wird ist es ein Unterschied ob man online oder offline arbeitet – und wie schnell eine Netzwerkverbindung ist.
&lt;/p&gt;&lt;h2&gt;Das zu viele RPC Verbindungen problem
&lt;/h2&gt;&lt;p&gt;Diese Problem kann auftreten, wenn man mit einem Exchangeserver im Backend arbeitet und auf viele Outlook-Objekte in kurzer Zeit zugreift. Für jedes Item auf welches man per Code zugreift, wird eine Verbindung zum Exchangeserver hergestellt (&lt;strong&gt;R&lt;/strong&gt;emote &lt;strong&gt;P&lt;/strong&gt;rocedure &lt;strong&gt;C&lt;/strong&gt;all) und das entsprechende Objekt wird geöffnet oder synchronisiert. Im Standardfall ist die Anzahl der gleichzeitig möglichen RPC-Verbindungen von einem Client(Outlook Session) zum Exchangeserver begrenzt auf 256. Wenn man eine Lösung entwickelt und nur offline Arbeitet oder zum Testen nur wenige Objekte verwendet wird dieses Problem nie auftreten. Wird die Anwendung jedoch beim Kunden in Betrieb genommen und verwendet entstehen plötzlich unerklärliche Phänomene. Also: Wann immer über eine Outlook-Items Ansammlung iterierd wird, sollte man diese Problem im Hinterkopf haben und diese schon im Voraus vermeiden. Im ersten Beispiel wird einfach über alle Items im Posteingang iteriert. Hier werden verschiedene Grundlagen besprochen. Für alle Beispiele wird folgende Methode verwendet, welche den Posteingangs-Ordner zurückliefert.
&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;Im ersten Test iterieren wir einfach über alle Email-Items des Posteingangs und lassen die Betreff8Subject)-Zeile ausgeben.
&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;Was ist an diesem Code falsch? Theoretisch ist eigentlich alles OK, jedoch:&lt;br/&gt;- was passiert, wenn mehr Items als mögliche RPC-Connections im Ordner sind?&lt;br/&gt;- die Anzahl der Objekte in der Items-Collection kann sich jederzeit dynamisch ändern – wie reagiert der Code darauf?&lt;br/&gt;- der gesamte Vorgang kann nicht unterbrochen werden, bis alle Objekte verarbeitet wurden.&lt;br/&gt;- der Programmcode läuft im Haput-Anwendungsthread des Outlook Prozesses ab – dies bedeutet: Die Benutzeroberfläche reagiert nicht mehr, bis die Schleife zu Ende ist.
&lt;/p&gt;&lt;h2&gt;Wie kann man das lösen?
&lt;/h2&gt;&lt;p&gt;Zuerst wollen wir uns darum kümmern das RPC-Verbindungsproblem zu lösen. Dazu definiert man eine Variable, welche die Anzahl der verarbeiteten Objekte mitzählt. Innerhalb der Anwendungsschleife erhöht man einfach einen Zählerund erreicht man eine vorbestimmte Anzahl von Objekten, erzwingt man den the .Net Garbage Collector die nicht mehr verwendeten COM-Objekte freizugeben und diese aus dem Speicher zu entfernen. Die Ursache des Problems ist: Der .Net Garbage Collector ist intelligent. Dieser merkt sich die verwendeten Objekte für eine gewisse Zeit in einem cache – falls man diese Objekte spatter wiederverwendet, erhält man einen schnellen Zugriff darauf – dadurch werden .Net Anwendungen schneller. Dieses Verhalten trifft leider auch auf COM(&lt;strong&gt;C&lt;/strong&gt;omponent &lt;strong&gt;O&lt;/strong&gt;bject &lt;strong&gt;M&lt;/strong&gt;odel)-Objekte also alle Outlook-Objekte zu. Greift man auf ein solches Objekt zu, verbleibt für eine unbestimmte Zeit eine Referenz darauf im Speicher – auch wenn man das Objekt explizit auf NULL setzt. Der GC(&lt;strong&gt;G&lt;/strong&gt;arbage &lt;strong&gt;C&lt;/strong&gt;ollector) entscheidet, wann diese Objekt aus dem Speicher freigegeben wird. Als Alternative kann man aber den Garbage Collector dazu zwingen den Speicher aufzuräumen und nicht mehr verwendete Objekte freizugeben. Achtung: Ein GC cleanup ist sehr teuer den er verbraucht CPU-Zeit und blockiert auch andere .Net Anwendungen – man sollte Ihn also möglichst nicht zu oft aufrufen – man muss eben einen guten Mix finden. Bei der Outlook-programmierung ist es ein absolutes muss, einen GC-Cleanup nach der freigabe eines Inspector oder eines Explorer Objekts durchzuführen.  &lt;br/&gt;Hier kommt das nächste Code-Beispiel.
&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;Die watchdog Variable wird benutzt, um ein Cleanup des the Garbage Collectors nach einer bestimmten Anzahl Verwendungen von COM Objekten zu erzwingen – dabei warden die RPC-Verbindungen geschlossen.&lt;br/&gt;Anmerkung: Die &lt;em&gt;Folder.Items&lt;/em&gt; Ansammlung ist nicht statisch – die Anzahl der Objekte kann sich jederzeit ändern. Anstatt einer foreach-Schleiche sollte man deshalb besser die Anzahl der Objekte ermitteln und einen Rückwärtszähler programmieren.&lt;br/&gt;So sieht der Code dafür aus: 
&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;Die index Variable um die Objekte rückwärts herunter abzuarbeiten. So können während des Vorgangs Objekte in der Schleife gelöscht oder verschoben werden. Der gesamte Vorgang kann aber immer noch nicht unterbrochen warden, nicht mal durch Beenden der Outlook Anwendung. Um den Code in einen unterbrechbaren und interaktiven Vorgang zu ändern, muss dieser in einem eigenen Thread laufen. Im .Net Framework gibt es dafür schon etwas was man hier benutzen kann, es nennt sich  BackgroundWorker.&lt;br/&gt;Nachfolgend kann man den Beispielcode dafür sehen:
&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;Mit einem BackgroundWorker last sich ein Zeitraubender Prozess im Hintergrund durchführen. Die Anwendungsoberfläche bleibt benutzbar und die Anwendungen bedienbar. Ausserdem kann die Verarbeitung unterbrochen werden.
&lt;/p&gt;&lt;h2&gt;Rekursive Operationen
&lt;/h2&gt;&lt;p&gt;Als nächstes werden wir in der Schleife rekursiv über Ordner iterieren. Dazu werden wir eine Methode implementieren, welche sich selbst rekursiv aufruft.
&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;Dies funktioniert zwar tatsächlich, es ist aber leider nicht die beste Lösung des Problems. Rekursives aufrufen von Funktionen kann den Stapelspeicher des Prozessors überfordern – man landet im schlimmsten Fall im Nirwana. Wie kann man das lösen? &lt;br/&gt;Als einfach Abhilfe kann man dazu das &lt;a href="http://msdn.microsoft.com/en-us/library/7977ey2c.aspx"&gt;Queue&lt;/a&gt; Objekt verwenden, welches bereits durch das .Net  Framework zur Verfügung gestellt wird.  Eine Queue(Warteschlange) hat im wesentlichen 2 wichtige Methoden: &lt;em&gt;Enqueue()&lt;/em&gt; und &lt;em&gt;Dequeue().&lt;/em&gt;&lt;br/&gt;&lt;em&gt;Enqueue&lt;/em&gt; fügt ein Objekt am Ende der Schlange hinzu, &lt;em&gt;Dequeue&lt;/em&gt; mimmt das erste Objket am Anfang der &lt;a href="http://msdn.microsoft.com/en-us/library/7977ey2c.aspx"&gt;Queue&lt;/a&gt; und entfernt es aus dieser. Im nächsten Beispiel sammeln wir einfach die EntryID(Eindeutige ID des Ordners) der Unterordner eines Ordners und fügen diese am Ender der Schlange hinzu. In der Arbeitsmethode des Hintergrundthreads, wird einfach geprüft ob noch EntryID's in der Warteschlange sind, dann wird diese verarbeitet. Die EntryID eines Ordners wird aus der &lt;a href="http://msdn.microsoft.com/en-us/library/7977ey2c.aspx"&gt;Queue&lt;/a&gt; entnommen und der Ordner wird verarbeitet – die ID's der Unterordner werden wieder ans Ende der Queue angefügt. Auf diesem Wege warden alle Ordner verarbeitet, und es gibt kein Problem mit dem Prozessor-Stack(Stapelspeicher). Der Prozess kann auch jederzeit unterbrochen werden. 
&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;Beim Zugriff auf die Queue-Variable gibt es auch keine locking-Probleme, da diese nur durch den Arbeitsthread(worker) modifiziert wird.
&lt;/p&gt;&lt;h2&gt;Beschleunigen des Zugriffs
&lt;/h2&gt;&lt;p&gt;Es ist Ihnen eventuell aufgefallen, dass der zugriff auf die Outlook-Objekte eine enorme Zeit beansprucht. Es gibt ein paar wenige Möglichkeiten diese Zeiten zu beschleunigen. Als erste Option würde ich die Verwendung eines Filters vorstellen: Ein Filter schränkt die Anzahl der Treffer in einem Ordner ein. Als Beispiel mächten wir nur Outlook-Items verarbeiten, welche nach einem speziellen Datum modifiziert wurden. 
&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;Leider lassen sich zum Filtern nicht alle Eigenschaften eines Objekts verwenden.
&lt;/p&gt;&lt;h2&gt;Das Table Objekt
&lt;/h2&gt;&lt;p&gt;Seit Outlook 2007 gibt es ein neues &lt;a href="http://msdn.microsoft.com/en-us/library/bb176406.aspx"&gt;&lt;em&gt;Table&lt;/em&gt;&lt;/a&gt; Objekt im OOM welches schnellen Zugriff auf die Tabellendaten eines Ordners verspricht. Der Zugriff ist schnell, den man kann entscheiden welche Spalten überhaupt benötigt werden und muss nicht jedes mal ein komplettes Objekt durchladen. Die beste Performanz erhält man natürlich, wenn man nur die Daten in die Tabelle lädt, welche man zum Verarbeiten der Daten benötigt. Leider gilt auch hier, dass nicht sämtliche Daten direkt in der Tabelle bereitgestellt werden können. In unserem code verwenden wir ja nur die Eigenschaft Letztes Änderungsdatum(&lt;em&gt;LastModificationTime)&lt;/em&gt; und den Betreff(&lt;em&gt;Subject)&lt;/em&gt;. Prüfen wir als mal wie schnell wir die Daten lesen können. Um den Vorgang zu messen, wird der Anwendungscode noch etwas modifiziert – es wird die Anzahl der Objekte gezählt, als auch die Verarbeitungszeit. Bei Verwendung von Outlook Objekten erhalten wir im Durschschnitt folgendes Ergebnis:
&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;Nach Umbau des Codes mit Verwendung des Table-Objektes, liefert der Test auf meinem System aber folgende Werte:
&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;Interessant. In all meinen Tests unter Verwendung von Outlook2010 (Beta2) zeigte der Test, dass die Verwendung des &lt;em&gt;Folder.Table&lt;/em&gt; -Objektes langsamer war, als direkt über die Items selbst eine schleife laufen zu lassen. Theoretisch sollte die Verwendung von &lt;em&gt;GetTable()&lt;/em&gt; wesentlich schneller sein, als alle Outlook Objekte durchzuladen. Dem ist aber nicht so – vielleicht liegt es aber auch an der Beta-Version von Outlook 2010.
&lt;/p&gt;&lt;p&gt;Hier ist das Beispiel für die Verwendung des Table-Objektes:
&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;Eine weitere Verbesserung könnte die Verwendung eines weiteren Threads sein. Ein Thread zum Auswerten, ob Items überhaupt verarbeitet werden müssen, ein weiterer Thread zum Verarbeiten der Items. Die Komplexität wird dadurch aber wesentlich erhöht, deshalb möchte ich hier darauf verzichten. 
&lt;/p&gt;&lt;h2&gt;Vermeidung von GC.Collect()
&lt;/h2&gt;&lt;p&gt;Obwohl es nötig ist GC.Collect() bei der Programmierung von Outlook-Anwendungen ab und zu an verschiedenen Stellen aufzurufen, sollte dies nur sehr selten und nur wenn es unbedingt nötig ist geschehen. Ein Erzwingen von GC.Collect() beeinflusst die Laufzeit aller .Net Anwendungen. Innerhalb einer Schleife verwenden wir GC.Collect() nur deshalb um ein spezifisches Problem in Verbindung mit einem Exchangeserver zu umgehen. Wenn Outlook gar keinen Exchangeserver verwendet – oder offline d.h. nicht Verbunden ist, wird GC.Collect() nicht benötigt. Deshalb könnte man hier noch etwas optimieren.
&lt;/p&gt;&lt;p&gt;Unten steht der optimierte 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;GC.Collect() wird nur aufgerufen, wenn Outlook online mit einem Exchangeserver verbunden ist.
&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;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/51/Rekursiv-uber-Outlook-Ordner-iterieren.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/51/Rekursiv-uber-Outlook-Ordner-iterieren.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/51/Rekursiv-uber-Outlook-Ordner-iterieren.aspx</guid>
      <pubDate>Sat, 26 Dec 2009 16:47:58 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=51</trackback:ping>
    </item>
    <item>
      <title>Hard- u. Softwarepreise gewinnen bei TecChannel.de</title>
      <description>&lt;p&gt;Hurrah! – Ich habe gewonnen – und zwar einen Toshiba Netbook. Wie kam es dazu? Durch Mitmachen und veröffentlichen eines kleinen Beitrags in der Rubrik "Never change a running System" bei TecChannel.de. Vielen herzlichen Dank an alle Benutzer, die für meinen Beitrag gestimmt haben. Aktuell gibt es hier noch eine Gewinnaktion auf TecChannel.de – hier ist der Link: &lt;a href="http://www.tecchannel.de/server/2021595/quiz_mitmachen_und_gewinnen_preise_sieger/"&gt;&lt;span style="font-family:Arial"&gt;&lt;strong&gt;http://www.tecchannel.de/server/2021595/quiz_mitmachen_und_gewinnen_preise_sieger/&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;
	&lt;/p&gt;&lt;p&gt;Also – mitmachen und gewinnen – es lohnt sich!
&lt;/p&gt;&lt;p&gt;&lt;span style="color:black; font-family:Arial"&gt;&lt;strong&gt;&lt;br/&gt;
			&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;</description>
      <link>http://www.outlooksharp.de/Home/tabid/36/EntryId/49/Hard-u-Softwarepreise-gewinnen-bei-TecChannel-de.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/49/Hard-u-Softwarepreise-gewinnen-bei-TecChannel-de.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/49/Hard-u-Softwarepreise-gewinnen-bei-TecChannel-de.aspx</guid>
      <pubDate>Thu, 26 Nov 2009 08:48:23 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=49</trackback:ping>
    </item>
    <item>
      <title>Neue Entwickler-Informationen für Office 2010(Beta) </title>
      <description>&lt;p&gt;&lt;span style="color:#1f497d"&gt;Heute hat das Outlook-Team neue Informationen für Entwickler zu Office2010(Beta version) auf MSDN bereitgestellt.
&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;Das ist neu für Outlook-Entwickler:
&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/48/Neue-Entwickler-Informationen-fur-Office-2010-Beta.aspx</link>
      <author>Helmut Obertanner</author>
      <comments>http://www.outlooksharp.de/Home/tabid/36/EntryId/48/Neue-Entwickler-Informationen-fur-Office-2010-Beta.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.outlooksharp.de/Home/tabid/36/EntryId/48/Neue-Entwickler-Informationen-fur-Office-2010-Beta.aspx</guid>
      <pubDate>Thu, 12 Nov 2009 18:50:56 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.outlooksharp.de/DesktopModules/Blog/Trackback.aspx?id=48</trackback:ping>
    </item>
  </channel>
</rss>