<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Open XML, VSTO, Deployment, .NET und anderes : .NET Dev mit Office</title><link>http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx</link><description>Tags: .NET Dev mit Office</description><dc:language>de-DE</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Was hat die Wiener Oper mit VSTO zu tun?</title><link>http://blogs.msdn.com/jensha/archive/2009/03/25/was-hat-die-wiener-oper-mit-vsto-zu-tun.aspx</link><pubDate>Wed, 25 Mar 2009 14:41:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9507199</guid><dc:creator>jensha</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jensha/comments/9507199.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=9507199</wfw:commentRss><description>&lt;p&gt;Eigentlich nichts, aber …&lt;/p&gt;  &lt;p&gt;… am 8. Mai findet in Wien der &lt;strong&gt;&lt;em&gt;&lt;a href="http://www.vsto-taskforce.de/wikis/ocd/hauptseite.aspx"&gt;Office VSTO Community Day&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt; statt. Dabei geht es um Office Business Applications. Die Veranstaltung wird von Lars Keller und Mario Meir-Huber geführt.&lt;/p&gt;  &lt;p&gt;Die Themen sind:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Einführung in die VSTO &lt;/li&gt;    &lt;li&gt;OpenXML: Das neue Office Format &lt;/li&gt;    &lt;li&gt;VSTO Deployment &lt;/li&gt;    &lt;li&gt;Sharepoint Workflows und Integration &lt;/li&gt;    &lt;li&gt;Interaktionen in der &amp;quot;Office-Welt&amp;quot; mit .NET &lt;/li&gt;    &lt;li&gt;Office plus Services&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;… Sie könnten einen Besuch des Community Days mit einem solchen der berühmten Oper verbinden. Müssen Sie das? Nein, aber wann würden Sie es sonst tun?&lt;/p&gt;  &lt;p&gt;… Außerdem könnten Sie gleich noch das Microsoft Innovation Center (MIC) kennen lernen.&lt;/p&gt;  &lt;p&gt;--&amp;gt; &lt;a href="http://www.vsto-taskforce.de/"&gt;VSTO TaskForce&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9507199" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category><category domain="http://blogs.msdn.com/jensha/archive/tags/ISV+News+/default.aspx">ISV News </category><category domain="http://blogs.msdn.com/jensha/archive/tags/OpenXML/default.aspx">OpenXML</category></item><item><title>VSTO lebt (auf)</title><link>http://blogs.msdn.com/jensha/archive/2009/03/04/vsto-lebt-auf.aspx</link><pubDate>Wed, 04 Mar 2009 15:47:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9458447</guid><dc:creator>jensha</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jensha/comments/9458447.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=9458447</wfw:commentRss><description>&lt;p&gt;Nun gibt es endlich ein deutschsprachiges Portal, auf dem die Fäden der Entwicklung von Office Business Anwendungen (OBA) zusammengeführt werden.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.netcreate.de"&gt;Lars Keller&lt;/a&gt; und &lt;a href="http://www.meirhuber.de/"&gt;Mario Meir-Huber&lt;/a&gt; haben die &lt;a href="http://www.vsto-taskforce.de"&gt;VSTO TaskForce&lt;/a&gt; aus dem Boden gestampft.&lt;/p&gt;  &lt;p&gt;Wenn auch Sie Infos zu Office-Entwicklung, SharePoint und VSTO haben und regelmäßig darüber bloggen, kann Ihr Blog dort aggregiert werden und viele andere haben etwas davon. Da es ein Community-Projekt ist, kann es nur erfolgreich werden, wenn möglichst viele mithelfen.&lt;/p&gt;  &lt;p&gt;Wenn der Kreis der Mitwirkenden groß genug ist, kann man sicher auch über ein deutschsprachiges Forum nachdenken. Denn das &lt;a href="http://social.msdn.microsoft.com/forums/en-US/vsto/threads/"&gt;amerikanische Forum&lt;/a&gt; von Microsoft ist nun mal in englisch und es ist nicht jedermanns Sache, Fragen präzise in Englisch zu stellen.&lt;/p&gt;  &lt;p&gt;Ich wünsche jedenfalls viel Erfolg.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9458447" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category></item><item><title>VSTO NEXT</title><link>http://blogs.msdn.com/jensha/archive/2008/11/14/vsto-next.aspx</link><pubDate>Fri, 14 Nov 2008 15:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9069652</guid><dc:creator>jensha</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jensha/comments/9069652.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=9069652</wfw:commentRss><description>&lt;P&gt;Auf der in Los Angeles Ende Oktober stattgefundenen &lt;STRONG&gt;&lt;EM&gt;Professional Developers Conference&lt;/EM&gt;&lt;/STRONG&gt; wurden ein paar Geheimnisse um die nächste Version von VSTO gelüftet. Eigentlich heißt es ja nicht mehr VSTO, da schon seit VS 2008 VSTO Bestandteil von Visual Studio ist, aber die Abkürzung hat sich seit der Einführung verbreitet und viele können sich etwas darunter vorstellen.&lt;/P&gt;
&lt;P&gt;Was wird also an Neuem kommen?&lt;/P&gt;
&lt;P&gt;Zum einen war es bisher ein Problem, wenn mehr als ein Projekt (oder besser Einzellösung) an der gesamten VSTO Solution beteiligt war, alle DLL per ClickOnce zu verteilen. Ich meine damit nicht, dass verschiedene Assemblies verwendet werden, um eine Solution (z.B. eine Outlook Form Region) zu verteilen, sondern dass eine Lösung mehrere Entry Points enthält (z.B. mehrere Add-Ins für die gleiche oder gar unterschiedliche Office Anwendungen).&lt;/P&gt;
&lt;P&gt;Dafür mußte bisher entweder ein MSI Package gebaut oder alle Add-Ins einzeln verteilt werden. Dank &lt;STRONG&gt;Multi-Project Deployment&lt;/STRONG&gt; gehört das der Vergangenheit an. Es können im Zuge eines Update-Prozesses auch einzelne Add-Ins aus dem Gesamt Package entfernt oder dazu hinzugefügt werden. Um das zu erreichen wurde die Möglichkeit geschaffen, mehrere Entry Points im Application Manifest zu definieren. In der Registry würde das Ganze dann so aussehen:&lt;/P&gt;
&lt;P&gt;HKCU\Software\Microsoft\Office\Excel\AddIns\&lt;EM&gt;MyChartingAddIn&lt;/EM&gt;\&lt;/P&gt;
&lt;P&gt;&amp;nbsp; manifest = &lt;STRONG&gt;MyProject&lt;/STRONG&gt;.vsto|id=&lt;EM&gt;MyChartingAddIn&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;HKCU\Software\Microsoft\Office\Excel\AddIns\&lt;EM&gt;MyCalculationAddIn&lt;/EM&gt;\&lt;/P&gt;
&lt;P&gt;&amp;nbsp; manifest = &lt;STRONG&gt;MyProject&lt;/STRONG&gt;.vsto|id=&lt;EM&gt;MyCalculationAddIn&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Post Deployment Custom Actions&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Hin und wieder ist es nötig, innerhalb des ClickOnce Processes eigene Aktionen auszuführen. Was im Windows Installer als Custom Action bekannt ist, wird nun auch (limitierter Form) bei ClickOnce möglich sein. Limitiert deshalb, weil ClickOnce im User Context ausgeführt wird (MSI läuft unter LocalSystem). Aus diesem Grunde sind die Aktionen auch auf alles limitiert, was der angemeldete Benutzer darf. Process Elevation ist nicht erlaubt. Ausgeführt wird der eigene Code unmittelbar nachdem die Anwendung in den ClickOnce Download Cache geladen wurde. Basierend auf dem Installationsstatus (InitialInstall, UnInstall, Update, Rollback) kann die jeweilige Aktion definiert werden. Ebenso wie bei den Custom Actions des MSI sollte man auch hier darauf achten, die Änderungen in der entgegen gerichteten Action wieder zurück zu nehmen.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;No more PIA Mode&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Primary Interop Assemblies müssen in der nächsten Version von VSTO nicht mehr unbedingt mit verteilt werden, da der Compiler in der Lage sein wird, die Definitionen der verwendeten Typen aus den PIAs im Code einzubetten (Type embedding).&lt;/P&gt;
&lt;P&gt;Das ist eine generelle Funktionaliät des C# 4.0 Compilers und nicht unbedingt VSTO-bezogen.&lt;/P&gt;
&lt;P&gt;Eine weitere Änderung des C# Compilers ist die Fähigkeit, &lt;STRONG&gt;&lt;EM&gt;optionale und benannte Parameter&lt;/EM&gt;&lt;/STRONG&gt; zu unterstützen (VB-Programmierer dürfen jetzt lachen). Also statt des wirklich Schrecklichen:&lt;/P&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Excel.Workbook wb = xlApp.Workbooks.Open(FilePath, System.Type.Missing, System.Type.Missing,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Type.Missing, System.Type.Missing, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;System.Type.Missing, System.Type.Missing,&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; System.Type.Missing, System.Type.Missing, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; System.Type.Missing, System.Type.Missing, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; System.Type.Missing, System.Type.Missing, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; System.Type.Missing, System.Type.Missing);&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;würde es so aussehen:&lt;/P&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Excel.Workbook wb = xlApp.Workbooks.Open(FilePath);&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;oder bei mehreren verwendeten Parametern:&lt;/P&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Excel.Workbook wb = xlApp.Workbooks.Open(Filename: FilePath, Password: myPassword, Local: true);&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;Anders Hejlsberg meinte, er hat endlich den vielen Anfragen nach diesem Feature nachgegeben.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9069652" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category></item><item><title>Ressourcen vom BASTA!-Chalk Talk</title><link>http://blogs.msdn.com/jensha/archive/2008/09/26/ressourcen-vom-basta-chalk-talk.aspx</link><pubDate>Fri, 26 Sep 2008 18:00:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8966575</guid><dc:creator>jensha</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jensha/comments/8966575.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=8966575</wfw:commentRss><description>&lt;p&gt;Hier gibt's nachtr&amp;#228;glich noch meine Mindmap vom VSTO Deployment, die ich auf der Basta! gezeigt hatte. Mit ein Klick auf das Bild gibts eines, wo Sie auch was lesen k&amp;#246;nnen. Desweiteren meine Notizen dazu im &lt;a href="http://blogcasts.de/jensha/VSTO Deployment.docx"&gt;Stichwort-Word-Format&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogcasts.de/jensha/VSTO Deployment Mindmap.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="600" alt="VSTO Deployment (small)" src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/RessourcenvomBASTAChalkTalk_F2B9/VSTO%20Deployment%20(small)_3.png" width="800" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8966575" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category><category domain="http://blogs.msdn.com/jensha/archive/tags/Setup+_2600_amp_3B00_+Deployment/default.aspx">Setup &amp;amp; Deployment</category></item><item><title>SmartTags für alle</title><link>http://blogs.msdn.com/jensha/archive/2008/09/05/smarttags-f-r-alle.aspx</link><pubDate>Fri, 05 Sep 2008 15:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8926246</guid><dc:creator>jensha</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jensha/comments/8926246.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=8926246</wfw:commentRss><description>&lt;P&gt;Visual Studio 2008 / .NET 3.5 Service Pack 1 brachte auch für VSTO ein paar Updates. Eines zählt zu meinen Lieblings-Features: SmartTags. Bisher waren diese nur für dokumentzentrische Anwendungen verfügbar, also an ein bestimmtes Dokument oder eine Vorlage gebunden. Klar, diese Einschränkung hatte auch seine Vorteile. So konnte man viel aggressiver an die Erkennung von Mustern oder Begriffen (sog. Terms) gehen, da der Gültigkeitsbereich des SmartTags sehr stark eingeschränkt (nämlich das eine Dokument) war.&lt;/P&gt;
&lt;P&gt;Nun sind diese Objekte und Klassen auch in einem zentralen Add-In verfügbar. Hier ein Beispiel, welches eine Liste von Begriffen und darüber einen SmartTag mit einer Action definiert. Als Action dient eine einfache Web-Suche auf Wikipedia.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ac4b931e-2ae2-4163-98e8-92082848d111 style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;&lt;PRE style="OVERFLOW: auto; BACKGROUND-COLOR: white"&gt;&lt;DIV&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; Word &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; Microsoft.Office.Interop.Word;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; Office &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; Microsoft.Office.Core;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; VSTO &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; Microsoft.Office.Tools.Word;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; System.Text.RegularExpressions;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; System.Windows.Forms;

