2010-09-25 2 views
8

В пакете Visual Studio требуется использование переменной EnvDTE.DTE, но она всегда возвращается как null. После чтения многих хаков все говорят, что используют метод OnShellPropertyChange() (IVsShellPropertyEvents), но иногда он просто не срабатывает - как будто мое расширение никогда не заканчивает загрузку.VSIX: Получение объекта DTE

Я использую VS2010 и проверяю как VSSPROPID_Zombie, так и ShellInitialized - нет работы. ? :(

Любые идеи Это код, я использую:

public int OnShellPropertyChange(int propid, object var) { 
      if (propid == -9053 || (int) __VSSPROPID.VSSPROPID_Zombie == propid) { // -9053 = ShellInit 
       try { 
        if ((bool) var == false) { 
         Dte = GetService(typeof (SDTE)) as DTE; 
         Flow.Dte = Dte; 

         var shellService = GetService(typeof (SVsShell)) as IVsShell; 

         if (shellService != null) 
          ErrorHandler.ThrowOnFailure(shellService.UnadviseShellPropertyChanges(_cookie)); 

         _cookie = 0; 
        } 
       } catch { 

       } 
      } 

      return VSConstants.S_OK; 
     } 

EDIT: Под экспериментальной Instance, она прекрасно работает и занимает около 5 секунд, чтобы инициализировать Однако после того, как развертывается как VSIX - это. просто не срабатывает.

ответ

6

Я вижу несколько проблем здесь:

  • Вы действительно должны использовать __VSSPROPID4.VSSPROPID_ShellInitialized (определенный в Microsoft.VisualStudio.Shell.Interop .10.0) вместо -9083 для читаемости
  • Вы должны проверять для ShellInitialized быть установлен в истинной (хотя проверка зомби будет ложным правильно)
  • Имейте в виду, что ShellInitialized изменится на true после ... при запуске VS. Проверка на это - правильный подход, если ваш пакет зарегистрирован для автоматической загрузки при запуске (что может произойти до того, как VS полностью готов к работе). Однако большинство пакетов должно не автозагрузка при запуске, а загрузка по требованию некоторых действий пользователя, требующих вашего кода пакета. Затем вы можете проверить службу DTE в методе Initialize класса пакета.
+0

VSSPROPID4 дал мне некоторые проблемы с двусмысленностью, поэтому я пошел с целым числом на данный момент. Я изменю условие и посмотрю, работает ли он сейчас - спасибо! –

5

Если у вас есть MEF компоненту самый простой способ добраться до DTE объект следующим образом

Сначала добавьте ссылку на Microsoft.VisualStudio.Shell.Immutable.10. Затем добавить Импорт MEF для SVsServiceProvider. объект имеет метод GetService, который может быть запрошена для DTE

[ImportingConstructor] 
public MyComponent(SVsServiceProvider serviceProvider) { 
    _DTE dte = (_DTE)serviceProvider.GetService(typeof(_DTE)); 
} 
+0

не имеют MEF компонент, хотя. Любые идеи относительно того, почему собственность никогда не меняется? Это проект VS VMSDK. –

3

Я знаю, что вы выбрали ответ уже, но вы же указать, что вы не хотели использовать MEF, так что я думал, что я бы разместить альтернативу только для полноты картины ....; р

 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 
using EnvDTE; 
using EnvDTE80; 

namespace DTETesting 
{ 
    class Program 
    { 
     const string ACTIVE_OBJECT = "VisualStudio.DTE.10.0"; 
     static void Main(string[] args) 
     { 
      EnvDTE80.DTE2 MyDte; 
      MyDte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject(ACTIVE_OBJECT); 
      Console.WriteLine("The Edition is "+MyDte.Edition); 
      Console.ReadLine(); 
     } 
    } 
} 
 
+0

Уход. Спасибо :) –

+0

нашел это тоже, http://msdn.microsoft.com/en-us/library/68shb4dw%28v=VS.100%29.aspx – Terrance

+0

Остерегайтесь: если вы используете несколько экземпляров Visual Studio , это даст вам один из них, но не обязательно тот, в котором вы работаете. – RichieHindle

23

Попробуйте следующую команду:

dte = Package.GetGlobalService(typeof(DTE)) as DTE2; 
+2

Это работает для меня, просто добавьте ссылку на Microsoft.VisualStudio.Shell.dll в проекте. –

+0

Это работает и для меня. Я использую код под XAML UI. –

 Смежные вопросы

  • Нет связанных вопросов^_^