Поделиться через


Практическое руководство. Получение ссылок на объекты DTE и DTE2

Обновлен: Ноябрь 2007

В сборке EnvDTE объект DTE представляет интегрированную среду разработки Visual Studio и является объектом верхнего уровня в иерархии модели автоматизации. Все приложения автоматизации должны ссылаться на этот объект, чтобы получить доступ к базовой модели автоматизации. Это относится к Visual Studio 2005.

Но дополнение сборки EnvDTE80 обеспечивает замену объекта верхнего уровня — DTE2, который замещает объект DTE. Как объекты, так и программа действуют одинаково, но DTE2 обладает новыми возможностями и включает ряд новых и обновленных объектов и коллекций.

В результате, при создании новых приложений автоматизации надстроек следует создавать ссылки на оба объекта. Новый объект DTE2 предоставляет доступ к новым возможностям, в то время, как объект DTE обеспечивает доступ к остальным основным функциональным возможностям автоматизации. Новые объекты и коллекции в DTE2 следует по возможности использовать вместо объектов и коллекций в DTE.

Следующие процедуры демонстрируют порядок получения ссылки на объект DTE2. (Та же процедура применима и к объекту DTE). Перед добавлением ссылок на объекты необходимо добавить ссылки на соответствующие сборки и библиотеку типов. Дополнительные сведения см. в разделе Практическое руководство. Добавление ссылок на пространства имен EnvDTE, EnvDTE80 и EnvDTE90.

В качестве программного идентификатора (ProgID) необходимо использовать VisualStudio.DTE.8.0. Затем можно привести возвращенный объект к интерфейсу DTE2.

Свойства, методы и события DTE2 при вызове возвращают типы DTE. Например, Solution возвращает объект Solution, а не объект Solution2, как можно предполагать. Именно поэтому при использовании членов DTE2 или других членов типов необходимо выполнить их явное приведение. Это было сделано специально по ряду причин. Первая причина — обеспечить согласованность и избежать путаницы. Сборка EnvDTE80 согласованно возвращает один и тот же интерфейс для всех свойств DTE2. Возврат последней версии интерфейса может создать путаницу. Например, если будущая версия Visual Studio имеет тип DTE3, то некоторые интерфейсы могут вернуть DTE, некоторые — DTE2, а некоторые — DTE3. Более того, могут возникнуть проблемы с COM-взаимодействием, так как интерфейсы "2" в EnvDTE80 являются производными от интерфейсов EnvDTE. Например, Window2 является производным от Window. Если свойство DTE добавить к Window2, то оно скроет свойство Windows и не будет работать правильно с приложениями COM.

68shb4dw.alert_note(ru-ru,VS.90).gifПримечание.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска. Эти процедуры были разработаны с обычными параметрами разработки. Чтобы изменить настройки, в меню Сервис выберите команду Импорт и экспортпараметров. Дополнительные сведения см. в разделе Параметры Visual Studio.

Чтобы установить ссылку на объект DTE2 в Visual Basic

  • Добавьте следующие строки в свой код:

    ' Create a new instance of Visual Studio.
    Dim DTE2 As Object
    DTE2 = Microsoft.VisualBasic.Interaction.CreateObject _
    ("VisualStudio.DTE.8.0")
    

    –или–

    ' Get an instance of the currently running Visual Studio IDE.
    Dim DTE2 as EnvDTE80.DTE2
    DTE2 = System.Runtime.InteropServices.Marshal. _
    GetActiveObject("VisualStudio.DTE2")
    
  • Чтобы создать ссылку на объект интегрированной среды разработки макросов, добавьте следующие строки в свой код:

    ' Get an instance of the currently running Macros IDE.
    Dim DTE2 as EnvDTE80.DTE2
    Dim MacrosDTE2 as EnvDTE80.DTE2
    DTE2 = System.Runtime.InteropServices.Marshal.GetActiveObject_
    ("VisualStudio.DTE2")
    MacrosDTE2 = DTE2.MacrosIDE
    

Чтобы установить ссылку на объект DTE2 в Visual C#

  • Добавьте следующие строки в свой код:

    // Create a new instance of Visual Studio.
    EnvDTE80.DTE2 myDTE2;
    myDTE2 = (EnvDTE80.DTE2)Microsoft.VisualBasic.Interaction.
    CreateObject("VisualStudio.DTE.8.0", "");
    

    –или–

    // Get an instance of the currently running Visual Studio IDE.
    EnvDTE80.DTE2 dte2;
    dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.
    GetActiveObject("VisualStudio.DTE.8.0");
    
  • Чтобы создать ссылку на объект интегрированной среды разработки макросов, добавьте следующие строки в свой код:

    // Get an instance of the currently running Macros IDE.
    EnvDTE80.DTE2 dte2;
    EnvDTE80.DTE2 MacrosDTE2;
    dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.
    GetActiveObject("VisualStudio.DTE.8.0");
    MacrosDTE2 = dte2.MacrosIDE;
    

Чтобы установить ссылку на объект DTE в Visual C++ (ATL)

  • Введите в код следующие строки.

    CComPtr<EnvDTE::_DTE> m_pDTE;
    CComPtr<EnvDTE80::_DTE2> m_pDTE2;
    // The 7.1 reference works only if you have Visual Studio .NET 2003 // installed.
    HRESULT hr = m_pDTE.CoCreateInstance("VisualStudio.DTE.7.1", 0, 
    CLSCTX_ALL); // Create a new instance of Visual Studio 
    HRESULT hr2 = m_pDTE2.CoCreateInstance("VisualStudio.DTE.8.0", 0, 
    CLSCTX_ALL); // Create a new instance of Visual Studio.
    

    –или–

    CComPtr<EnvDTE::_DTE> m_pDTE;
    CComPtr<EnvDTE80::_DTE2> m_pDTE2;
    CLSID clsid;
    CLSID clsid2;
    // The 7.1 reference works only if you have Visual Studio .NET 2003 // installed.
    CLSIDFromProgID(L"VisualStudio.DTE.7.1",&clsid);
    CLSIDFromProgID(L"VisualStudio.DTE.8.0",&clsid2);
    CComPtr<IUnknown> punk;
    CComPtr<IUnknown> punk2;
    // Get a running instance of Visual Studio.
    // The clsid reference works only if you have Visual Studio .NET 
    // 2003 installed.
    HRESULT hr = GetActiveObject(clsid,NULL,&punk);
    HRESULT hr = GetActiveObject(clsid2,NULL,&punk2);
    m_pDTE = punk;
    m_pDTE2 = punk2;
    
  • Чтобы создать ссылку на объект интегрированной среды разработки макросов, добавьте следующие строки в свой код:

    // Get an instance of the currently runnig Macros IDE.
    CComPtr<EnvDTE80::_DTE2> m_pDTE2;
    CComPtr<EnvDTE80::_DTE2> m_pMacrosIDE;
    CLSID clsid;
    CLSIDFromProgID(L"VisualStudio.DTE.8.0",&clsid);
    CComPtr<IUnknown> punk;
    HRESULT hr = GetActiveObject(clsid,NULL,&punk);
    m_pDTE = punk;
    m_pDTE->get_MacrosIDE((void **)&m_pMacrosIDE);
    

См. также

Задачи

Практическое руководство. Добавление ссылок на пространства имен EnvDTE, EnvDTE80 и EnvDTE90

Практическое руководство. Управление надстройками с помощью диспетчера надстроек

Основные понятия

Присоединение к конкретным экземплярам интегрированной среды разработки

Регистрация надстройки

Диаграмма модели объектов автоматизации

Другие ресурсы

Создание надстроек и мастеров