Search code examples
c#eventsvisual-studio-2012add-inenvdte

Add-In events are never executed


I used the "Add-In for Visual Studio" wizard to create a new Addin project and now, I'm trying to add some event handlers:

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
    _applicationObject = (DTE2)application;
    _addInInstance = (AddIn)addInInst;

    _applicationObject.Events.BuildEvents.OnBuildBegin += BuildEvents_OnBuildBegin;
    _applicationObject.Events.BuildEvents.OnBuildDone += BuildEvents_OnBuildDone;
    _applicationObject.Events.SelectionEvents.OnChange += SelectionEvents_OnChange;
    _applicationObject.Events.DocumentEvents.DocumentOpened += DocumentEvents_DocumentOpened;
    _applicationObject.Events.DocumentEvents.DocumentSaved += DocumentEvents_DocumentSaved;
}

But whatever I do, my handlers are never executed!

Am I blind? Do I have to do anything else to register these handlers or why doesn't it work?


Solution

  • Seems you're a victim of the Garbage Collector. See: http://www.mztools.com/articles/2005/mz2005012.aspx

     private readonly BuildEvents _buildEvents;
     private readonly SelectionEvents _selectionEvents;
     private readonly DocumentEvents _documentEvents;
     private readonly Events _events;
    
     public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
     {
         _applicationObject = (DTE2)application;
         _addInInstance = (AddIn)addInInst;
         _events = _applicationObject.Events;
    
         _buildEvents = _events.BuildEvents;
         _buildEvents.OnBuildBegin += BuildEvents_OnBuildBegin;
         _buildEvents.OnBuildDone += BuildEvents_OnBuildDone;
    
         _selectionEvents = _events.SelectionEvents;
         _selectionEvents.OnChange += SelectionEvents_OnChange;
    
         _documentEvents = _events.DocumentEvents;
         _documentEvents.DocumentOpened += DocumentEvents_DocumentOpened;
         _documentEvents.DocumentSaved += DocumentEvents_DocumentSaved;
     }