Расширение Visual Studio 2010 - события не называются - PullRequest
0 голосов
/ 27 января 2011

Я пытаюсь перехватить несколько событий Visual Studio. К сожалению, я терплю неудачу на первом этапе. Обработчики событий никогда не вызываются.

Итак, мой вопрос, что я делаю не так?

Вот небольшая выдержка из моего кода.

// here are some attributes
[ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)]
public sealed class VSPackage : Package {
  EnvDTE80.DTE2 dte_;
  EnvDTE.DocumentEvents documentEvents_;
  EnvDTE.WindowEvents windowEvents_;

  public VSPackage2Package() {
    Trace.WriteLine("I am get called.");
  }

  protected override void Initialize() {
    Trace.WriteLine("I am get called too.");

    dte_ = (EnvDTE80.DTE2) System.Runtime.InteropServices.Marshal.
      GetActiveObject("VisualStudio.DTE.10.0");

    windowEvents_ = dte_.Events.WindowEvents;
    documentEvents_ = dte_.Events.DocumentEvents;

    windowEvents_.WindowCreated +=
      new EnvDTE._dispWindowEvents_WindowCreatedEventHandler(
        windowEvents_WindowCreated);

    documentEvents_.DocumentOpened +=
      new EnvDTE._dispDocumentEvents_DocumentOpenedEventHandler(
        documentEvents__DocumentOpened);

   Trace.WriteLine("Everything fine until here.");
  }

  void documentEvents__DocumentOpened(EnvDTE.Document document) {
    Trace.WriteLine("Never called");
  }

  void windowEvents_WindowCreated(EnvDTE.Window window) {
    Trace.WriteLine("Never called");
  }
}

Edit:

У меня все работает, глядя на другой пример кода, я понял, что иногда они получают объект DTE по-другому. Изменение

    dte_ = (EnvDTE80.DTE2) System.Runtime.InteropServices.Marshal.
      GetActiveObject("VisualStudio.DTE.10.0");

до

    dte_ = GetService(typeof(EnvDTE.DTE)) as EnvDTE80.DTE2;

и теперь все хорошо.

Ответы [ 2 ]

0 голосов
/ 06 января 2013

Убедитесь, что вы не упаковываете и не распаковываете свой объект DTE.Я обнаружил, что это проблема для меня.

См. Мое решение здесь: http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/eb1e8fd1-32ad-498c-98e9-25ee3da71004

0 голосов
/ 27 января 2011

Должно работать.

Я почти уверен, что если вы сделаете то же самое с аддином, это сработает. Пакеты могут быть иногда болезненными.

Фактически, когда пакет загружен, оболочка (DTE) может быть еще не полностью загружена. Попробуйте зарегистрировать свои события, когда это так.

Для этого используйте событие OnShellPropertyChange и состояние Zombie, чтобы узнать, когда регистрироваться. http://social.msdn.microsoft.com/forums/en-US/vsx/thread/3097a0e1-68e3-47ea-a4ba-8511571b2487/

Прочитайте следующее, я думаю, это ответит на ваш вопрос. Примечание: Метод GetService аналогичен вызову GetGlobalService .

1. ServiceProvider.GlobalProvider

Это новое статическое свойство на Класс ServiceProvider обеспечивает доступ к глобальный поставщик услуг из любого код, если он вызывается из основной поток пользовательского интерфейса. Это свойство тесно связаны с Статический метод Package.GetGlobalService который был доступен в предыдущем версии MPF. Проблема с Package.GetGlobalService был, что это потерпит неудачу, если пакет еще не был инициализирован. Это привело к тонкому упорядочение ошибок в коде, который использовал Библиотеки MPF без инициализации пакет свой. Иногда они будет работать только потому, что другой пакет уже инициализировал глобальный сервис провайдер на своих от имени. Если этот другой пакет был удален или, возможно, перемещен в другая версия MPF, что static больше не будет инициализироваться вызывая Package.GetGlobalService для потерпеть неудачу.

Теперь в MPF 10 вы можете позвонить СервисПровидр.ГлобалПровидер на любом время, пока вы звоните из поток пользовательского интерфейса. Для совместимости это механизм по-прежнему будет использовать ServiceProvider создан первым Пакет будет размещен, но, в случае где еще не было пакета инициализировано, MPF 10.0 теперь имеет возможность получить глобального провайдера из зарегистрированного сообщения COM фильтр. Package.GetGlobalService () является также подключен к этому новому механизму.

...