<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.summsoft.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Melody&amp;#39;s VSTA Blog</title><subtitle type="html">Get the latest and greatest information on VSTA here!  Find new samples, workarounds, and inside tips in our downloads and blogs.  Get your questions answered quickly in our forums or search our site for a FAQ.  We&amp;#39;re here to help- just ask.</subtitle><id>http://www.summsoft.com/blogs/melodys_vsta_blog/atom.aspx</id><link rel="alternate" type="text/html" href="http://www.summsoft.com/blogs/melodys_vsta_blog/default.aspx" /><link rel="self" type="application/atom+xml" href="http://www.summsoft.com/blogs/melodys_vsta_blog/atom.aspx" /><generator uri="http://communityserver.org" version="4.0.30619.63">Community Server</generator><updated>2009-04-06T14:30:00Z</updated><entry><title>Add-in Management Options</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2010/08/24/add-in-management-options.aspx" /><id>/blogs/melodys_vsta_blog/archive/2010/08/24/add-in-management-options.aspx</id><published>2010-08-24T18:50:00Z</published><updated>2010-08-24T18:50:00Z</updated><content type="html">&lt;p&gt;&lt;span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;There are many different ways to manage add-ins.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Below are some common add-in management styles which can be used alone, combined, or used side by side.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;span style="font-size:small;"&gt;1)&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;Basic:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;all interactions between the host and add-ins are executed in the Startup and Shutdown methods of the add-in.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This is demonstrated in the ShapeAppBasicCSharp SDK sample.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pros:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Easy.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Cons:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Not very flexible.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Repeatedly loading and unloading add-in can cause increase in memory usage.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;span style="font-size:small;"&gt;2)&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;On Demand:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;interactions between the host and add-ins occur when the host calls into methods in the add-ins.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Pros:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Code executed only when needed.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Cons:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Requires more management code and invoke calls to execute a method in the add-in are time consuming. &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;Repeatedly loading and unloading add-in can cause increase in memory usage.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;span style="font-size:small;"&gt;3)&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;Macro:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;a single add-in project is loaded and displayed in the DTE and methods may be created during execution of the host either by the end user adding code or through macro recording with the host.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Host then calls into &amp;ldquo;macro&amp;rdquo; methods within the add-in project to be run or debugged into.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Pros:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Can create, debug, and run code on the fly.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Allows for macro recording and offers a VBA like experience.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Cons:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Requires more management code, a design time integration, and macro recording code.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Invoke calls to execute a method in the add-in are time consuming. &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;Repeatedly loading and unloading add-in can cause increase in memory usage.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;span style="font-size:small;"&gt;4)&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;Event Oriented:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;add-ins hook into host events and execute code when a host event is fired.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Pros:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Easy.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Responding to events in the host is less time consuming than invoke calls.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Cons:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Must unhook all events prior to unloading the add-in.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;Repeatedly loading and unloading add-in can cause increase in memory usage.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;span style="font-size:small;"&gt;5)&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;Service Oriented:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;add-ins register services with a host which can be used by other add-ins.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This is based off a &lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/b/sandeep_bhatia/archive/2008/12/06/exposing-a-service-through-an-add-in.aspx"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;font-size:small;"&gt;blog by Sandeep Bhatia&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Pros:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Very flexible.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Cons:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Requires some management code and shifts some of the complexity from the host to the add-ins and separate assemblies.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;span style="font-size:small;"&gt;6)&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;Super Add-in:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;a single add-in contains multiple units of functionality (where each unit could be isolated in an individual add-in).&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;The host makes calls into the add-in to hookup or unhook individual units of functionality.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Pros:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;No increase in memory usage due to repeatedly loading and unloading add-ins because only one add-in is loaded.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Cons:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Requires more management code and invoke calls are time consuming.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;With any of the above styles the add-ins can be loaded and unloaded different ways:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;span style="font-size:small;"&gt;1)&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;Host Centric:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;The add-ins are loaded at the beginning of host application execution and are unloaded when the host terminates.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This is demonstrated in the ShapeAppBasicCSharp SDK sample.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;span style="font-size:small;"&gt;2)&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;Document Centric:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;The add-ins are loaded when a specific document is opened, and unloaded when the document closes.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This is demonstrated in the ShapeAppDynamicProgrammingModelCSharp SDK sample.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Note that non-DPM add-ins can also be used in document centric ways as was shown in the VSTA v 1 SDK samples with the drawing &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;entry point.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;span style="font-size:small;"&gt;3)&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;On Demand:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Add-ins are loaded and unloaded during execution of the host application as needed or requested by the user.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This is demonstrated in the ShapeAppMacroRecordingCSharp SDK sample when the macro add-in is unloaded and reloaded during the macro project build cycle.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This can be host or document oriented.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;Any of the above styles of add-in management may also be used with different styles of integration:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;span style="font-size:small;"&gt;1)&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;SDK:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;A proxy is used and the VSTA pipeline is used for interactions between the add-ins and host.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;This style of integration is used in all SDK samples&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;span style="font-size:small;"&gt;2)&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;NoRuntime:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;No proxy is used, instead the add-ins reference the host directly and the VSTA runtime is not referenced or used.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This style of integration is used in the Microsoft ShapeAppMacroRecordingCSharp-NoRuntime sample available from Summit upon request (must fill out &lt;/span&gt;&lt;/span&gt;&lt;a href="http://www2.summsoft.com/VSTAInfReq.asp"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;font-size:small;"&gt;information form&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="mso-bidi-font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;span style="font-size:small;"&gt;3)&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;NoRuntimeProxyShim:&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;A proxy shim, which defines only the entry point types, is used along with a direct reference to the host.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;The VSTA runtime is referenced, but not used.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This style of integration is used in the ShapeAppMacroRecordingCSharp-NoRuntime-ProxyShim sample which is available from Summit upon request (must fill out &lt;/span&gt;&lt;/span&gt;&lt;a href="http://www2.summsoft.com/VSTAInfReq.asp"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;font-size:small;"&gt;information form&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:arial,helvetica,sans-serif;font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:arial,helvetica,sans-serif;font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=2241" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author><category term="vsta" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/vsta/default.aspx" /><category term="add-in" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/add-in/default.aspx" /><category term="Proxy" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/Proxy/default.aspx" /><category term="ShapeAppCSharp" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/ShapeAppCSharp/default.aspx" /></entry><entry><title>Binding Redirects</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2010/07/27/binding-redirects.aspx" /><id>/blogs/melodys_vsta_blog/archive/2010/07/27/binding-redirects.aspx</id><published>2010-07-27T15:21:00Z</published><updated>2010-07-27T15:21:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size:small;"&gt;As mentioned in Gary&amp;#39;s blog &lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;a href="http://www.summsoft.com/blogs/garyvsta/archive/2007/02/08/dependent-assembly-binding-redirect-by-version.aspx" title="Summit Blog"&gt;Dependent Assembly Binding Redirect (by version)&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;, it is possible to use a configuration file to change which version of an assembly to use.&amp;nbsp; This can be very helpful in &amp;quot;tight versioning&amp;quot; scenarios (see blog &lt;/span&gt;&lt;a href="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/2008/08/15/Proxy-Versioning-Options-for-Project-Templates.aspx" title="Summit Blog"&gt;&lt;span style="font-size:small;"&gt;Proxy Versioning Options for Project Templates&lt;/span&gt; &lt;/a&gt;&lt;span style="font-size:small;"&gt;) where a specific version of a proxy is used.&amp;nbsp; Here are some considerations for this:&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;In order to use a binding redirect the reference must have the SpecificVersion property set to True.&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;color:#a31515;"&gt;Reference&lt;/span&gt; &lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;color:#ff0000;"&gt;Include&lt;/span&gt; &lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;"&gt;=&lt;/span&gt; &lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;ShapeAppCSharpProxy, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b2943f7cfe902115, processorArchitecture=MSIL&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;color:#a31515;"&gt;SpecificVersion&lt;/span&gt; &lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;True&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SpecificVersion&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &amp;gt; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt; &lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;color:#a31515;"&gt;Reference&lt;/span&gt; &lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;
&lt;span style="font-size:small;"&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;Generally the binding redirect can be specified in the application level configuration file AppName.exe.config (see &lt;/span&gt;&lt;a href="http://www.summsoft.com/blogs/garyvsta/archive/2007/02/08/dependent-assembly-binding-redirect-by-version.aspx" title="Summit Blog"&gt;&lt;span style="font-size:small;"&gt;Gary&amp;#39;s blog&lt;/span&gt; &lt;/a&gt;&lt;span style="font-size:small;"&gt;); however, there is a known bug with this for VSTA v 1 add-ins after Visual Studio 2008 SP1 is installed.&amp;nbsp; The workaround is to specify the binding redirect in the machine level configuration file Machine.config.&amp;nbsp; This file can be updated through the Microsoft .NET Framework 2.0 Configuration utility or programmatically with admin privileges- see code below.&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; EnsureMachineConfig() &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//open the config file &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Configuration&lt;/span&gt; MachineConfig = &lt;span style="color:#2b91af;"&gt;ConfigurationManager&lt;/span&gt;.OpenMachineConfiguration(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//Ge thte runtime section &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ConfigurationSection&lt;/span&gt; runtimeSection = MachineConfig.Sections[&lt;span style="color:#a31515;"&gt;&amp;quot;runtime&amp;quot;&lt;/span&gt;]; &lt;span style="color:#008000;"&gt;//case sensitive &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; content = runtimeSection.SectionInformation.GetRawXml(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//check if the proxy is already being re-directed &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!content.Contains(&lt;span style="color:#a31515;"&gt;&amp;quot;ShapeAppCSharpProxy&amp;quot;&lt;/span&gt;)) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//add the entry &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;content = content.Replace( &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;/assemblyBinding&amp;gt;&amp;quot;&lt;/span&gt;, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;dependentAssembly&amp;gt;&amp;quot;&lt;/span&gt; + &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;assemblyIdentity name=\&amp;quot;ShapeAppCSharpProxy\&amp;quot; culture=\&amp;quot;Neutral\&amp;quot; publicKeyToken=\&amp;quot;b2943f7cfe902115\&amp;quot;/&amp;gt;&amp;quot;&lt;/span&gt; + &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;bindingRedirect oldVersion=\&amp;quot;1.0.0.0\&amp;quot; newVersion=\&amp;quot;2.0.0.0\&amp;quot;/&amp;gt;&amp;quot;&lt;/span&gt;+ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;/dependentAssembly&amp;gt;&amp;quot;&lt;/span&gt;+ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;/assemblyBinding&amp;gt;&amp;quot;&lt;/span&gt;); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//save the changes &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;runtimeSection.SectionInformation.SetRawXml(content); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;MachineConfig.Save(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;"&gt;}&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;For VSTA v 2 Visual Basic add-ins only one version of a proxy can be registered on a machine at any time due to the unique name requirment(see blog &lt;/span&gt;&lt;a href="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/2009/01/26/Proxy-Assembly-Registration_2D00_-Unique-Name-Required.aspx" title="Summit Blog"&gt;&lt;span style="font-size:small;"&gt;Proxy Assembly Registration- Unique Name Required&lt;/span&gt; &lt;/a&gt;&lt;span style="font-size:small;"&gt;).&amp;nbsp; For C# add-ins multiple versions of the same proxy can coexist.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;span style="font-size:small;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size:small;"&gt;Related Forum Post:&amp;nbsp; &lt;/span&gt;&lt;a href="http://www.summsoft.com/forums/t/903.aspx" title="Summit Forum Post"&gt;&lt;span style="font-size:small;"&gt;Dependent Assembly Binding Redirect (by version)&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=2222" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author><category term="vsta" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/vsta/default.aspx" /><category term="Proxy" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/Proxy/default.aspx" /><category term="Binding Redirect" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/Binding+Redirect/default.aspx" /></entry><entry><title>Alternatives to Invoking to Run a Method in an Add-in</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2010/05/14/alternatives-to-invoking-to-run-a-method-in-an-add-in.aspx" /><id>/blogs/melodys_vsta_blog/archive/2010/05/14/alternatives-to-invoking-to-run-a-method-in-an-add-in.aspx</id><published>2010-05-14T14:49:00Z</published><updated>2010-05-14T14:49:00Z</updated><content type="html">&lt;p class="MsoNormal" style="margin:0in 0in 0pt;"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;font-size:small;"&gt;In scenarios where a method or macro within an add-in needs to be run several times in a short time span, for example 60 times a second, invoking the method may not be the best option.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;The invoke call, as seen in the ShapeAppMacroRecordingCSharp sample, is too slow to for the level of performance required in these high stress scenarios.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;A good alternative to this is firing an event in the host and catching it in the add-in.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Particularly in NoRuntime style integrations this approach achieves higher performance.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Another workaround is to call into the add-in once and pass the number of times to run the method as a parameter.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;While this will take some coding overhead in the add-in it does achieve very high performance and is ideal for high stress scenarios where the number of times a method needs to be run is known.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Don&amp;rsquo;t limit the performance of your host by sticking to the SDK samples.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;"&gt;&lt;span style="font-family:Calibri;font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=2141" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author></entry><entry><title>NoRuntime ProxyShim Style Integration</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2010/05/07/noruntime-proxyshim-style-integration.aspx" /><id>/blogs/melodys_vsta_blog/archive/2010/05/07/noruntime-proxyshim-style-integration.aspx</id><published>2010-05-07T17:52:00Z</published><updated>2010-05-07T17:52:00Z</updated><content type="html">&lt;p class="MsoNormalCxSpFirst"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;The ShapeAppCSharpMacroRecordingCSharp-NoRuntime sample (not included in SDK, please contact &lt;/span&gt;&lt;a href="mailto:info@summsoft.com"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;info@summsoft.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;for more information) has many benefits over the normal SDK style integration.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;These benefits include less memory usage (up to a factor of 10), faster load/unload and processing time for add-ins, as well as a simpler integration experience.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Coupled with a &amp;ldquo;proxy shim&amp;rdquo; which defines only entry point types, this style of integration offers add-ins the same direct access to the host object model as the SDK style integration.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Summit has developed tools to upgrade traditional VSTA v 1 and convert VSTA v 2 SDK integration style add-ins to NoRuntime ProxyShim style integration add-ins without changing any core or user visible add-in code.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormalCxSpMiddle"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;font-size:small;"&gt;If you are interested in more information on the NoRuntime sample or the Summit tools to upgrade from VSTA v 1 or convert from VSTA v2 add-ins to this style of integration please contact us at &lt;/span&gt;&lt;a href="mailto:info@summsoft.com"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;font-size:small;"&gt;info@summsoft.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial,helvetica,sans-serif;font-size:small;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=2126" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author><category term="Proxy" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/Proxy/default.aspx" /><category term="VSTA 1" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/VSTA+1/default.aspx" /><category term="VSTA 2" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/VSTA+2/default.aspx" /><category term="UpgradeHelper" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/UpgradeHelper/default.aspx" /><category term="NoRuntime" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/NoRuntime/default.aspx" /></entry><entry><title>Communicating with a COM host through a VstaIntegration library</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2010/04/22/communicating-with-a-com-host-through-a-vstaintegration-library.aspx" /><id>/blogs/melodys_vsta_blog/archive/2010/04/22/communicating-with-a-com-host-through-a-vstaintegration-library.aspx</id><published>2010-04-22T13:47:00Z</published><updated>2010-04-22T13:47:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size:small;"&gt;
&lt;p&gt;When using a VstaIntegration library with some COM hosts, such as the &lt;a href="http://www.summsoft.com/media/p/1721.aspx" title="Summit Sample"&gt;MyAppVB6 sample&lt;/a&gt;, there are two ways to communicate:&amp;nbsp; &lt;br /&gt;1)&amp;nbsp; Through public methods and properties.&amp;nbsp; &lt;br /&gt;2)&amp;nbsp; Through public events.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Some instances where raising a public event from the VstaIntegration library and catching it in the COM host is appropriate include the IExternalDebugHost methods in the VstaRuntimeIntegration class:&amp;nbsp; OnBeforeDebugStarting, OnDebugStart, and OnDebugStop methods.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In the typical .Net integration it is easy to simply add code to these methods (which are called by the VSTA design time during debugging events) to allow the host to do any necessary actions.&amp;nbsp; However, for some integrations where the host application is unknown to the VstaIntegration library, raising an event to alert the host is the way to go.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The code below demonstrates this with the OnDebugStop method.&amp;nbsp; &lt;br /&gt;The basic steps to do this are:&lt;/p&gt;
&lt;p&gt;1) In the VstaIntegration library the VstaDesignTimeIntegarion class exposes a public event OnDebugStopping.&lt;br /&gt;2) The host application monitors this event. In this case the host is a VB6 host so it also declares the variable for this class as &amp;quot;with events&amp;quot; and hooks into the event by using the naming convention (variableName_eventName) for the method to react to the event.&lt;br /&gt;3) The event is raised in the VstaIntegaration code.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;#39;1)&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;expose a public event&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;mso-no-proof:yes;"&gt;Public&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:#0000ff;"&gt;Event&lt;/span&gt; OnDebugStoppingEvent()&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;&amp;lt;summary&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;#39;&amp;#39;&amp;#39; Called when debugging is stoped.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;&amp;lt;/summary&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;mso-no-proof:yes;"&gt;Public&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; OnDebugStopping() &lt;span style="color:#0000ff;"&gt;Implements&lt;/span&gt; Microsoft.VisualStudio.Tools.Applications.DesignTime.IExternalDebugHost.OnDebugStopping&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;If&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;Not&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Me&lt;/span&gt;.mIsDebugging &lt;span style="color:#0000ff;"&gt;Or&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Me&lt;/span&gt;.mIsShuttingDown) &lt;span style="color:#0000ff;"&gt;Then&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Return&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;#39;3)&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;raise the OnDebugStoppingEvent&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;RaiseEvent&lt;/span&gt; OnDebugStoppingEvent()&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Me&lt;/span&gt;.UnloadCurrentMacroAddin()&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;#39; Do not reload the macro if a new macro is being recorded.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;If&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Me&lt;/span&gt;.mReloadInProc &lt;span style="color:#0000ff;"&gt;Then&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Me&lt;/span&gt;.LoadMacros(&lt;span style="color:#0000ff;"&gt;Nothing&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;If&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Me&lt;/span&gt;.mReloadInProc = &lt;span style="color:#0000ff;"&gt;True&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Me&lt;/span&gt;.mIsDebugging = &lt;span style="color:#0000ff;"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;mso-no-proof:yes;"&gt;End&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Calibri;font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;#39;2 for VB6) declare with events to catch debugger stopping events&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;"&gt;Public&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:#0000ff;"&gt;WithEvents&lt;/span&gt; IdeIntegration &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt; VSTA2_Integration.VSTADesignTimeIntegration&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Calibri;font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;#39;2) monitor and catch the event by using the naming convention variableName_EventName for the method name.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;"&gt;Sub&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; IdeIntegration_&lt;span style="mso-no-proof:yes;"&gt;OnDebugStoppingEvent&lt;/span&gt; ()&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox(&lt;span style="color:#a31515;"&gt;&amp;quot;do clean up here&amp;quot;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;"&gt;End&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=2111" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author></entry><entry><title>How To Stop a Macro Method During Execution</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2010/03/25/how-to-stop-a-macro-method-during-execution.aspx" /><id>/blogs/melodys_vsta_blog/archive/2010/03/25/how-to-stop-a-macro-method-during-execution.aspx</id><published>2010-03-25T19:51:00Z</published><updated>2010-03-25T19:51:00Z</updated><content type="html">&lt;p class="MsoNormalCxSpFirst"&gt;
&lt;p class="MsoNormalCxSpMiddle"&gt;&lt;span style="font-family:Times New Roman;font-size:small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;In order to stop a &amp;ldquo;macro&amp;rdquo; method during execution the macro method must be invoked on a separate thread.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This is because macro methods invoked on the same thread as the host will block the host.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;In the ShapeAppCSharp SDK samples macro methods are called on a separate thread if the VSTA IDE is in the debugging state.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;It is necessary to change all macro method invocations to a separate thread in order to stop them .&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormalCxSpMiddle"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;font-size:small;"&gt;Once all macro methods are invoked in separate threads, the easiest way to interrupt the execution of the macro method is to load and unload the macro assembly.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;To do this, you must catch the AppDomainUnloaded exception in the ExecuteMacroInternal method.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormalCxSpMiddle"&gt;&lt;span style="font-family:Times New Roman;font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt; Execute the first public instance method with name&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;&amp;lt;paramref name=&amp;quot;macroName&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt; which takes no parameters.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;&amp;lt;param name=&amp;quot;macroName&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt;Name of the macro to execute.&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;mso-no-proof:yes;"&gt;internal&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ExecuteMacro(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; macroName)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//SDK warning- no issues adding shapes, but maybe other UI issues?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;// If the macro calls host API that interacts with host UI, the call needs to happen on the main UI thread.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;// However, during out-of-process debugging, if we execute macro on the main UI thread, the main UI thread may be blocked&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;// and cannot process any reentrant method calls.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;// Here we spawn a separate thread so that the main UI thread can service other reentrant method calls. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//all macros called on new thread in order not to block the host during execution, so that macros can be stopped.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt; t = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;(() =&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ExecuteMacroInternal(macroName);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;t.SetApartmentState(&lt;span style="color:#2b91af;"&gt;Thread&lt;/span&gt;.CurrentThread.GetApartmentState());&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;t.Start();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;// Do not call t.Join(); Otherwise it&amp;#39;ll block and the host will be frozen.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt; Execute the first public instance method with name&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;&amp;lt;paramref name=&amp;quot;macroName&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt; which takes no parameters.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;&amp;lt;param name=&amp;quot;macroName&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#008000;mso-no-proof:yes;"&gt;Name of the macro to execute.&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#808080;mso-no-proof:yes;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;mso-no-proof:yes;"&gt;internal&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ExecuteMacroInternal(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; macroName)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;// If no Macros loaded&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.application.VstaRuntimeIntegration.MacroAddIn == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IExtendedEntryPoint&lt;/span&gt; entryPoint = &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.application.VstaRuntimeIntegration.MacroAddIn &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IExtendedEntryPoint&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Diagnostics.&lt;span style="color:#2b91af;"&gt;Debug&lt;/span&gt;.Assert(entryPoint != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (entryPoint == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; obj = entryPoint.GetEntryPointObject();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; t = obj.GetType();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;t.InvokeMember(macroName, &lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.Public | &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.Instance | &lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.InvokeMethod, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, obj, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (System.Runtime.Remoting.&lt;span style="color:#2b91af;"&gt;RemotingException&lt;/span&gt; ex)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;// Swallow remoting exception.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Diagnostics.&lt;span style="color:#2b91af;"&gt;Debug&lt;/span&gt;.WriteLine(ex.ToString());&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;AppDomainUnloadedException&lt;/span&gt; macroStopUnloadEx)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;// Swallow remoting exception.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Diagnostics.&lt;span style="color:#2b91af;"&gt;Debug&lt;/span&gt;.WriteLine(macroStopUnloadEx.ToString());&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt; e)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Windows.Forms.&lt;span style="color:#2b91af;"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color:#a31515;"&gt;&amp;quot;Error executing macro\n&amp;quot;&lt;/span&gt; + e.Message, &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;ShapeAppCSharp&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;MessageBoxButtons&lt;/span&gt;.OK, &lt;span style="color:#2b91af;"&gt;MessageBoxIcon&lt;/span&gt;.Error);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;// Didn&amp;#39;t find a method to invoke, so show a message box.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Windows.Forms.&lt;span style="color:#2b91af;"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color:#a31515;"&gt;&amp;quot;Unable to execute macro: &amp;quot;&lt;/span&gt; + macroName, &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;ShapeAppCSharp&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;MessageBoxButtons&lt;/span&gt;.OK, &lt;span style="color:#2b91af;"&gt;MessageBoxIcon&lt;/span&gt;.Error);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;mso-no-proof:yes;"&gt;internal&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; StopMacro_UnloadLoad()&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//IF the macro project is debugging, stop the debugger to force unload/load&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.application.VstaDesignTimeIntegration.isDebugging)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.application.VstaDesignTimeIntegration.StopDebugging(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt; &lt;span style="color:#008000;"&gt;//not debugging- unload and reload the add-in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.application.VstaRuntimeIntegration.UnloadCurrentMacroAddin(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.application.VstaRuntimeIntegration.LoadMacrosInProcess();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormalCxSpMiddle"&gt;&lt;span style="font-family:Times New Roman;font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=2086" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author></entry><entry><title>How to Determine if a Project isDirty</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2010/03/19/how-to-determine-if-a-project-isdirty.aspx" /><id>/blogs/melodys_vsta_blog/archive/2010/03/19/how-to-determine-if-a-project-isdirty.aspx</id><published>2010-03-19T17:04:00Z</published><updated>2010-03-19T17:04:00Z</updated><content type="html">&lt;p class="MsoNormalCxSpFirst"&gt;&lt;span style="font-size:small;font-family:Times New Roman;"&gt;As previously noted the isDirty property of a project is for &amp;ldquo;Microsoft Internal Use Only&amp;rdquo; and does not actually return valid information.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Instead you can determine this by querying for unsaved ProjectItems. &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;The property MacroProjectSaved below demonstrates how to do this.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Additional code is included to show how to ask a user if they would like to save the macro project when they exit the IDE if the project has unsaved items (some of this code is repeated from previous blogs).&lt;/span&gt;&lt;span style="font-size:small;font-family:Times New Roman;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;"&gt;&lt;span style="font-size:x-small;"&gt;//determines if there are unsaved project items in the macro project&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;private&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; MacroProjectSaved&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;get&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:blue;"&gt;this&lt;/span&gt;.macroProject.Saved)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt; unsavedProjItemCount = &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(&lt;span style="color:blue;"&gt;from&lt;/span&gt; EnvDTE.&lt;span style="color:#2b91af;"&gt;ProjectItem&lt;/span&gt; projItem &lt;span style="color:blue;"&gt;in&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.macroProject.ProjectItems&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; !projItem.Saved&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; projItem).Count();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; unsavedProjItemCount == 0;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;private&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; EnsureIDE()&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;//save this variable in the class scope to prevent unwanted garbage collection&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;//get and subscribe to the File.Exit event prior to execution&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;EnvDTE.&lt;span style="color:#2b91af;"&gt;CommandEvents&lt;/span&gt; exitCommand = &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;dte.Events.get_CommandEvents&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;{5EFC7975-14BC-11CF-9B2B-00AA00573819}&amp;quot;&lt;/span&gt;, 229);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;exitCommand.BeforeExecute += &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;new&lt;/span&gt; EnvDTE.&lt;span style="color:#2b91af;"&gt;_dispCommandEvents_BeforeExecuteEventHandler&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(exitCommand_BeforeExecute);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;"&gt;&lt;span style="font-size:x-small;"&gt;//checks if the user would like to save the project before exiting if the project is dirty&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;void&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; exitCommand_BeforeExecute(&lt;span style="color:blue;"&gt;string&lt;/span&gt; Guid, &lt;span style="color:blue;"&gt;int&lt;/span&gt; ID, &lt;span style="color:blue;"&gt;object&lt;/span&gt; CustomIn, &lt;span style="color:blue;"&gt;object&lt;/span&gt; CustomOut, &lt;span style="color:blue;"&gt;ref&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; CancelDefault)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;//Project.IsDirty is always false, so use the below property MacroProjectSaved&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (!&lt;span style="color:blue;"&gt;this&lt;/span&gt;.MacroProjectSaved)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;//prompt the user to save the project&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;EnvDTE.&lt;span style="color:#2b91af;"&gt;vsPromptResult&lt;/span&gt; promptResult = &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.dte.ItemOperations.PromptToSave;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (promptResult == EnvDTE.&lt;span style="color:#2b91af;"&gt;vsPromptResult&lt;/span&gt;.vsPromptResultYes)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.MacroProject.Save(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.macroProject.FileName);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0in 0in 0pt;mso-layout-grid-align:none;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="font-size:x-small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=2076" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author><category term="vsta" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/vsta/default.aspx" /><category term="Project" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/Project/default.aspx" /><category term="isDirty" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/isDirty/default.aspx" /></entry><entry><title>How to: Prompt the User to Save Unsaved Files</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2009/06/19/how-to-prompt-the-user-to-save-unsaved-files.aspx" /><id>/blogs/melodys_vsta_blog/archive/2009/06/19/how-to-prompt-the-user-to-save-unsaved-files.aspx</id><published>2009-06-19T15:14:00Z</published><updated>2009-06-19T15:14:00Z</updated><content type="html">&lt;p class="MsoNormalCxSpFirst"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;A useful function the DTE has a built in is to prompt the user to save any unsaved files.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;It is a good idea to make this call in when shutting down the DTE, for example in the disconnect method of the VstaDesignTimeIntegration class.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormalCxSpMiddle"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;EnvDTE.&lt;span style="color:#2b91af;"&gt;vsPromptResult&lt;/span&gt; promptResult = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.dte.ItemOperations.PromptToSave;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormalCxSpMiddle"&gt;
&lt;p class="MsoNormalCxSpMiddle"&gt;&lt;span style="font-family:Times New Roman;font-size:small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size:small;"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;Below is a modified VstaDesignTimeIntegration.Disconnect method from the ShapeAppMacroRecordingCSharp SDK sample with this call added.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;The prompt will appear whether or not the DTE is visible&lt;/span&gt;&lt;span style="font-family:Times New Roman;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;font-size:small;mso-no-proof:yes;"&gt;internal&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:small;mso-no-proof:yes;"&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Disconnect()&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#008000;font-size:small;"&gt;//prompt the user to save any unsaved files&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;EnvDTE.&lt;span style="color:#2b91af;"&gt;vsPromptResult&lt;/span&gt; promptResult = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.dte.ItemOperations.PromptToSave;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.isShuttingDown = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;StopDebugging(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#008000;font-size:small;"&gt;// Unload external process&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;font-size:small;"&gt;try&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.macroAddInProcess != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.macroAddInProcess.ShuttingDown -= MacroAddInProcessExiting;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.macroAddInProcess.Shutdown();&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.macroAddInProcess = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt; ex)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#008000;font-size:small;"&gt;//&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Swallow the exception. We don&amp;#39;t want to crash if the process has already been destroyed.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Diagnostics.&lt;span style="color:#2b91af;"&gt;Debug&lt;/span&gt;.WriteLine(ex.ToString());&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.summsoft.com/cfs-file.ashx/__key/CommunityServer.Components.UserFiles/00.00.00.51.26/Prompt.png" alt="" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=1864" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author><category term="vsta" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/vsta/default.aspx" /><category term="Save" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/Save/default.aspx" /></entry><entry><title>Frequent Events and Garbage Collection</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2009/06/17/frequent-events-and-garbage-collection.aspx" /><id>/blogs/melodys_vsta_blog/archive/2009/06/17/frequent-events-and-garbage-collection.aspx</id><published>2009-06-17T14:46:00Z</published><updated>2009-06-17T14:46:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;When an event will be fired many times it is a good practice to do periodic garbage collection.&amp;nbsp; When a VSTA add-in hooks into an event which is fired many times this becomes even more important because the memory usage for the host process will grow very high without periodic garbage collection.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;The charts below demonstrate that when a VSTA add-in is hooked into an event the memory usage grows.&amp;nbsp; This is case even if the VSTA add-in does not perform any actions when the event is fired (see the &amp;quot;Empty VSTA Event Hooked-up&amp;quot; line in Chart 1).&amp;nbsp; If the VSTA add-in does perform actions when the event is fired the memory usage will grow even faster (see the &amp;quot;VSTA Event Hooked-up&amp;quot; line in Chart 1).&amp;nbsp; When GC.Collect is called periodically this increase in memory usage is almost completely negated; notice in Chart 1 the base line &amp;quot;No VSTA Event Hooked-up&amp;quot; is at the same memory usage levels as the lines where garbage collection is called periodically (&amp;quot;VSTA Event Hooked-up &amp;amp; Host call GC every 50 event fires&amp;quot; and &amp;quot;VSTA Event Hooked-up &amp;amp; Host call GC every 500 event fires&amp;quot;).&amp;nbsp; These three lines, the base and lines where periodic garbage collection is done, are displayed again in Chart 2 to show how close the memory usage levels are.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;strong&gt;Chart 1- Memory Usage Levels With and Without Periodic Garbage Collection &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;img src="http://www.summsoft.com/resized-image.ashx/__size/727x270/__key/CommunityServer.Components.UserFiles/00.00.00.51.26/Without-GC.png" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;
&lt;p&gt;&lt;strong&gt;Chart 2- Memory Usage Levels With Periodic Garbage Collection&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;
&lt;p&gt;&lt;img src="http://www.summsoft.com/resized-image.ashx/__size/727x270/__key/CommunityServer.Components.UserFiles/00.00.00.51.26/With-GC.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;This applies to both VSTA v 1 and VSTA v 2.&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=1855" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author><category term="vsta" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/vsta/default.aspx" /><category term="Event" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/Event/default.aspx" /><category term="Memory Usage" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/Memory+Usage/default.aspx" /></entry><entry><title>VSTA Configuration Entries: ItemTemplatesLocation versus VSItemTemplatesLocation</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2009/05/29/vsta-configuration-entries-itemtemplateslocation-versus-vsitemtemplateslocation.aspx" /><id>/blogs/melodys_vsta_blog/archive/2009/05/29/vsta-configuration-entries-itemtemplateslocation-versus-vsitemtemplateslocation.aspx</id><published>2009-05-29T15:55:00Z</published><updated>2009-05-29T15:55:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size:small;"&gt;The ItemTemplatesLocation entry in the VSTA host configuration hive is used to specify the location of item templates which will only be available through the VSTA host they are registered under. This is different than the VSItemTemplatesLocation entry which is used to specify the location of item templates which will be available through Visual Studio 2008 and all VSTA hosts.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;To use the ItemTemplatesLocation entry,&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-size:small;"&gt;1) Delete the context hive for the host. This must be done for the changes to take affect even if the ItemTemplatesLocation entry was not used previously.&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-size:small;"&gt;2) Add the ItemTemplatesLocation entry and value to the configuration hive.&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-size:small;"&gt;3) Run vsta setup for the host. This will extract the item templates to the VSTA item templates cache under C:\Documents and Settings\All Users\Application Data\Microsoft\VSTAHost\&amp;lt;HostID&amp;gt;\9.0\ItemTemplatesCache&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;The item templates stored in the ItemTemplatesLocation will now appear under the root node in the Add New Item Wizard and will not be available for other hosts or Visual Studio projects.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;img src="http://www.summsoft.com/cfs-file.ashx/__key/CommunityServer.Components.UserFiles/00.00.00.51.26/Host-ItemTemplate.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;The VSItemTemplatesLocation entry requires the following steps to function properly:&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-size:small;"&gt;1) Add the VSItemTemplatesLocation entry and value to the configuration hive.&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-size:small;"&gt;2) Run vsta setup for the host. This will move the item templates from the location specified in the VSItemTemplatesLocation to the Visual Studio 2008 item templates folder under a subfolder matching the hosted: %ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplates\Host ID.&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-size:small;"&gt;3) Run devenv setup. Once vsta setup has moved the templates from the VSItemTemplatesLocation to the Visual Studio item templates storage folder you must run devenv setup to extract the item templates to the Visual Studio and VSTA item templates caches.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;The item templates will appear in a category which matches the HostID under the Add New Item wizard.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;img src="http://www.summsoft.com/cfs-file.ashx/__key/CommunityServer.Components.UserFiles/00.00.00.51.26/Host-VSItemTemplate.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;For more information on this, see the on-line documentation on &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc176071.aspx" title="MSDN:  Host Configuration Registry Key Settings"&gt;&lt;span style="font-size:small;"&gt;Host Configuration Registry Key Settings&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="font-size:small;"&gt;ItemTemplatesLocation&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;If you create custom item templates for Visual Studio Tools for Applications projects, use this entry to provide a path to those templates. These items will appear in the Add New Item dialog box of the Visual Studio Tools for Applications IDE. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;When you install Visual Studio Tools for Applications or run vsta.exe using the /setup&amp;nbsp;switch, Visual Studio Tools for Applications does the following: &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size:small;"&gt;Copies the value of ItemTemplatesLocation to the UserFolder entry of the following key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VSTAHost\host ID\9.0\VSTemplate\Item. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size:small;"&gt;Extracts the .zip files from the path that was copied to the UserFolder entry and places the files in %ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplatesCache. &lt;b&gt;CORRECTION: the item template is not extracted to this location, but instead to C:\Documents and Settings\All Users\Application Data\Microsoft\VSTAHost\&amp;lt;HostID&amp;gt;\9.0\ItemTemplatesCache&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="font-size:small;"&gt;VSItemTemplatesLocation&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;If you create custom item templates for Visual Studio 2008 projects, use this entry to provide a path to those templates. These items will appear in the Add New Item dialog box of Visual Studio. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;When you install Visual Studio Tools for Applications or run vsta.exe using the /setup switch, Visual Studio Tools for Applications copies the contents of the directory specified by the VSItemTemplatesLocation entry to %ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplates\Host ID. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;You must then regenerate the Visual Studio 2008 template cache so it includes the new templates. You can accomplish this by running devenv.exe using the /setup switch. Devenv.exe is usually located at %ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE, but it can be installed in another location if the user overrides the default location. If you need to regenerate the template cache programmatically, you can locate devenv.exe by reading the InstallDir registry entry at HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0. For more information, see &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/xee0c8y7.aspx" title="MSDN:  Devenv Command Line Switches" id="ctl00_MTContentSelector1_mainContentContainer_ctl31"&gt;&lt;span style="font-size:small;"&gt;Devenv Command Line Switches&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:small;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=1820" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author><category term="vsta" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/vsta/default.aspx" /><category term="ItemTemplatesLocation" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/ItemTemplatesLocation/default.aspx" /><category term="VSItemTemplatesLocation" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/VSItemTemplatesLocation/default.aspx" /></entry><entry><title>The Host Item Node in VSTA Projects</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2009/05/26/the-host-item-node-in-vsta-projects.aspx" /><id>/blogs/melodys_vsta_blog/archive/2009/05/26/the-host-item-node-in-vsta-projects.aspx</id><published>2009-05-26T16:39:00Z</published><updated>2009-05-26T16:39:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;Within a VSTA project there is a&amp;nbsp;Host Item&amp;nbsp;Node.&amp;nbsp; This displays in the Project Explorer as a subfolder within the VSTA project and contains the main code file as well as any DPM files.&amp;nbsp; By default the folder&amp;#39;s name is the HostID and the icon is the open or closed folder icon.&amp;nbsp; These settings can be changed in the project template under the Host node in the ProjectExtensions section.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&lt;img src="http://www.summsoft.com/cfs-file.ashx/__key/CommunityServer.Components.UserFiles/00.00.00.51.26/ProjectFolder-upd.png" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;VSTA host item specific code files are stored here so that they may be accessed through &lt;span style="font-size:small;"&gt;&lt;span style="font-size:10pt;color:#2b91af;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-fareast-font-family:Calibri;mso-ansi-language:EN-US;mso-fareast-language:EN-US;mso-bidi-language:AR-SA;"&gt;IVstaHostAdapter&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;mso-fareast-font-family:Calibri;mso-ansi-language:EN-US;mso-fareast-language:EN-US;mso-bidi-language:AR-SA;"&gt;.ProjectHostItems&lt;/span&gt;.&amp;nbsp; The SDK samples demonstrate this in the Macro Recording and Dynamic Programming Model samples (see code below). &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color:#008000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; This section defines properties that apply to HostItems.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="color:#008000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="color:#008000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Host - Properties of the folder node in the project.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="color:#008000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Name - The display name of the folder node.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="color:#008000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;GeneratedCodeNamespace - Namespace of code files contained in the folder node. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="color:#008000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;Used by the Properties window in Project Explorer. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="color:#008000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;IconIndex - 0-based index in the IconImageList of the icon for this node.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="color:#008000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;OpenFolderIconIndex - 0-based index in the IconImageList of the open folder icon for this node.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#008000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;Host&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="background-color:#ffff99;"&gt;&lt;span style="color:#ff0000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;=&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;ShapeAppCSharp AddIn Folder&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#ff0000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;GeneratedCodeNamespace&lt;/span&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;=&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;$safeprojectname$&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#ff0000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;IconIndex&lt;/span&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;=&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#ff0000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;OpenFolderIconIndex&lt;/span&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;=&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;quot;&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;HostItem&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#ff0000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;=&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;AppAddIn&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#ff0000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;Code&lt;/span&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;=&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;AppAddIn.cs&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#ff0000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;CanonicalName&lt;/span&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;=&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;AppAddIn&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#ff0000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;Blueprint&lt;/span&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;=&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;AppAddIn.Designer.xml&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#ff0000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;GeneratedCode&lt;/span&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;=&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;AppAddIn.designer.cs&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#ff0000;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;IconIndex&lt;/span&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;=&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;quot;&amp;quot;&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;Host&lt;/span&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&lt;strong&gt;Macro Recording Sample:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;internal&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; SaveMacro(System.CodeDom.&lt;span style="color:#2b91af;"&gt;CodeMemberMethod&lt;/span&gt; method)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.macroProject == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!ShowIde(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IVstaHostAdapter&lt;/span&gt; hostAdapter = (&lt;span style="color:#2b91af;"&gt;IVstaHostAdapter&lt;/span&gt;)&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.macroProject.get_Extender(&lt;span style="color:#a31515;"&gt;&amp;quot;VSTAHostAdapter2007&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; hostItemFileName = &lt;b style="mso-bidi-font-weight:normal;"&gt;hostAdapter.ProjectHostItems&lt;/b&gt;[0].CodeFilePath;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; hostItemClassName = &lt;b style="mso-bidi-font-weight:normal;"&gt;hostAdapter.ProjectHostItems&lt;/b&gt;[0].ProgrammingModelHostItem.Identifier;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;EnvDTE.&lt;span style="color:#2b91af;"&gt;ProjectItem&lt;/span&gt; hostItemProjectItem =&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.macroProject.ProjectItems.Item(&lt;span style="color:#2b91af;"&gt;Path&lt;/span&gt;.GetFileName(hostItemFileName));&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;EnvDTE.&lt;span style="color:#2b91af;"&gt;CodeClass&lt;/span&gt; hostItemClass = FindClass(hostItemClassName, hostItemProjectItem.FileCodeModel.CodeElements);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;method.Name = GenerateNewMacroName(hostItemClass);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;hostItemProjectItem.Open(&lt;span style="color:#a31515;"&gt;&amp;quot;{7651A701-06E5-11D1-8EBD-00A0C90F26EA}&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;hostAdapter.ProjectHostItems&lt;/b&gt;[0].AddMethod(method);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;hostItemProjectItem.Save(&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.macroProject.DTE.Solution.SolutionBuild.Build(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&lt;strong&gt;Dynamic Programming Model Sample&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;private&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:#2b91af;"&gt;IVstaProjectHostItem&lt;/span&gt; AddProjectHostItemInternal(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; itemName, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; templateName, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; itemEntryPoint)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;IVstaProjectHostItem&lt;/span&gt; existingItem &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; &lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.hostAdapter.ProjectHostItems&lt;/b&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (existingItem.ProgrammingModelHostItem.Cookie == itemName)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;; &lt;span style="color:#008000;"&gt;// Do not add existing one.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;// Make sure the template is not read-only.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; languageFolder = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; languageExtension = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.language == &lt;span style="color:#2b91af;"&gt;SupportedLanguage&lt;/span&gt;.CSharp)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;languageFolder = &lt;span style="color:#a31515;"&gt;&amp;quot;CSharp&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;languageExtension = &lt;span style="color:#a31515;"&gt;&amp;quot;.cs&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;languageFolder = &lt;span style="color:#a31515;"&gt;&amp;quot;VisualBasic&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;languageExtension = &lt;span style="color:#a31515;"&gt;&amp;quot;.vb&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; templatePath = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.hostItemTemplatesPath + &lt;span style="color:#a31515;"&gt;@&amp;quot;\&amp;quot;&lt;/span&gt; + languageFolder + &lt;span style="color:#a31515;"&gt;@&amp;quot;\&amp;quot;&lt;/span&gt; + templateName + languageExtension;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FileInfo&lt;/span&gt; fileInfo = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FileInfo&lt;/span&gt;(templatePath);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; isReadOnly = fileInfo.IsReadOnly;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;fileInfo.IsReadOnly = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IVstaProjectHostItem&lt;/span&gt; projectHostItem = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;projectHostItem = &lt;b style="mso-bidi-font-weight:normal;"&gt;hostAdapter.ProjectHostItems&lt;/b&gt;.AddProjectHostItem(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;itemName,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Microsoft.VisualStudio.Tools.Applications.Samples.ShapeApp.&amp;quot;&lt;/span&gt; + itemEntryPoint,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Microsoft.VisualStudio.Tools.Applications.Runtime.IEntryPoint&amp;quot;&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;itemName,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.hostItemTemplatesPath + &lt;span style="color:#a31515;"&gt;@&amp;quot;\&amp;quot;&lt;/span&gt; + languageFolder + &lt;span style="color:#a31515;"&gt;@&amp;quot;\&amp;quot;&lt;/span&gt; + templateName);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.project.Save(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.project.FileName);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;fileInfo.IsReadOnly = isReadOnly;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (projectHostItem != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; projectHostItem;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Fail to add project host item.&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:x-small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=1779" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author><category term="vsta" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/vsta/default.aspx" /><category term="addin" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/addin/default.aspx" /></entry><entry><title>Saving DTE and other COM Event Hook-ups</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2009/04/29/saving-dte-and-other-com-event-hook-ups.aspx" /><id>/blogs/melodys_vsta_blog/archive/2009/04/29/saving-dte-and-other-com-event-hook-ups.aspx</id><published>2009-04-29T15:00:00Z</published><updated>2009-04-29T15:00:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;To avoid losing an event hook-up from a COM source it is necessary to hold a local reference to the source of the event to avoid unwanted garbage collection.&amp;nbsp; This is a concern for VSTA hosts hooking into DTE events as well as VSTA add-ins which use a direct reference to a COM host instead of a proxy.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&lt;br /&gt;For example, in the SDK the DTE source events are each saved in a local variable and hooked into from these variables.&amp;nbsp; If you attempt to hook into the events without saving event sources the hook-ups can be lost.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;To test if an event hookup will preset, call GC.Collect in the event sink and re-fire.&amp;nbsp; If the event is hit again the hookup should persist. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;Example of how to hook into DTE events from a host:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;When events sources are saved, event hookups will continue to work after garbage collection.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;private&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; EnvDTE.&lt;span style="color:#2b91af;"&gt;BuildEvents&lt;/span&gt; buildEvents;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;font-family:Times New Roman;"&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;private&lt;/span&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; HookupDteEvents_GOOD()&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;color:#008000;"&gt;// Save a copy of the event sync locations so they don&amp;#39;t get&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;color:#008000;"&gt;// garbage collected.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.buildEvents = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.dte.Events.BuildEvents;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.buildEvents.OnBuildBegin += &lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color:#0000ff;"&gt;new&lt;br /&gt;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;EnvDTE.&lt;span style="color:#2b91af;"&gt;_dispBuildEvents_OnBuildBeginEventHandler&lt;/span&gt;(buildEvents_OnBuildBegin);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;}&lt;br style="mso-special-character:line-break;" /&gt;&lt;br style="mso-special-character:line-break;" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;void&lt;/span&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; buildEvents_OnBuildBegin(EnvDTE.&lt;span style="color:#2b91af;"&gt;vsBuildScope&lt;/span&gt; Scope,&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;EnvDTE.&lt;span style="color:#2b91af;"&gt;vsBuildAction&lt;/span&gt; Action)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//Call GC.Collect to test if the event hookup will persist&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Windows.Forms.&lt;span style="color:#2b91af;"&gt;MessageBox&lt;/span&gt;.Show(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Call GC.Collect after firing event to test hook-up&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;GC&lt;/span&gt;.Collect();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;Example of how &lt;b&gt;NOT&lt;/b&gt; to hook into DTE events from a host:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;When events sources are not saved, event hookups will not continue to work after garbage collection.&lt;/span&gt; &lt;br /&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;private&lt;/span&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; HookupDteEvents_BAD()&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;color:#008000;"&gt;// DON&amp;rsquo;T DO THIS&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;color:#008000;"&gt;// Hook into the event through the dte w/o saving source&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.dte.Events.BuildEvents.OnBuildBegin +=&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color:#0000ff;"&gt;new&lt;br /&gt;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;EnvDTE.&lt;span style="color:#2b91af;"&gt;_dispBuildEvents_OnBuildBeginEventHandler&lt;/span&gt;(buildEvents_OnBuildBegin);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;}&lt;br style="mso-special-character:line-break;" /&gt;&lt;br style="mso-special-character:line-break;" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;void&lt;/span&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; buildEvents_OnBuildBegin(EnvDTE.&lt;span style="color:#2b91af;"&gt;vsBuildScope&lt;/span&gt; Scope,&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;EnvDTE.&lt;span style="color:#2b91af;"&gt;vsBuildAction&lt;/span&gt; Action)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//Call GC.Collect to test if the event hookup will persist&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Windows.Forms.&lt;span style="color:#2b91af;"&gt;MessageBox&lt;/span&gt;.Show(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Call GC.Collect after firing event to test hook-up&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;GC&lt;/span&gt;.Collect();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;Example of how to hook into host events from an add-in using a direct reference to a COM host:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;When events sources are saved, event hookups will continue to work after garbage collection.&amp;nbsp; From &lt;a href="http://www.summsoft.com/media/p/1721.aspx" title="Summit Sample"&gt;MyAppVB6 sample&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;private&lt;/span&gt;&lt;span style="font-size:small;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; AppAddIn_Startup(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Document.KeyPress += &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;__Document_KeyPressEventHandler(Document_KeyPress);&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;doc = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Document;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;doc.KeyPress += &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;__Document_KeyPressEventHandler(doc_KeyPress);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//if the local variable is saved, hooking into this.Document will work&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//this.Document.KeyPress += new&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;__Document_KeyPressEventHandler(Document_KeyPress);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;Document doc;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;void&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; doc_KeyPress(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;short&lt;/span&gt; KeyCode)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Windows.Forms.MessageBox.Show(&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Hooking into this.Document with saving it won&amp;#39;t work&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;GC.Collect();&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;}&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;Example of how &lt;b&gt;NOT&lt;/b&gt; to hook into host events from an add-in using a direct reference to a COM host:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;When events sources are not saved, event hookups will not continue to work after garbage collection. From &lt;a href="http://www.summsoft.com/media/p/1721.aspx" title="Summit Sample"&gt;MyAppVB6 sample&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;private&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; AppAddIn_Startup(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Document.KeyPress += &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;__Document_KeyPressEventHandler(Document_KeyPress);&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color:#0000ff;font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;void&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; Document_KeyPress(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;short&lt;/span&gt; KeyCode)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Windows.Forms.MessageBox.Show(&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Hooking into this.Document w/o saving it won&amp;#39;t work&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;GC.Collect();&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=1741" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author><category term="vsta" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/vsta/default.aspx" /><category term="addin" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/addin/default.aspx" /><category term="Proxy" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/Proxy/default.aspx" /><category term="COM" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/COM/default.aspx" /><category term="EnvDTE" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/EnvDTE/default.aspx" /><category term="DTE" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/DTE/default.aspx" /><category term="COM Event" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/COM+Event/default.aspx" /></entry><entry><title>VSTA v 2 Proxy Names- Unique Names for Proxy Versions</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2009/04/28/VSTA-v-2-Proxy-Names_2D00_-Unique-Names-for-Proxy-Versions.aspx" /><id>/blogs/melodys_vsta_blog/archive/2009/04/28/VSTA-v-2-Proxy-Names_2D00_-Unique-Names-for-Proxy-Versions.aspx</id><published>2009-04-28T15:00:00Z</published><updated>2009-04-28T15:00:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;
&lt;p&gt;For VSTA v 2 Visual Basic add-ins, unique version specific proxy names are required for registration in the VSTA pipeline.&amp;nbsp; Also, each host should use host specific names for all proxies.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;If multiple versions of a proxy will be used by VSTA v 2 Visual Basic add-ins, the different versions of the proxy must each have a unique name.&amp;nbsp; This will avoid a proxy being overwritten in the VSTA pipeline folder by another proxy with the same name but different version number.&amp;nbsp; This is not an issue for C# add-ins because they can resolve the reference to the proxy assembly in the GAC; however, for Visual Basic add-ins this is a requirement.&lt;/p&gt;
&lt;p&gt;All proxies should have a host specific name.&amp;nbsp; This will avoid file naming collisions in the VSTA pipeline with other hosts, which can result in a proxy being overwritten in the pipeline and Visual Basic add-ins being unloadable (VSTA v 2).&amp;nbsp; This will also avoid any ambiguity in the GAC (VSTA v 1 and v 2).&amp;nbsp; For example an add-in could reference a proxy with the same name as another proxy present in the GAC and end up referencing the first instance of a proxy in the GAC with the same name instead of the intended proxy (see the section on loose versioning in the &lt;a href="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/2008/08/15/Proxy-Versioning-Options-for-Project-Templates.aspx" title="Summit Blog:  Proxy Versioning Options"&gt;Proxy Versioning Options for Project Templates blog&lt;/a&gt;). &lt;/p&gt;
&lt;p&gt;Example Proxy Names:&lt;br /&gt;&lt;strong&gt;BAD&lt;/strong&gt;- VSTAProxy &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GOOD&lt;/strong&gt;- HostA_VSTAProxy_v1&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Related blogs:&lt;br /&gt;&lt;a href="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/2008/08/15/Proxy-Versioning-Options-for-Project-Templates.aspx" title="Summit Blog:  Proxy Versioning Options"&gt;Proxy Versioning Options for Project Templates&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/2009/01/26/Proxy-Assembly-Registration_2D00_-Unique-Name-Required.aspx" title="Summit Blog- Proxy Assembly Registration"&gt;Proxy Assembly Registration- Unique Name Required&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc176064.aspx#installingassembly" title="MSDN VSTA v 2:  Creating Proxies"&gt;Creating Proxies- Installing the Proxy Assembly with the Host Application&lt;/a&gt;&lt;/p&gt;
&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;
&lt;p&gt;
&lt;p&gt;VSTA Pipeline location:&lt;br /&gt;C:\Program Files\Common Files\Microsoft Shared\VSTA\Pipeline&lt;/p&gt;
&lt;p&gt;Proxy assemblies are stored in:&lt;br /&gt;C:\Program Files\Common Files\Microsoft Shared\VSTA\Pipeline\AddInViews&lt;/p&gt;
&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=1739" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author></entry><entry><title>VSTA and Packaging</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2009/04/07/vsta-and-packaging.aspx" /><id>/blogs/melodys_vsta_blog/archive/2009/04/07/vsta-and-packaging.aspx</id><published>2009-04-07T17:08:00Z</published><updated>2009-04-07T17:08:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;A new sample and video are available which demonstrate packaging a VSTA add-in within a document using System.IO.Packaging.&amp;nbsp; Packaging is also used by Office 2007 documents including the &amp;quot;docx&amp;quot;, &amp;quot;docm&amp;quot;, &amp;quot;xlsx&amp;quot;, and &amp;quot;xlsm&amp;quot; file types.&amp;nbsp; In this sample, both the add-in source code and compiled assembly are packaged into the single file document which can be transferred (ex:&amp;nbsp; e-mailed) and opened by another user who through the single file will have access to the document, compiled add-in and source code- similar to an Office document with a VBA macro project included.&lt;/span&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;This sample is document-centric, so the add-in is intended only for use with the document it is packaged within.&amp;nbsp; Based on the ShapeAppDynamicProgrammingModelCSharp SDK sample, this sample extends the existing packaging file format of the SDK samples to include the VSTA add-in associated with the document.&amp;nbsp; Benefits of packaging document specific VSTA add-ins within documents include ease of deployment and an intuitive end user experience.&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;Technical&amp;nbsp;stuff:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;The main code changes made to the SDK sample ShapeAppDynamicProgrammingModelCSharp for packaging are in methods involved with saving and opening documents in the document.cs file.&amp;nbsp; The add-in project associated with the document is originally created in the same folder as the document.&amp;nbsp; A copy of the project and add-in are packaged into the document while the originals stay in place.&amp;nbsp; This allows the add-in project to be updated outside of the document, and logic was added to use the original project and add-in if available.&amp;nbsp; If the project or add-in is no longer available then the internal copy is used.&amp;nbsp; The internal copy is updated every time the document is saved.&amp;nbsp; This provides a more dev oriented experience, allowing the add-in project to be modified outside of the document, but may not be optimal for non-dev end users.&amp;nbsp; The add-in project source code and assembly are packaged within the document so the only required file is the single document file.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;The ShapeAppDynamicProgrammingModelCSharp sample was also updated to include seamless non-destructive debugging; a side effect of this is the add-in projects cannot be run directly because they search for a running instance of the host instead of starting a new one.&amp;nbsp; Therefore, to run a DPM packaged project, open the document through the host instead of debugging from a standalone VSTA IDE.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;Note, this is not ClickOnce deployment, for information on ClickOnce deployment please refer to the SDK section &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc175947.aspx"&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;Securing and Deploying Add-Ins&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;Links:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;a href="http://www.summsoft.com/media/p/1725.aspx" title="Summit Sample"&gt;Summit:&amp;nbsp; Link to Sample&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;a href="http://www.summsoft.com/blogs/videos/archive/2009/04/07/vsta-and-packaging.aspx" title="Summit Video"&gt;Summit:&amp;nbsp; Link to Video&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc175731.aspx" title="MSDN VSTA SDK"&gt;MSDN:&amp;nbsp; Add-in Debugging&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc175988.aspx" title="MSDN VSTA SDK"&gt;MSDN:&amp;nbsp; DPM Walkthrough&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.io.packaging.aspx" title="MSDN Library"&gt;MSDN:&amp;nbsp; System.IO.Packaging&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;a href="http://blogs.msdn.com/brian_jones/archive/2005/06/06/425750.aspx" title="MSDN Blog"&gt;MSDN:&amp;nbsp; Office Packaging&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=1724" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author><category term="vsta" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/vsta/default.aspx" /><category term="Packaging" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/Packaging/default.aspx" /><category term="DynamicProgrammingModel" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/DynamicProgrammingModel/default.aspx" /><category term="DPM" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/DPM/default.aspx" /></entry><entry><title>VSTA v 2 in Visual Basic 6.0 sample now available</title><link rel="alternate" type="text/html" href="/blogs/melodys_vsta_blog/archive/2009/04/06/vsta-v-2-in-visual-basic-6-0-sample-now-available.aspx" /><id>/blogs/melodys_vsta_blog/archive/2009/04/06/vsta-v-2-in-visual-basic-6-0-sample-now-available.aspx</id><published>2009-04-06T18:30:00Z</published><updated>2009-04-06T18:30:00Z</updated><content type="html">&lt;p&gt;&lt;span&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;A new &lt;a href="http://www.summsoft.com/media/p/1721.aspx" title="Summit Sample"&gt;VB6 VSTA v 2&lt;/a&gt; sample is available for download.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:Arial;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;Below is from the READ ME.doc included in the sample:&lt;/span&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; There are many ways to integrate VSTA v 2.0 with a VB6 application.&amp;nbsp; This sample demonstrates an advanced integration option (with seamless non-destructive debugging but no macro management) which closely follows the integration code from the SDK samples.&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A COM visible library, VSTA2_Integration, is referenced by the VB6 host application, MyAppVB6.&amp;nbsp; The VSTA2_Integration library exposes the classes VSTARunTimeIntegration and VstaDesignTimeIntegration.&amp;nbsp; The VB6 host first creates and connects to its VSTARunTimeIntegration instance passing in the object to be used as an entry point (see definition below) for add-ins through the VSTARunTimeIntegration.Connect method.&amp;nbsp; Then the VB6 host creates and connects to its VSTADesignTimeIntegration instance passing in the VSTARunTimeIntegration instance through the VSTADesignTimeIntegration.Connect method.&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This host object (passed in through the VSTARunTimeIntegration.Connect method) is stored in the internal VSTA2_Integration.HostItemProvider (see definition below) which is passed into the add-ins through the VSTA pipeline.&amp;nbsp; Once the host object is passed through the pipeline, it is stored in the add-in in a hidden code file and accessed through &amp;ldquo;Me&amp;rdquo; or &amp;ldquo;Me.Application&amp;rdquo; (see section on templates below).&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The VSTARunTimeIntegration.Connect method makes calls to load add-ins and the VSTARunTimeIntegration.Disconnect method makes calls to unload add-ins.&amp;nbsp; The VB6 host calls the VSTARunTimeIntegration.Connect method on form load, and VSTARunTimeIntegration.Disconnect on form unload.&amp;nbsp; This can easily be changed so that add-ins can be loaded and unloaded by selecting a button on the host.&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The DesignTimeIntegration.Connect method takes in and stores the VSTARunTimeIntegration instance and prepares for IDE management.&amp;nbsp; The DesignTimeIntegration.ShowIDE method displays the IDE with a new or existing VSTA project open.&amp;nbsp; The DesignTimeIntegration.Disconnect method disposes of the IDE.&amp;nbsp; The VB6 host calls the DesignTimeIntegration.Connect on form load and the DesignTimeIntegration.Disconnect on form unload.&amp;nbsp; It is not advisable to change this.&amp;nbsp; The ShowIDE method is called through a button on the VB6 host.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This sample does not use a proxy or HostTypeMapProvider, instead a &amp;ldquo;proxy shim&amp;quot; is included in the add-in to provide a MyAppVB6 entry point.&amp;nbsp; This class is defined in the hidden AppAddIn.designer2.xx file included with the project templates.&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;font-family:arial,helvetica,sans-serif;"&gt;&lt;span style="font-family:arial,helvetica,sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Two sets of templates are included with this sample.&amp;nbsp; The &amp;ldquo;MyAppVB6_VSTA2_Template_Robust.zip&amp;rdquo; templates allow the add-in to access the host object through &amp;ldquo;Me&amp;rdquo; or &amp;ldquo;this&amp;rdquo;.&amp;nbsp; The &amp;ldquo;MyAppVB6_VSTA2_Template.zip&amp;rdquo; templates allow the add-in to access the host object through &amp;ldquo;Me.Application&amp;rdquo; or &amp;ldquo;this.Application&amp;rdquo;.&amp;nbsp; For the robust templates, the hidden file AppAddIn.designer2.xx contains code which re-implements/exposes some or all of the entry point type from the VB6 host.&amp;nbsp; The only benefit to this additional code is it allows the host object to be accessed more directly through &amp;ldquo;Me&amp;rdquo; or &amp;ldquo;this&amp;rdquo; instead less directly through &amp;ldquo;Me.Application&amp;rdquo; or &amp;ldquo;this.Application&amp;rdquo;.&amp;nbsp; Which type of template to use is a design decision.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.summsoft.com/aggbug.aspx?PostID=970" width="1" height="1"&gt;</content><author><name>Melody</name><uri>http://www.summsoft.com/members/Melody/default.aspx</uri></author><category term="VSTA v 2" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/VSTA+v+2/default.aspx" /><category term="Visual Basic 6.0" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/Visual+Basic+6.0/default.aspx" /><category term="COM" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/COM/default.aspx" /><category term="VB6" scheme="http://www.summsoft.com/blogs/melodys_vsta_blog/archive/tags/VB6/default.aspx" /></entry></feed>