Подтвердить что ты не робот

События надстройки никогда не выполняются

Я использовал мастер "Add-In for Visual Studio" для создания нового проекта Addin, и теперь я пытаюсь добавить некоторые обработчики событий:

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;
}

Но что бы я ни делал, мои обработчики никогда не исполнялись!

Я слепой? Должен ли я делать что-нибудь еще, чтобы зарегистрировать эти обработчики или почему он не работает?

4b9b3361

Ответ 1

Кажется, ты жертва Мусора Мусора. См.: 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;
 }

Ответ 2

Если вы посмотрите на applicationObject в отладчике, вы увидите его COM-объект, но классы xxxEvents не будут (Если вы не можете получить код для разрыва OnConnection, то, возможно, ваш аддон не загружается при отладке, проверьте меню инструментов)

События в COM обрабатываются отдельным COM-интерфейсом (несколько в этом случае) в другом направлении, которое сервер (VS) вызывает для их запуска.

Хотя объекты COM имеют аналогичную типизированную концепцию сборки для сборок CLR, они являются неуправляемым кодом внутри, поэтому не могут содержать корни для управляемых объектов.

Итак, хотя вы можете подключить делегат к COM-событию таким образом, который выглядит точно так же, как родное событие CLR, ваше событие подключается к RCW (оболочка, вызываемая вызовом). Существует ссылка COM с сервера на интерфейс RCW com, но без корня CLR RCW в конечном итоге удаляется, что выгружает COM-интерфейс, после чего вы не будете пропускать какие-либо события.

Я не уверен, но я думаю, что это нормально работает, когда вы потребляете один COM-объект с прямой ассоциацией с его интерфейсами событий, поэтому его возможно из-за того, как структурирован интерфейс COM DTE...

В любом случае, как говорили другие, вам просто нужна какая-либо управляемая ссылка на классы BuildEvents, SelectionEvents и DocumentEvents из объекта приложения, чтобы исправить ее. Несколько экземпляров VS загружают отдельные экземпляры добавления, чтобы вы могли просто добавить список статических рефлексов объектов и установить их в OnConnect.

Подписка на события DTE не работает - события не вызываются

http://msdn.microsoft.com/en-us/library/k639e386.aspx