<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://summsoft.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Melody's VSTA Blog : target application domain has been unloaded</title><link>http://summsoft.com/blogs/melodys_vsta_blog/archive/tags/target+application+domain+has+been+unloaded/default.aspx</link><description>Tags: target application domain has been unloaded</description><dc:language>en</dc:language><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>Events in VSTA Part IV:  Unloading Add-ins that do not Unhook from Events</title><link>http://summsoft.com/blogs/melodys_vsta_blog/archive/2008/05/16/events-in-vsta-part-iv-unloading-add-ins-that-do-not-unhook-from-events.aspx</link><pubDate>Fri, 16 May 2008 17:15:00 GMT</pubDate><guid isPermaLink="false">ff090588-e3d7-4538-8ee9-e75ea04444bb:1117</guid><dc:creator>Melody</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://summsoft.com/blogs/melodys_vsta_blog/rsscomments.aspx?PostID=1117</wfw:commentRss><comments>http://summsoft.com/blogs/melodys_vsta_blog/archive/2008/05/16/events-in-vsta-part-iv-unloading-add-ins-that-do-not-unhook-from-events.aspx#comments</comments><description>

&lt;p class="MsoNormal"&gt;As mentioned in Part III, any events an add-in hooks into
should be unhooked in the add-in, presumably in the Shutdown method.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Unfortunately, if the add-in does not unhook
from an event this can cause problems- namely that the host application will
continue to attempt to reach the add-in code when the event is raised.&lt;/p&gt;

&lt;p class="MsoNormal"&gt;To prevent these problems, the host application should do
two things:&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;1) Shutdown the add-in’s controller &lt;b&gt;and&lt;/b&gt; 2) Use an event helper.&lt;span&gt;&amp;nbsp; &lt;/span&gt;This post will cover shutting down controllers
when unloading add-ins, event helpers will be covered in the next post (when an
add-in hooked into an event is unloaded with its controller shutdown, raising
the event will result in a “The target application domain has been unloaded”
error- the EventHelper solves this).&lt;/p&gt;





















&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;b&gt;C#:&lt;/b&gt;&lt;br&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;internal&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ShutdownAddInsCntlrs()&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;font color="#008000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span&gt;&lt;font color="#008000"&gt;//for each add-in&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt;
(IEntryPoint ep &lt;span style="color:blue;"&gt;in&lt;/span&gt; &lt;span style="color:blue;"&gt;this&lt;/span&gt;.addInList)&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;font color="#008000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span&gt;&lt;font color="#008000"&gt;//shutdown the
add-in&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ep.OnShutdown();&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;font color="#008000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span&gt;&lt;font color="#008000"&gt;//get the contorller
and shut it down&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AddInController aic =
AddInController.GetAddInController(ep);&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;aic.Shutdown();&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;







&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;font color="#008000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span&gt;&lt;font color="#008000"&gt;//clear the list
of add-ins&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.addInList.Clear();&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:'Courier New';color:blue;"&gt;&lt;font color="#008000"&gt;//list of
add-ins&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;private&lt;/span&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:'Courier New';"&gt; List&amp;lt;IEntryPoint&amp;gt; addInList&lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;br&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;b&gt;VB:&lt;/b&gt;&lt;br&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;Friend&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; ShutdownAddInsCntlrs()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;







&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#008000"&gt;'for each add-in&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;For&lt;/span&gt; &lt;span style="color:blue;"&gt;Each&lt;/span&gt; ep &lt;span style="color:blue;"&gt;As&lt;/span&gt;
IEntryPoint &lt;span style="color:blue;"&gt;In&lt;/span&gt; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.addInList&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;







&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#008000"&gt;'shutdown the
add-in&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ep.OnShutdown()&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font color="#008000"&gt;'get the
contorller and shut it down&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AddInController(aic =
AddInController.GetAddInController(ep))&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;aic.Shutdown()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;







&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;Next&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font color="#008000"&gt;'clear the list
of add-ins&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this.addInList.Clear()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;End&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; &lt;span style="color:blue;"&gt;Sub&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;