&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; AppLevelSmartTag4AllDocs
{
  &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;partial&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ThisAddIn
  {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; VSTO.SmartTag myTermsSmartTag &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[] terms &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; { &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Luke&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Leia&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Han&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Anakin&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Jacen&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Jaina&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Vader&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Wedge&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; };
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; VSTO.Action acSearchWikipedia;

    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ThisAddIn_Startup(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; sender, System.EventArgs e)
    {
      myTermsSmartTag &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; VSTO.SmartTag(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;SmartTags.jensha.net/StarWars#CharacterSample&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Star Wars Character Sample&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);
      &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; t &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; terms)
        myTermsSmartTag.Terms.Add(t);

      acSearchWikipedia &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; VSTO.Action(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Star Wars///Get Info from Wikipedia&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);
      acSearchWikipedia.Click &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; Microsoft.Office.Tools.Word.ActionClickEventHandler(acSearchWikipedia_Click);

      myTermsSmartTag.Actions &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; VSTO.Action[] { acSearchWikipedia };

      VstoSmartTags.Add(myTermsSmartTag);
    }


    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; acSearchWikipedia_Click(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; sender, Microsoft.Office.Tools.Word.ActionEventArgs e)
    {
      &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; searchText &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;%22Star Wars%22 %22&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; e.Text &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;%22&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;
      System.Diagnostics.Process.Start(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;http://en.wikipedia.org/wiki/Special:Search?search=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; searchText);
    }
  }
}
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/DIV&gt;
&lt;P&gt;Der so definierte SmartTag gilt nun für alle geöffneten und noch zu öffnenden bzw. neuen Dokumente. Aber es geht noch besser. Was ist, wenn ich den Gültikeitsbereich einschränken will? Wenn nur bestimmte Dokumente den SmartTag bekommen sollen? Auch das läßt sich bewältigen. Über neue Extensions (Microsoft.Office.Tools.xxxx.Extension) kann die benötigte Funktionalität - nämlich der Zugriff auf die lokalen Objekte des Dokuments - erreicht werden. Die Methode heißt GetVstoObject() und liefert hier den Zugriff auf die SmartTag Collection.&lt;/P&gt;
&lt;P&gt;Da der SmartTag nun nicht mehr automatisch alle Dokumente umfaßt, müssen wir uns selbst um das Hinzufügen neuer Dokumente kümmern. Also jedes Mal, wenn ein Dokument geöffnet oder neu angelegt wird (Office Events abfangen), prüfen wir, ob das Dokument in unser Muster paßt (hier nicht implementiert) und fügen bei positiver Überprüfung den SmartTag der SmartTag Collection des Dokuments hinzu. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:3af0fc07-e397-4743-9833-c03aed57ce93 style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;&lt;PRE style="OVERFLOW: auto; BACKGROUND-COLOR: white"&gt;&lt;DIV&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; Microsoft.Office.Tools.Word.Extensions;
...

&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; AppLevelSmartTag4AllDocs
{
  &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;partial&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ThisAddIn
  {
    ...

    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ThisAddIn_Startup(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; sender, System.EventArgs e)
    {
      &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (Word.Document doc &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Application.Documents)
        AttachSmartTag(doc);

      &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Application.DocumentOpen &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; 
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; Word.ApplicationEvents4_DocumentOpenEventHandler(WordApp_DocumentOpen);
      ((Word.ApplicationEvents4_Event)Application).NewDocument &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; 
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; Word.ApplicationEvents4_NewDocumentEventHandler(WordApp_NewDocument);
    }


    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; WordApp_NewDocument(Microsoft.Office.Interop.Word.Document doc)
    {
      AttachSmartTag(doc);
    }


    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; WordApp_DocumentOpen(Microsoft.Office.Interop.Word.Document doc)
    {
      AttachSmartTag(doc);
    }


    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; AttachSmartTag(Word.Document doc)
    {
      &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (myTermsSmartTag &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;==&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) 
      {
        myTermsSmartTag &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; VSTO.SmartTag(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;SmartTags.jensha.net/StarWars#CharacterSample&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Star Wars Character Sample&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);
          &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; t &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; terms)
          {
            myTermsSmartTag.Terms.Add(t);
          }
      
          acSearchWikipedia &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; VSTO.Action(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Star Wars///Get Info from Wikipedia&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);
          acSearchWikipedia.Click &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; Microsoft.Office.Tools.Word.ActionClickEventHandler(acSearchWikipedia_Click);

          myTermsSmartTag.Actions &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; VSTO.Action[] { acSearchWikipedia };
      }

      doc.GetVstoObject().VstoSmartTags.Add(myTermsSmartTag);
    }
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/DIV&gt;
&lt;P&gt;Im Beispiel wurde mit der Terms Liste gearbeitet, die allerdings nur aus einem Wort bestehende Begriffe erkennt, da der in Word eingebaute Tokenizer den Text in entsprechende Tokens zerlegt. Werden Begriffe benötigt, die aus mehreren Worten bestehen oder einem bestimmten Muster unterliegen, so kann mit Regular Expressions gearbeitet werden.&lt;/P&gt;
&lt;P&gt;GetVstoObject() hat noch andere Vorteile: Man kann so auf die im Dokument eingebetteten Objekte (HostItems, wie z.B. ein ListObject in Excel) zugreifen.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8926246" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category><category domain="http://blogs.msdn.com/jensha/archive/tags/Real+Code/default.aspx">Real Code</category></item><item><title>RibbonX kennt .NET Images</title><link>http://blogs.msdn.com/jensha/archive/2008/07/18/ribbonx-kennt-net-images.aspx</link><pubDate>Fri, 18 Jul 2008 14:10:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8748509</guid><dc:creator>jensha</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jensha/comments/8748509.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=8748509</wfw:commentRss><description>&lt;p&gt;Das ist irgendwie total an mir vorbei gegangen. Während in der Beta (VS 2008 Office Integration) bei dynamisch befüllten Ribbon Controls:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:24cbe3cc-686a-4199-9c0d-798f3c648ec2" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;;overflow: auto;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;dropDown id&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;MyDropDown&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;
          getItemID&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;getDDItemID&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;
          getItemCount&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;getDDItemCount&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;
          getItemLabel&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;getDDItemLabel&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;
          getItemImage&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;getDDItemImage&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;
          onAction&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;onDDAction&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;dropDown&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;
&lt;p&gt;immer noch die Images als COM Struktur &lt;em&gt;&lt;strong&gt;IPictureDisp&lt;/strong&gt;&lt;/em&gt; übergeben:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:62da6233-ec21-44a6-8a73-b98d0c03065e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 581px; padding-top: 0px"&gt;&lt;pre style="background-color:White;;overflow: auto;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; stdole.IPictureDisp getDDItemImage(Office.IRibbonControl control, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; index)
{
   MemoryStream iconStream &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream(...);
   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; ImageConverter.ImageToPictureDisp(Image.FromStream(iconStream));
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;und dann datürlich eine Umwandlungsroutine geschrieben werden mußte, die &lt;strong&gt;&lt;em&gt;Image&lt;/em&gt;&lt;/strong&gt; in &lt;em&gt;&lt;strong&gt;IPictureDisp&lt;/strong&gt;&lt;/em&gt; konvertiert:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:730b5458-773b-4903-a108-a77be7ba6f07" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;;overflow: auto;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF;"&gt;internal&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ImageConverter : System.Windows.Forms.AxHost
{
  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ImageConverter() : &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty) { }

  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; stdole.IPictureDisp ImageToPictureDisp(Image image)
  {
    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; (stdole.IPictureDisp)GetIPictureDispFromPicture(image);
  }

  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; stdole.IPictureDisp IconToPictureDisp(Icon icon)
  {
    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; ImageToPictureDisp(icon.ToBitmap());
  }
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;kann jetzt das &lt;em&gt;&lt;strong&gt;Image&lt;/strong&gt;&lt;/em&gt; direkt übergeben werden:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:d65f2f01-75e2-4e06-8c20-b7e731fbf1fe" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;;overflow: auto;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Image getDDItemImage(Office.IRibbonControl control, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; index)
{
   MemoryStream iconStream &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream(...);
   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; Image.FromStream(iconStream);  
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Leider geht das nicht mit Icons. Also wer schön freigestellte Icons verwendet, wird nach wie vor die Umwandlungsroutine nutzen müssen (Was nicht wirklich viel mehr Aufwand darstellt).&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8748509" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category><category domain="http://blogs.msdn.com/jensha/archive/tags/Real+Code/default.aspx">Real Code</category></item><item><title>Upgrade but don't upgrade</title><link>http://blogs.msdn.com/jensha/archive/2008/06/30/upgrade-but-don-t-upgrade.aspx</link><pubDate>Mon, 30 Jun 2008 14:03:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8671121</guid><dc:creator>jensha</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jensha/comments/8671121.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=8671121</wfw:commentRss><description>&lt;p&gt;Stellen Sie sich vor, Sie haben ein VSTO 2005 SE Projekt mit Visual Studio 2005 und wollen auf Visual Studio 2008 umsteigen. Das Projekt stellt eine Erweiterung für Office 2003 dar, Sie haben auf der Entwicklermaschine aber schon Office 2007 installiert. Wenn Sie dieses Projekt nun in VS 2008 öffnen, bekommen Sie zwar die neue Code Basis, aber das Add-In zielt nun auf Office 2007 und nicht mehr auf 2003. Wollten Sie das so? Wenn ja, fein - wenn nicht, dann kannten Sie die folgende Option nicht.&lt;/p&gt; &lt;p&gt;In den Optionen von VS 2008 findet sich eine Rubrik &lt;strong&gt;&lt;em&gt;Office Tools&lt;/em&gt;&lt;/strong&gt;, die genau dieses Verhalten steuern kann. Wie im Bild zu sehen, kann das Verhalten bei Projektupdates beeinflußt werden:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/Upgradebutdontupgrade_B4C0/Upgrade%202%20Office%20version.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="455" alt="Upgrade 2 Office version" src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/Upgradebutdontupgrade_B4C0/Upgrade%202%20Office%20version_thumb.png" width="775" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Damit kann nach wie vor gegen die gleiche Version von Office entwickelt werden, obwohl diese gar nicht mehr installiert ist.&lt;/p&gt; &lt;p&gt;Anthony Crider, Software Design Engineer im BizApps Team, hat darüber einen &lt;a href="http://blogs.msdn.com/vsto/archive/2008/05/23/vs-2008-makes-me-upgrade-my-office-2003-add-in-but-i-don-t-want-to-anthony-crider.aspx"&gt;Blogeintrag&lt;/a&gt; geschrieben.&lt;/p&gt; &lt;p&gt;Übrigens kann man so auch ein neues Projekt für eine auf der Entwicklungsmaschine nicht vorhandene Office-Version anlegen. Das Deaktivieren der o.g. Option verhindert, daß beim nächsten Öffnen das Projekt auf die neue Office-Version konvertiert wird.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8671121" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category></item><item><title>Visual Studio 2008 Extensions for SharePoint</title><link>http://blogs.msdn.com/jensha/archive/2008/06/09/visual-studio-2008-extensions-for-sharepoint.aspx</link><pubDate>Mon, 09 Jun 2008 13:45:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8584919</guid><dc:creator>jensha</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jensha/comments/8584919.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=8584919</wfw:commentRss><description>&lt;h5&gt;&amp;nbsp;&lt;/h5&gt; &lt;p&gt;Endlich kann auch mit Visual Studio 2008 Sharepoint Entwicklung betrieben werden. Die Erweiterungsbibliotheken und einiges mehr stehen zum Download bereit.&lt;/p&gt; &lt;h5&gt;&amp;nbsp;&lt;/h5&gt; &lt;h5&gt;Visual Studio 2008 extensions for SharePoint&lt;/h5&gt; &lt;p&gt;Provides project templates for SharePoint artifacts and F5 solution debugging on Visual Studio 2008. &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7bf65b28-06e2-4e87-9bad-086e32185e68&amp;amp;DisplayLang=en"&gt;Download&lt;/a&gt; &lt;p&gt;&amp;nbsp; &lt;h5&gt;Visual Studio extensions for SharePoint User Guide&lt;/h5&gt; &lt;p&gt;150 Pages of User Guide for the Visual Studio extensions for SharePoint including tool descriptions and step by step how to guide’s for each project template including workflow. &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=A8A4E775-074D-4451-BE39-459921F79787&amp;amp;displaylang=en"&gt;Download&lt;/a&gt; &lt;p&gt;&amp;nbsp; &lt;h5&gt;A getting started with SharePoint flyer&lt;/h5&gt; &lt;p&gt;One side is for IT Professionals and the other side is for developers.  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=d41140ab-0ea3-47c7-be56-f42424166608&amp;amp;DisplayLang=en"&gt;Download&lt;/a&gt; &lt;p&gt;&amp;nbsp; &lt;h5&gt;SharePoint Development for .NET Developers&lt;/h5&gt; &lt;p&gt;A new &lt;a href="http://www.microsoft.com/click/SharePointDeveloper/"&gt;landing page for SharePoint&lt;/a&gt; developers with lots of new content. Everything from videos and online MSDN Virtual Labs to sample PPTs and Demos for presentations.  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;And don’t forget the &lt;a href="http://forums.microsoft.com/msdn/ShowForum.aspx?ForumID=1203&amp;amp;SiteID=1"&gt;SharePoint Developer and Programming Forum&lt;/a&gt; is resourced so customers can get answers.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8584919" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category><category domain="http://blogs.msdn.com/jensha/archive/tags/ISV+News+/default.aspx">ISV News </category></item><item><title>VSTO 3.0 / Office 2007: Whitepaper für MSI-Deployment</title><link>http://blogs.msdn.com/jensha/archive/2008/05/30/vsto-3-0-office-2007-whitepaper-f-r-msi-deployment.aspx</link><pubDate>Fri, 30 May 2008 16:29:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8563122</guid><dc:creator>jensha</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jensha/comments/8563122.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=8563122</wfw:commentRss><description>&lt;p&gt;Lange hat's gedauert, aber nun ist das Whitepaper verfügbar. Darin wird erklärt, was alles zu tun ist, um VSTO 3.0 Lösungen für Office 2007 in einem Windows Installer Package zu verteilen.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc563937.aspx"&gt;Teil 1&lt;/a&gt; und &lt;a href="http://msdn.microsoft.com/en-us/library/cc616991.aspx"&gt;Teil 2&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Inhalt:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;You can develop a Visual Studio Tools for the Office system 3.0 solution for the 2007 Microsoft Office system, and deploy the solution by using a Visual Studio 2008 Setup project to create a Windows Installer package. The discussion includes steps for deploying a simple add-in, including additional files and components, and trusting the solution. This applies to both application-level add-ins and document-level solutions.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8563122" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category></item><item><title>VSTO 3.0 Add-Ins für alle User installieren</title><link>http://blogs.msdn.com/jensha/archive/2008/05/09/vsto-3-0-add-ins-f-r-alle-user-installieren.aspx</link><pubDate>Fri, 09 May 2008 17:20:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8480299</guid><dc:creator>jensha</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jensha/comments/8480299.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=8480299</wfw:commentRss><description>&lt;p&gt;Das Office 2007 Security Modell erlaubt es nicht, unter HKLM registrierte Managed Add-Ins zu verwenden. Was nicht hei&amp;#223;t, dass mit einem Trick das Ganze nicht dennoch erreicht werden kann. &lt;a href="http://blogs.msdn.com/mshneer" mce_href="http://blogs.msdn.com/mshneer"&gt;Misha Shneerson&lt;/a&gt;, Senior Software Design Engineer im Microsoft BizApps Team, hat die notwendigen Aspekte in seinem Blog (&lt;a href="http://blogs.msdn.com/mshneer/archive/2007/09/04/deploying-your-vsto-add-in-to-all-users-part-i.aspx" mce_href="http://blogs.msdn.com/mshneer/archive/2007/09/04/deploying-your-vsto-add-in-to-all-users-part-i.aspx"&gt;Teil 1&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/mshneer/archive/2007/09/05/deploying-your-vsto-add-in-to-all-users-part-ii.aspx" mce_href="http://blogs.msdn.com/mshneer/archive/2007/09/05/deploying-your-vsto-add-in-to-all-users-part-ii.aspx"&gt;Teil 2&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/mshneer/archive/2008/04/24/deploying-your-vsto-add-in-to-all-users-part-iii.aspx" mce_href="http://blogs.msdn.com/mshneer/archive/2008/04/24/deploying-your-vsto-add-in-to-all-users-part-iii.aspx"&gt;Teil 3&lt;/a&gt;) beschrieben. Ich will mir hier die Zeit nehmen und das Ganze etwas erl&amp;#228;utern.&lt;/p&gt;  &lt;p&gt;Die Basis ist ein Registry-Replikations-Mechanismus von Office, durch welchen bestimmte Eintr&amp;#228;ge von HKLM nach HKCU repliziert werden, wenn eine der Office Anwendungen gestartet wird.&lt;/p&gt;  &lt;p&gt;Definiert werden diese Eintr&amp;#228;ge unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\User Settings mittels eines &lt;strong&gt;Create&lt;/strong&gt; bzw. &lt;strong&gt;Delete&lt;/strong&gt; Keys. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ein Beispiel:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Ein Add-In f&amp;#252;r Excel 2007 wird hier registriert (ich gehe davon aus, dass die Manifests digital signiert wurden und eine Trust Chain auf der Zielmaschine existiert (&lt;a href="http://blogs.msdn.com/jensha/archive/2008/04/22/vsto-3-0-security.aspx" mce_href="http://blogs.msdn.com/jensha/archive/2008/04/22/vsto-3-0-security.aspx"&gt;siehe hier&lt;/a&gt;):&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins\MyAddIn&lt;/p&gt;  &lt;p&gt;Die erforderlichen Eintr&amp;#228;ge w&amp;#228;ren:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="643" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="130"&gt;&lt;strong&gt;Name&amp;#160;&amp;#160; &lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="119"&gt;&lt;strong&gt;Type&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="392"&gt;&lt;strong&gt;Value&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="132"&gt;Description &lt;/td&gt;        &lt;td valign="top" width="118"&gt;REG_SZ&lt;/td&gt;        &lt;td valign="top" width="391"&gt;Ein Add-In f&amp;#252;r Excel ...&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="134"&gt;FriendlyName &lt;/td&gt;        &lt;td valign="top" width="118"&gt;REG_SZ&lt;/td&gt;        &lt;td valign="top" width="390"&gt;MyAddIn&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="135"&gt;LoadBehavior&lt;/td&gt;        &lt;td valign="top" width="118"&gt;DWORD&lt;/td&gt;        &lt;td valign="top" width="389"&gt;3&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="136"&gt;Manifest&lt;/td&gt;        &lt;td valign="top" width="117"&gt;REG_SZ&lt;/td&gt;        &lt;td valign="top" width="389"&gt;C:\\Program Files\\MyCompany\\MyAddin.vsto|vstolocal&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Um jeden an der Maschine angemeldeten Benutzer in den Genu&amp;#223; des Add-Ins kommen zu lassen, wird dieser Pfad im Prinzip auf die UserSettings von Office 2007 in HKLM &amp;quot;kopiert&amp;quot;. Der gesamte Pfad w&amp;#252;rde dann so aussehen: &lt;/p&gt;  &lt;p&gt;HKEY_LOCAL_MACHINE   &lt;br /&gt;&amp;#160;&amp;#160; SOFTWARE    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Microsoft    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Office    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 12.0    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; User Settings    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;MyCompany_MyAddIn     &lt;br /&gt;&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Create    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Software    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Microsoft    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Office    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Excel    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Addins    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MyAddIn&lt;/p&gt;  &lt;p&gt;Unter MyAddIn stehen dann die in der o.g. Tabelle angegebenen Werte.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Nicht genug&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Das reicht aber noch nicht. Repliziert wird der Pfad nur, wenn eine vorhandene &lt;strong&gt;Count Property&lt;/strong&gt; (DWORD) auf dem im obigen Pfad fett formatierten Key (MyCompany.MyAddIn) gefunden wird und deren Wert vom Wert derselben im Ziel-Hive der Registry (HKCU) abweicht. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0AddInsfralleUserinstallieren_CEAF/OfficeRegReplication_1.png" mce_href="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0AddInsfralleUserinstallieren_CEAF/OfficeRegReplication_1.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="261" alt="OfficeRegReplication" src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0AddInsfralleUserinstallieren_CEAF/OfficeRegReplication_thumb_1.png" width="657" border="0" mce_src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0AddInsfralleUserinstallieren_CEAF/OfficeRegReplication_thumb_1.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Der Wert am Zielort wird unter HKCU\Software\Microsoft\Office\12.0\User Settings\MyAddIn gef&amp;#252;hrt. Das wird getan, um nicht bei jedem Start die Replikation durchzuf&amp;#252;hren, sondern nur bei &amp;#196;nderungen. Deshalb mu&amp;#223; auch diese Count Property nach dem Deinstallieren erhalten bleiben. Am besten. man z&amp;#228;hlt bei jeder &amp;#196;nderung per Custom Action den Wert um eins hoch. Der Wertebereich eines DWords sollte f&amp;#252;r einige Zeit ausreichen.&lt;/p&gt;  &lt;p&gt;Da die Installation mittels MSI stattfinden sollte, m&amp;#252;ssen einige Dinge beachtet werden:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Der unter Manifest angegebene Pfad mu&amp;#223; so aussehen: [TARGETDIR]MyAddin.vsto|vstolocal     &lt;br /&gt;Der MSI setzt den ausgew&amp;#228;hlten Zielpfad automatisch ein. &lt;/li&gt;    &lt;li&gt;Der &lt;strong&gt;Create&lt;/strong&gt; Key mu&amp;#223; mit dem Flag &lt;em&gt;DeleteAtUninstall&lt;/em&gt; versehen sein, damit er wieder entfernt wird. &lt;/li&gt;    &lt;li&gt;Beim Deinstallieren mu&amp;#223; ein Delete Subkey geschrieben werden, der daf&amp;#252;r sorgt, da&amp;#223; beim n&amp;#228;chsten Start der Hostapplikation die Registrierung des Add-Ins aufgehoben wird. Der sieht vom Aufbau her genauso aus wie der Create Key. Allerdings - da dieser in der Registry verbleibt - mu&amp;#223; beim erneuten Installieren ein evtl. vorhandener Delete Key gel&amp;#246;scht werden. &lt;/li&gt;    &lt;li&gt;Und nat&amp;#252;rlich mu&amp;#223; beim Installieren wie auch beim Deinstallieren die Count Property erzeugt bzw. hochgez&amp;#228;hlt werden.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Im anfangs referenzierten Blog findet sich der Code f&amp;#252;r diese Aktionen. Das klingt kompliziert, aber man mu&amp;#223; sich vor Augen halten, da&amp;#223; hier per User und per Machine Aktionen koodiniert werden m&amp;#252;ssen und der Sicherheitsmechanismus von VSTO der von ClickOnce ist - einer Technologie, die per User funktioniert.&lt;/p&gt;  &lt;p&gt;Nat&amp;#252;rlich kann man das auch auf Basis der Inclusion List tun, Misha Shneerson erkl&amp;#228;rt das in &lt;a href="http://blogs.msdn.com/mshneer/archive/2008/04/24/deploying-your-vsto-add-in-to-all-users-part-iii.aspx" mce_href="http://blogs.msdn.com/mshneer/archive/2008/04/24/deploying-your-vsto-add-in-to-all-users-part-iii.aspx"&gt;Teil 3&lt;/a&gt;. Das sollte aber nur bei nichtverwalteten Netzwerken getan werden, da die zu erwartende Sicherheit geringer ist.&lt;/p&gt;  &lt;p&gt;Bitte beachten: Es handelt sich hierbei um einen internen Office-Mechanismus. Nat&amp;#252;rlich kann man den verwenden. Es ist aber nicht garantiert, da&amp;#223; das Verhalten in Office-Versionen nach Office 2007 genauso ist. Eine Verwendung desselben geschieht demnach auf eigene Gefahr.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8480299" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category><category domain="http://blogs.msdn.com/jensha/archive/tags/Setup+_2600_amp_3B00_+Deployment/default.aspx">Setup &amp;amp; Deployment</category></item><item><title>Ribbon Controls mit best. Control IDs können nicht deaktiviert werden</title><link>http://blogs.msdn.com/jensha/archive/2008/05/06/ribbon-controls-mit-best-control-ids-k-nnen-nicht-deaktiviert-werden.aspx</link><pubDate>Tue, 06 May 2008 17:29:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8463111</guid><dc:creator>jensha</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jensha/comments/8463111.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=8463111</wfw:commentRss><description>&lt;p&gt;In der &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=4329D9E9-4D11-46A5-898D-23E4F331E9AE&amp;amp;displaylang=en"&gt;Liste der Control Ids&lt;/a&gt; sind die Namen der eingebauten Controls zu finden. Offensichtlich haben sich einige der Controls - so wie das bei Menschen auch hin und wieder üblich ist - einen zweiten Namen zugelegt. Das führt zu Unstimmigkeiten, die dazu führen, dass einige der eingebauten Controls nicht deaktiviert werden können, wenn der erste Name (auch im Anpassen Dialog der Quick Access Toolbar angezeigt) verwendet wird. Für ein simples Anzeigen der Controls und Verwenden der eingebauten Funktionalität kann auch weiterhin dieser erste Name verwendet werden. &lt;/p&gt; &lt;p&gt;In der nachfolgenden Tabelle finden Sie unter &lt;em&gt;&lt;strong&gt;Control ID for Disabling&lt;/strong&gt;&lt;/em&gt; den korrekten Namen des Controls zum Deaktivieren.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/3ae0de7ccd0c_A0FA/ControlId%20Bugs.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="512" alt="ControlId Bugs" src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/3ae0de7ccd0c_A0FA/ControlId%20Bugs_thumb.png" width="575" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Somit kann mit folgenden Snippet verhindert werden, dass z.B. die Gridlines ein- bzw. ausgeschaltet werden können:&lt;/p&gt; &lt;p&gt;&amp;lt;customUI xmlns="&lt;a href="http://schemas.microsoft.com/office/2006/01/customui&amp;quot;"&gt;http://schemas.microsoft.com/office/2006/01/customui"&lt;/a&gt; onLoad="Ribbon_Load"&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;commands&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;command idMso="ViewSheetGridlines" enabled="false"/&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/commands&amp;gt;&lt;br&gt;&amp;lt;/customUI&amp;gt;&lt;/p&gt; &lt;p&gt;oder &lt;p&gt;&amp;lt;customUI xmlns="&lt;a href="http://schemas.microsoft.com/office/2006/01/customui&amp;quot;"&gt;http://schemas.microsoft.com/office/2006/01/customui"&lt;/a&gt; onLoad="Ribbon_Load"&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;commands&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;command idMso="SplitCells" getEnabled="GetSplitCellsEnabled"/&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/commands&amp;gt;&lt;br&gt;&amp;lt;/customUI&amp;gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8463111" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category></item><item><title>VSTO 3.0 Security</title><link>http://blogs.msdn.com/jensha/archive/2008/04/22/vsto-3-0-security.aspx</link><pubDate>Tue, 22 Apr 2008 11:24:04 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8416240</guid><dc:creator>jensha</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jensha/comments/8416240.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=8416240</wfw:commentRss><description>&lt;p&gt;Im &lt;strong&gt;dotNet Magazin&lt;/strong&gt;, Ausgabe 4/08 habe ich das Security-Modell und den Deployment-Mechanismus von VSTO 3.0 beschrieben. Da sicherlich nicht jeder (oder doch?) diese Ausgabe gelesen hat und die L&amp;#228;nge des Artikels begrenzt war, hier noch ein paar Gedanken dazu.&lt;/p&gt;  &lt;p&gt;VSTO 3.0 verwendet nach wie vor &lt;strong&gt;Code Access Security&lt;/strong&gt;, wenn es um Add-Ins oder Dokumentzentrische L&amp;#246;sungen f&amp;#252;r &lt;strong&gt;Office 2003&lt;/strong&gt; geht. Zielen wir aber auf &lt;strong&gt;Office 2007&lt;/strong&gt;, so k&amp;#246;nnen wir dieses Modell nicht mehr verwenden. Die verwendeten Manifeste (Application und Deployment Manifest) m&amp;#252;ssen &lt;strong&gt;digital signiert&lt;/strong&gt; werden (ClickOnce Security Modell). Und dazu brauchen wir ein Digitales Zertifikat. Dieses sollte bei professionellen L&amp;#246;sungen von einer vertrauensw&amp;#252;rdigen Internet Zertifikats-Authorit&amp;#228;t stammen (Verisign, Thawte, etc.) oder bei Unternehmensl&amp;#246;sungen von einem im Unternehmen stehenden Zertifikatsserver (der MS Certificate Server ist im Windows Server enthalten).&lt;/p&gt;  &lt;p&gt;Vor dem Deployment der eigentlichen Anwendung mu&amp;#223; dann nur das zum Signieren benutzte Zertifikat auf den Clients bekannt gemacht werden, sprich ein sog. &lt;strong&gt;Trusted Publisher&lt;/strong&gt; eingerichtet werden. Das Zertifikat der &lt;strong&gt;herausgebenden Authorit&amp;#228;t&lt;/strong&gt; mu&amp;#223; dabei im &lt;strong&gt;Root Certificate Store&lt;/strong&gt; zu finden sein, damit eine Trust Chain aufgebaut werden kann. Damit kann eindeutig bestimmt werden, da&amp;#223; die zu installierende Anwendung von einem Herausgeber stammt, dem das System vertraut. Das ist nichts anderes als das, was gr&amp;#246;&amp;#223;ere Unternehmen mit einer intakten PKI (Public Key Infrastructure) heute schon bei der Verteilung von In-Haus-Anwendungen verwenden.&lt;/p&gt;  &lt;p&gt;Doch, &lt;strong&gt;erstens&lt;/strong&gt; kann/will nicht jeder Geld f&amp;#252;r Zertifikate ausgeben, &lt;strong&gt;zweitens&lt;/strong&gt; hat nicht jeder die Infrastruktur f&amp;#252;r einen eigenen Zertifikatsserver und &lt;strong&gt;drittens&lt;/strong&gt; sind die Sicherheitsanforderungen bei Einzel-PCs nicht die gleichen wie bei durch Administratoren verwalteten Netzwerken. Was also tun?&lt;/p&gt;  &lt;p&gt;Die Manifeste von VSTO-Projekten in &lt;strong&gt;Visual Studio 2008&lt;/strong&gt; werden mit Zertifikaten signiert, die mit &lt;strong&gt;MakeCert.exe&lt;/strong&gt; erzeugt werden (self-signed). Das sind universale Code Signing Zertifikate, denen aber ein wichtiger Teil fehlt: Die Manufacturer bzw. Publisher Information. &lt;strong&gt;Damit kann keine Trust Chain aufgebaut werden!&lt;/strong&gt; Also doch ein Zertifikat kaufen?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="468" alt="VS SelfCert" src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0Security_95AD/VS%20SelfCert_3.png" width="772" border="0" mce_src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0Security_95AD/VS%20SelfCert_3.png" /&gt; &lt;/p&gt;  &lt;p&gt;Hier kommt eine Ausnahme ins Spiel. Die &lt;strong&gt;Inclusion List&lt;/strong&gt;. Wird ein solches VSTO 3.0-Setup (ClickOnce Application) gestartet, fehlt die Trust Chain und ein Trust Prompt teilt dem Anwender mit, da&amp;#223; das verwendete Zertifikat nicht vertrauensw&amp;#252;rdig ist (es wurde entweder ein vollst&amp;#228;ndiges Zertifikat verwendet, aber der Herausgeber ist nicht in Trusted Root Certificates zu finden oder das Zertifikat wurde mit MakeCert erstellt und es fehlen die entsprechenden Infos). Weiterhin wird (nicht immer, aber dazu weiter unten im Text) gefragt, ob die Anwendung dennoch installiert werden soll.&lt;/p&gt;  &lt;p&gt;Entscheidet sich der Anwender f&amp;#252;r ein Installieren, so wird neben den bekannten Infos auch ein Eintrag in die Inclusion List gesetzt. Diese Liste (&lt;strong&gt;HKCU\Software\Microsoft\VSTO\Security\Inclusion&lt;/strong&gt;) enth&amp;#228;lt je einen Schl&amp;#252;ssel mit zwei Werten (Public Key der Signatur und die URL zum Deployment Manifest) f&amp;#252;r eine VSTO 3.0 L&amp;#246;sung. Solange sich die Signatur der Anwendung nicht &amp;#228;ndert, wird Ihr (auch nach Updates) vertraut.&lt;/p&gt;  &lt;p&gt;In verwalteten Umgebungen, wo ein Netzwerk-Administrator sich darum k&amp;#252;mmert, wer was darf und warum, ist dieses Verhalten nicht erw&amp;#252;nscht und kann auch abgeschaltet werden. Auch bei Anwendungen, die aus unsicheren Zonen wie dem Internet kommen, k&amp;#246;nnte das ein Problem werden. &lt;/p&gt;  &lt;p&gt;Aus diesem Grund kann das &lt;strong&gt;TrustPrompt-Verhalten&lt;/strong&gt; separat gesteuert werden. Dazu wird in der Registry unter HKLM\SOFTWARE\Microsoft\.NETFramework\Security\TrustManager\ ein Key &lt;i&gt;&lt;strong&gt;PromptingLevel&lt;/strong&gt;&lt;/i&gt; angelegt und f&amp;#252;r die gew&amp;#252;nschte Zone (siehe Tabelle) der Wert auf &lt;strong&gt;&lt;em&gt;Enabled&lt;/em&gt;&lt;/strong&gt;, &lt;i&gt;&lt;strong&gt;AuthenticodeRequired&lt;/strong&gt;&lt;/i&gt; bzw. &lt;i&gt;&lt;strong&gt;Disabled&lt;/strong&gt;&lt;/i&gt; gesetzt werden. (An dieser Stelle war die Erkl&amp;#228;rung im dotNet Magazin etwas zu kurz gekommen)&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Enabled&lt;/strong&gt;&lt;/em&gt; ist klar, TrustPrompts sind erlaubt. &lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;strong&gt;AuthenticodeRequired&lt;/strong&gt;&lt;/i&gt; bedeutet, dass Trust Prompts erlaubt sind, wenn:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ein Zertifikat mit einer &lt;strong&gt;bekannten Identit&amp;#228;t&lt;/strong&gt; (Publisher Informationen) verwendet wird (was ein in Visual Studio mit makecert.exe selbst erzeugtes Zertifikat nicht besitzt) &lt;/li&gt;    &lt;li&gt;dieses Zertifikat &lt;strong&gt;nicht&lt;/strong&gt; im Trusted Publisher Store zu finden ist &lt;/li&gt;    &lt;li&gt;das &lt;strong&gt;Zertifikat des Herausgebers&lt;/strong&gt; (bspw. das des eigenen Zertifikatsservers) &lt;strong&gt;im Trusted Root&lt;/strong&gt; Store liegt&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In diesem Fall spricht man von sog. Friendly Trust Prompts, da sie das Installieren erlauben:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="311" alt="Friendly Trust Prompt" src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0Security_95AD/Friendly%20Trust%20Prompt_1.png" width="607" border="0" mce_src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0Security_95AD/Friendly%20Trust%20Prompt_1.png" /&gt; &lt;/p&gt;  &lt;p&gt;Ein Klick auf &amp;quot;More Information ...&amp;quot; enth&amp;#252;llt Details:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="542" alt="Friendly Trust Prompt Info" src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0Security_95AD/Friendly%20Trust%20Prompt%20Info_1.png" width="660" border="0" mce_src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0Security_95AD/Friendly%20Trust%20Prompt%20Info_1.png" /&gt; &lt;/p&gt;  &lt;p&gt;Man kann also schon anhand des Icons im Dialog gewissse R&amp;#252;ckschl&amp;#252;sse ziehen. Die Publisher Informationen sind bei einem Self-Cert (also mit MakeCert erstelltem Zertifikat nicht zu sehen, weil nicht vorhanden.&lt;/p&gt;  &lt;p&gt;Bei &lt;strong&gt;&lt;em&gt;Disabled&lt;/em&gt;&lt;/strong&gt; besteht keine Chance des Umgehens. &lt;strong&gt;Nur vertrauensw&amp;#252;rdige Zertifikate&lt;/strong&gt; (mit vollst&amp;#228;ndiger Trust Chain, also Trusted Publisher und Trusted Root Zertifikate vorhanden und g&amp;#252;ltig) sind erlaubt. Das betrifft auch schon vorhandene Inclusion List Eintr&amp;#228;ge, die in diesem Fall ignoriert werden, da die Zertifikatsauswertung Priorit&amp;#228;t vor der Inclusion List besitzt. &lt;/p&gt;  &lt;p&gt;Sind diese Voraussetzungen nicht gegeben, so erh&amp;#228;lt man ein sog. Unfriendly Trust Prompt, nur um zusagen: Pech gehabt, die L&amp;#246;sung kann nicht installiert werden:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="293" alt="Unfriendly Trust Prompt" src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0Security_95AD/Unfriendly%20Trust%20Prompt_1.png" width="605" border="0" mce_src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0Security_95AD/Unfriendly%20Trust%20Prompt_1.png" /&gt; &lt;/p&gt;  &lt;p&gt;Auch hier erh&amp;#252;llt ein Klick aud Details die Hintergr&amp;#252;nde:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="133" alt="Unfriendly Trust Prompt Details" src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0Security_95AD/Unfriendly%20Trust%20Prompt%20Details_1.png" width="535" border="0" mce_src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0Security_95AD/Unfriendly%20Trust%20Prompt%20Details_1.png" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Einen Ausweg stellt die Aufnahme des entsprechenden (Installations-)&lt;strong&gt;Pfades&lt;/strong&gt; in die Liste der &lt;strong&gt;TrustedSites &lt;/strong&gt;sein. Daf&amp;#252;r gibt es einen eigenen PromptingLevel-Eintrag, der i.d.R. auf Enabled gesetzt sein d&amp;#252;rfte. Das funktioniert aber nur, wenn der Pfad nicht unter &lt;strong&gt;UntrustedSites&lt;/strong&gt; gelisted ist.&lt;/p&gt;  &lt;p&gt;Wurde dagegen das PromptingLevel nach der Installation einer mit einem nicht vertrauten Zertifikat signierten L&amp;#246;sung (dabei wurde der TrustPromt positiv best&amp;#228;tigt) von Enabled auf AuthenticodeRequired oder Disabled ge&amp;#228;ndert, so l&amp;#228;uft die L&amp;#246;sung trotzdem, da die Pr&amp;#252;fung w&amp;#228;hrend der ClickOnce Installation abl&amp;#228;uft und nicht beim Start der Anwendung.&lt;/p&gt;  &lt;p&gt;Obwohl der Key PromptingLevel i.d.R. nicht vorhanden ist, sind folgende Werte aktiv:&lt;/p&gt;  &lt;table class="" cellspacing="0" cellpadding="2" width="400" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td class="" valign="top" width="133"&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;        &lt;td class="" valign="top" width="133"&gt;&lt;strong&gt;Typ&lt;/strong&gt;&lt;/td&gt;        &lt;td class="" valign="top" width="133"&gt;&lt;strong&gt;Wert&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="" valign="top" width="133"&gt;Internet&lt;/td&gt;        &lt;td class="" valign="top" width="133"&gt;REG_SZ&lt;/td&gt;        &lt;td class="" valign="top" width="133"&gt;AuthenticodeRequired&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="" valign="top" width="133"&gt;LocalIntranet&lt;/td&gt;        &lt;td class="" valign="top" width="133"&gt;REG_SZ&lt;/td&gt;        &lt;td class="" valign="top" width="133"&gt;Enabled&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="" valign="top" width="133"&gt;MyComputer&lt;/td&gt;        &lt;td class="" valign="top" width="133"&gt;REG_SZ&lt;/td&gt;        &lt;td class="" valign="top" width="133"&gt;Enabled&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="" valign="top" width="133"&gt;TrustedSites&lt;/td&gt;        &lt;td class="" valign="top" width="133"&gt;REG_SZ&lt;/td&gt;        &lt;td class="" valign="top" width="133"&gt;Enabled&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="" valign="top" width="133"&gt;UntrustedSites&lt;/td&gt;        &lt;td class="" valign="top" width="133"&gt;REG_SZ&lt;/td&gt;        &lt;td class="" valign="top" width="133"&gt;Disabled&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Visual Studio 2008 selbst legt &amp;#252;brigens f&amp;#252;r jedes VSTO-Projekt (f&amp;#252;r Office 2007) einen Eintrag in der Inclusion List an. (&lt;strong&gt;Vorsicht also bei Testen&lt;/strong&gt; von ClickOnce Deployment f&amp;#252;r &amp;#214;ffice L&amp;#246;sungen auf der Entwickler-Maschine, es m&amp;#252;ssen nach dem Publish-Prozess zuerst die Add-In Eintr&amp;#228;ge f&amp;#252;r Office und der Eintrag in der Inclusion List entfernt werden!) &lt;/p&gt;  &lt;p&gt;Au&amp;#223;erdem &amp;#252;berpr&amp;#252;ft VS auch, ob eine intakte Trust Chain f&amp;#252;r nicht selbst generierte Zertifikate besteht und bricht das Kompilieren ab, wenn das nicht der Fall ist. (Beispiel: Code Signing Certifikat im Trusted Publisher Store, aber kein Trusted Root vorhanden)&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="159" alt="CertNotTrusted in VS" src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0Security_95AD/CertNotTrusted%20in%20VS_2.png" width="564" border="0" mce_src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTO3.0Security_95AD/CertNotTrusted%20in%20VS_2.png" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Zum Handhaben der Zertifikate sollte man die Management Console (MMC) mit dem Snap-In Zertifikate verwenden. In gewissem Umfang kann auch der Browser (Tools - Options - Content - Certificates) verwendet werden, jedoch zeigt dieser nicht alle Stores an.&lt;/p&gt;  &lt;p&gt;&amp;#220;brigens, wenn beim Signieren ein TimeStamp (offizieller Zeitstempel einer bekannten Internet Authorit&amp;#228;t, TimeStamp Server) verwendet wird, dann laufen Ihre L&amp;#246;sungen auch noch nach Ablauf des G&amp;#252;ltigkeitsdatums des Zertifikates, da der Zeitpunkt des Signierens innerhalt des G&amp;#252;ltigkeitzeitraums lag und das auch nachgewiesen werden kann (anhand des TimeStamps). Ansonsten m&amp;#252;ssen Zertifikate nach Ablauf erneuert werden. Er handelt sich dabei um kein komplett neues Zertifikat, sondern es enth&amp;#228;lt Informationen des urspr&amp;#252;nglich erstellten. Somit m&amp;#252;ssen bei erneuerten Zertifikate die einmal verteilten L&amp;#246;sungen nicht erneut signiert werden.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Fazit:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In der Regel wird sich der Entwickler nicht um die PKI (Public Key Infrastructure) k&amp;#252;mmern, da dies von Administratoren erledigt wird. Erstens ist aber gut zu wissen, wie es funktioniert und zweitens kommt es wahrscheinlich schon vor, dass Admin und Entwickler eine Personalunion bilden.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8416240" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category><category domain="http://blogs.msdn.com/jensha/archive/tags/Setup+_2600_amp_3B00_+Deployment/default.aspx">Setup &amp;amp; Deployment</category></item><item><title>Erweiterungsbibliothek für Excel-Tabellenfunktionen in Managed Code schreiben</title><link>http://blogs.msdn.com/jensha/archive/2008/04/09/erweiterungsbibliothek-f-r-excel-tabellenfunktionen-in-managed-code-schreiben.aspx</link><pubDate>Wed, 09 Apr 2008 15:48:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8372265</guid><dc:creator>jensha</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/jensha/comments/8372265.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=8372265</wfw:commentRss><description>&lt;P&gt;Hin und wieder werde ich gefragt, ob man mit VSTO auch Tabellenfunktionen für Excel schreiben kann. Nun, bislang kann man das nicht. Allerdings kann man mit etwas COM Interop das Ganze als Excel Add-In (Vorsicht, nicht COM Add-In) laufen lassen. Wie das geht, will ich im Folgenden mal beschreiben.&lt;/P&gt;
&lt;P&gt;Als allererstes muß natürlich in Visual Studio eine einfache Klassenbibliothek angelegt und diese für COM sichtbar gemacht werden. Wichtig dabei ist, dass das COM Interface vom Typ &lt;STRONG&gt;AutoDual&lt;/STRONG&gt; ist, sonst sieht Excel die Klasse nicht. Da bei der COM Registrierung mittel Regasm kein &lt;EM&gt;&lt;STRONG&gt;Programmable&lt;/STRONG&gt;&lt;/EM&gt; Key geschrieben wird, wir den aber brauchen, müssen wir uns selbst darum kümmern, dass der geschrieben wird. Dafür sind die beiden Methoden &lt;STRONG&gt;&lt;EM&gt;RegistrationMethod&lt;/EM&gt;&lt;/STRONG&gt; und &lt;EM&gt;&lt;STRONG&gt;UnregistrationMethod&lt;/STRONG&gt;&lt;/EM&gt; zuständig.&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://blogcasts.de/jensha/scr1.png"&gt; &lt;/P&gt;
&lt;P&gt;Nun ist es relativ einfach, Funktionen mit skalaren Parametern wie integer oder double zu implementieren: 
&lt;P&gt;&lt;IMG src="http://blogcasts.de/jensha/scr2.png"&gt; 
&lt;P&gt;Schwieriger wir es, wenn der Inhalt eines Arrays durchsucht werden soll. Normalerweise würden wir das so machen: 
&lt;P&gt;&lt;IMG src="http://blogcasts.de/jensha/scr3.png"&gt; 
&lt;P&gt;Das funktioniert aber nicht. Da ein Range Objekt in Excel als ein einziges COM Objekt (System.__ComObject) übergeben wird, müssen wir die Werte der einzelnen Zellen herausholen und ein Array erzeugen, welches am besten auch noch 0-basiert ist. Diese Konvertierung wird der eigentlichen Funktion vorgeschaltet: 
&lt;P&gt;&lt;IMG src="http://blogcasts.de/jensha/scr4.png"&gt;&lt;/P&gt;
&lt;P&gt;Dazu kommt noch die Behandlung sog. flüchtiger Funktionen. Das sind solche, die bei gleichen Parameterwerten zu verschiedener Zeit unterschiedliche Ergebnisse liefern, wie z.B. now(). 
&lt;P&gt;&lt;IMG src="http://blogcasts.de/jensha/scr5.png"&gt; 
&lt;P&gt;Sind diese im eigenen Code enthalten, müssen wir die Hostanwendung (also Excel) darauf aufmerksam machen (Volatile-Methode). Das führt dann dazu, dass nach Eingabe der Funktion bei jedem Neuberechnen der Tabelle auch diese Funktion berechnet wird. Anderenfalls denkt Excel - da sich die Eingabewerte ja nicht verändert haben - der Rückgabewert wäre konstant. 
&lt;P&gt;Wir benötigen dafür einen Zeiger auf die aktuelle Instanz von Excel, weswegen wir &lt;STRONG&gt;IDTExtensibility&lt;/STRONG&gt; implementieren müssen und deshalb eine Referenz auf die Extensibility Library und - wegen der Typreferenz (Excel.Application) - die Excel PIA setzen müssen. In dessen &lt;EM&gt;&lt;STRONG&gt;OnConnection&lt;/STRONG&gt;&lt;/EM&gt; Event bekommt man diese Instanz&amp;nbsp;übergeben. Dort speichern wir uns den Zeiger in einer lokalen Property. Alle anderen Events des IDTExtensibility Interfaces brauchen wir nicht zu befüllen, müssen diese aber implementieren und die Standard-Inhalte entfernen (Throw Exception, hier im Beispiel nicht angegeben) 
&lt;P&gt;&lt;IMG src="http://blogcasts.de/jensha/scr6.png"&gt; 
&lt;P&gt;Nach dem Kompilieren muß die Assembly nur noch registriert werden: &lt;STRONG&gt;regasm /codebase ExcelExtender.dll&lt;/STRONG&gt; &lt;BR&gt;(unter Vista die Console im Admin-Mode starten) 
&lt;P&gt;Und am Ende das Add-In Excel bekannt machen: 
&lt;P&gt;&lt;IMG src="http://blogcasts.de/jensha/scr7.png"&gt; 
&lt;P&gt;Danach können wir die Erweiterungsfunktionen auf der Maschine, auf der die Erweiterungsbibliothek registriert wurde verwenden 
&lt;P&gt;&lt;IMG src="http://blogcasts.de/jensha/scr8.png"&gt; 
&lt;P&gt;Weitere Hinweise finden Sie in den Teilen &lt;A href="http://blogs.msdn.com/cumgranosalis/archive/2006/08/03/ServerClientUDFsCompat1.aspx" mce_href="http://blogs.msdn.com/cumgranosalis/archive/2006/08/03/ServerClientUDFsCompat1.aspx"&gt;eins&lt;/A&gt;, &lt;A href="http://blogs.msdn.com/cumgranosalis/archive/2006/08/30/ServerClientUDFsCompat2.aspx" mce_href="http://blogs.msdn.com/cumgranosalis/archive/2006/08/30/ServerClientUDFsCompat2.aspx"&gt;zwei&lt;/A&gt; und &lt;A href="http://blogs.msdn.com/cumgranosalis/archive/2007/03/07/ServerClientUDFsCompat3.aspx" mce_href="http://blogs.msdn.com/cumgranosalis/archive/2007/03/07/ServerClientUDFsCompat3.aspx"&gt;drei&lt;/A&gt; einer 3-teiligen Serie von Shahar Prish. 
&lt;P&gt;Der Kollege ist Software Architect im Excel Services Team in Redmond und schreibt darin über User Defined Functions, die sowohl in Excel Services als auch auf dem Client verwendet werden können. Den Excel Services-Anteil kann man in unserem Kontext einfach ausblenden.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8372265" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category><category domain="http://blogs.msdn.com/jensha/archive/tags/Real+Code/default.aspx">Real Code</category></item><item><title>VSTO Support für Office Standard Edition</title><link>http://blogs.msdn.com/jensha/archive/2008/04/08/vsto-support-f-r-office-standard-edition.aspx</link><pubDate>Tue, 08 Apr 2008 12:04:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8368353</guid><dc:creator>jensha</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jensha/comments/8368353.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=8368353</wfw:commentRss><description>&lt;p&gt;Wer sich mal die Systemanforderungen für VSTO 2005 SE angesehen hat (macht das überhaupt jemand?), wird festgestellt haben, dass da auch die Standard Version von Office 2003 drin steht. Wie denn das? Hat Microsoft nicht immer behauptet, es gehe erst ab Professional? Jein. Früher gab es nur dokumentzentrische Erweiterungsmöglichkeiten (bis VSTO 2.0) und die funktionierten wegen der in der Standard-Version von Office 2003 fehlenden XML-Unterstützung erst ab der Pro-Version.&lt;/p&gt; &lt;p&gt;VSTO 2005 SE brachte aber applikationsweite Add-Ins, und die sind völlig unabhängig von einer XML-Unterstützung. Also kann man ab VSTO 2005 SE auch Add-Ins für Office 2003 Standard schreiben. Bei Office 2007 wurde die Standard-Limitierung beseitigt und es geht sowieso.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTOSupportfrOfficeStandardEdition_9AC8/VSTO%20Office%20Std.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="296" alt="VSTO Office Std" src="http://blogs.msdn.com/blogfiles/jensha/WindowsLiveWriter/VSTOSupportfrOfficeStandardEdition_9AC8/VSTO%20Office%20Std_thumb.png" width="711" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8368353" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category></item><item><title>Neue WebCasts zu VSTO 3.0 (Office Integration mit Visual Studio 2008) verfügbar</title><link>http://blogs.msdn.com/jensha/archive/2008/04/07/neue-webcasts-zu-vsto-3-0-office-integration-mit-visual-studio-2008-verf-gbar.aspx</link><pubDate>Mon, 07 Apr 2008 15:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8365206</guid><dc:creator>jensha</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jensha/comments/8365206.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jensha/commentrss.aspx?PostID=8365206</wfw:commentRss><description>&lt;P&gt;ich habe mir in den letzten Tagen die Zeit genommen, wichtige Features von VSTO im Video zu demonstrieren. Vier Video-Demos sind jetzt auf MSDN freigegeben:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032372950" mce_href="http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032372950"&gt;Visual Studio Tools for Office (Teil 1 von 4) - Outlook Custom Form Regions mit VSTO 3.0&lt;/A&gt;&lt;BR&gt;Dauer: 51 min&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032372951" mce_href="http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032372951"&gt;Visual Studio Tools for Office (Teil 2 von 4) - Office Client UI Extensibility&lt;/A&gt;&lt;BR&gt;Dauer: 50 min&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032372952" mce_href="http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032372952"&gt;Visual Studio Tools for Office (Teil 3 von 4) - Deployment &amp;amp; Security&lt;/A&gt;&lt;BR&gt;Dauer: 54 min&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032372954" mce_href="http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032372954"&gt;Visual Studio Tools for Office (Teil 4 von 4) - VSTO - VBA Interop: VBA mit VSTO verwenden und erweitern&lt;/A&gt;&lt;BR&gt;Dauer: 37 min &lt;/P&gt;
&lt;P&gt;Haben Sie weitere Ideen bzgl. für Video-Tutorials im Themenbereich VSTO? Ich freue mich über eine Rückmeldung. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8365206" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jensha/archive/tags/.NET+Dev+mit+Office/default.aspx">.NET Dev mit Office</category><category domain="http://blogs.msdn.com/jensha/archive/tags/Setup+_2600_amp_3B00_+Deployment/default.aspx">Setup &amp;amp; Deployment</category></item></channel></rss>