&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:'Courier New';color:blue;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;font color="#008000"&gt;'list of add-ins&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;Private&lt;/span&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:'Courier New';"&gt; addInList &lt;span style="color:blue;"&gt;As&lt;/span&gt; List(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; IEntryPoint)&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;b&gt;ShapeApp Samples:&lt;/b&gt;&lt;br&gt;The ShapeApp samples included with the SDK do not use the
above method to unload “regular” add-ins (the above method is used for macro
and DPM add-ins).&lt;span&gt;&amp;nbsp; &lt;/span&gt;The ShapeApp host
application only unloads “regular” add-ins when the host is terminating;
therefore, there is no opportunity for an unloaded add-in still hooked into an
event to cause problems because no exposed events are fired after the add-ins
are unloaded.&lt;span&gt;&amp;nbsp; &lt;/span&gt;If a host uses this method,
does unload add-ins and then fires an event that an unloaded add-in is hooked
into, the add-in code hooked into the event will be called and run.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Below is the method used by the ShapeApp
samples- &lt;b&gt;only use this method only if no
exposed events will be fired after the add-ins are unloaded&lt;/b&gt;.&lt;/p&gt;

















&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;b&gt;C#:&lt;/b&gt;&lt;br&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;internal&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ShutdownAddIns()&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;//Shutdown each
add-in&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt;
(IEntryPoint ep &lt;span style="color:blue;"&gt;in&lt;/span&gt; &lt;span style="color:blue;"&gt;this&lt;/span&gt;.addInList)&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ep.OnShutdown();&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;





&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;//Clear the list
of add-ins&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.addInList.Clear();&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;&lt;font color="#008000"&gt;//list of
add-ins&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;private&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;
List&amp;lt;IEntryPoint&amp;gt; addInList;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;





&lt;p class="MsoNormalCxSpMiddle" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;br&gt;&lt;b&gt;VB:&lt;/b&gt;&lt;br&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;Friend&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; ShutdownAddIns()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;











&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#008000"&gt;'Shutdown each
add-in&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;For&lt;/span&gt; &lt;span style="color:blue;"&gt;Each&lt;/span&gt; ep &lt;span style="color:blue;"&gt;As&lt;/span&gt;
IEntryPoint &lt;span style="color:blue;"&gt;In&lt;/span&gt; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.addInList&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ep.OnShutdown()&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;Next&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font color="#008000"&gt;'Clear the add-in
list&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.addInList.Clear()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:'Courier New';color:blue;"&gt;End&lt;/span&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:'Courier New';"&gt; &lt;span style="color:blue;"&gt;Sub&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:'Courier New';color:blue;"&gt;&lt;font color="#008000"&gt;'list of add-ins&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br&gt;Private&lt;/span&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:'Courier New';"&gt; addInList &lt;span style="color:blue;"&gt;As&lt;/span&gt; List(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; IEntryPoint)&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://summsoft.com/aggbug.aspx?PostID=1117" width="1" height="1"&gt;</description><category domain="http://summsoft.com/blogs/melodys_vsta_blog/archive/tags/add-in/default.aspx">add-in</category><category domain="http://summsoft.com/blogs/melodys_vsta_blog/archive/tags/VSTA+v+2/default.aspx">VSTA v 2</category><category domain="http://summsoft.com/blogs/melodys_vsta_blog/archive/tags/unregister/default.aspx">unregister</category><category domain="http://summsoft.com/blogs/melodys_vsta_blog/archive/tags/Event/default.aspx">Event</category><category domain="http://summsoft.com/blogs/melodys_vsta_blog/archive/tags/target+application+domain+has+been+unloaded/default.aspx">target application domain has been unloaded</category><category domain="http://summsoft.com/blogs/melodys_vsta_blog/archive/tags/Controller/default.aspx">Controller</category><category domain="http://summsoft.com/blogs/melodys_vsta_blog/archive/tags/ShapeApp/default.aspx">ShapeApp</category></item></channel></rss>