Практическое руководство. Получение ссылок на объекты DTE и DTE2
В сборке EnvDTE объект DTE представляет интегрированную среду разработки Visual Studio и является объектом верхнего уровня в иерархии модели автоматизации. Все приложения автоматизации должны ссылаться на этот объект, чтобы получить доступ к базовой модели автоматизации. Это относится к Visual Studio.
Но дополнение сборки EnvDTE80 обеспечивает замену объекта верхнего уровня — DTE2, который замещает объект DTE. Как объекты, так и программа действуют одинаково, но DTE2 обладает новыми возможностями и включает ряд новых и обновленных объектов и коллекций.
В результате, при создании новых приложений автоматизации надстроек следует создавать ссылки на оба объекта. Новый объект DTE2 предоставляет доступ к новым возможностям, в то время, как объект DTE обеспечивает доступ к остальным основным функциональным возможностям автоматизации. Новые объекты и коллекции в DTE2 следует по возможности использовать вместо объектов и коллекций в DTE.
Следующие процедуры демонстрируют порядок получения ссылки на объект DTE2. (Та же процедура применима и к объекту DTE). Перед добавлением ссылок на объекты необходимо добавить ссылки на соответствующие сборки и библиотеку типов. Дополнительные сведения см. в разделе Практическое руководство. Добавление ссылок на пространства имен автоматизации.
В качестве программного идентификатора (ProgID) необходимо использовать VisualStudio.DTE.10.0. Затем можно привести возвращенный объект к интерфейсу DTE2.
Свойства, методы и события DTE2 при вызове возвращают типы DTE. Например, Solution возвращает объект Solution, а не объект Solution2, как можно предполагать. Именно поэтому при использовании членов DTE2 или других членов типов необходимо выполнить их явное приведение. Это было сделано специально по ряду причин. Первая причина — обеспечить согласованность и избежать путаницы. Сборка EnvDTE80.dll постоянно возвращает один и тот же интерфейс для всех свойств DTE2. Возврат последней версии интерфейса может создать путаницу. Например, если будущая версия Visual Studio имеет тип DTE3, то некоторые интерфейсы могут вернуть DTE, некоторые — DTE2, а некоторые — DTE3. Более того, могут возникнуть проблемы с COM-взаимодействием, так как интерфейсы "2" в EnvDTE80 являются производными от интерфейсов EnvDTE. Например, Window2 является производным от Window. Если свойство DTE добавить к Window2, то оно скроет свойство Windows и не будет работать правильно с приложениями COM.
Примечание
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих настроек или выпуска.Эти процедуры были разработаны с обычными параметрами разработки.Чтобы изменить настройки, в меню Сервис выберите команду Импорт и экспортпараметров.Дополнительные сведения см. в разделе Работа с параметрами.
Создание ссылки на объект DTE2 в Visual Basic и C#
Добавьте следующие строки в свой код:
' Get an instance of the currently running Visual Studio IDE. Dim DTE2 as EnvDTE80.DTE2 DTE2 = System.Runtime.InteropServices.Marshal. _ GetActiveObject("VisualStudio.DTE.10.0")
// Get an instance of the currently running Visual Studio IDE. EnvDTE80.DTE2 dte2; dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal. GetActiveObject("VisualStudio.DTE.10.0");
Чтобы создать ссылку на объект интегрированной среды разработки макросов, добавьте следующие строки в свой код:
' Get an instance of the currently running Macros IDE. Dim DTE2 as EnvDTE80.DTE2 Dim MacrosDTE2 as EnvDTE._DTE DTE2 = System.Runtime.InteropServices.Marshal.GetActiveObject_ ("VisualStudio.DTE2") MacrosDTE2 = DTE2.MacrosIDE
// Get an instance of the currently running Macros IDE. EnvDTE80.DTE2 dte2; EnvDTE.DTE MacrosDTE; dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal. GetActiveObject("VisualStudio.DTE.10.0"); MacrosDTE = dte2.MacrosIDE;
Чтобы установить ссылку на объект DTE в Visual C++ (ATL)
Введите в код следующие строки.
CComPtr<EnvDTE::_DTE> m_pDTE; CComPtr<EnvDTE80::DTE2> m_pDTE2; CLSID clsid; CLSID clsid2; CLSIDFromProgID(L"VisualStudio.DTE.10.0",&clsid); CLSIDFromProgID(L"VisualStudio.DTE.10.0",&clsid2); CComPtr<IUnknown> punk; CComPtr<IUnknown> punk2; // Get a running instance of Visual Studio. HRESULT hr = GetActiveObject(clsid,NULL,&punk); hr = GetActiveObject(clsid2,NULL,&punk2); m_pDTE = punk; m_pDTE2 = punk2;
Чтобы создать ссылку на объект интегрированной среды разработки макросов, добавьте следующие строки в свой код:
// Get an instance of the currently running Macros IDE. CComPtr<EnvDTE80::DTE2> m_pDTE2; CComPtr<EnvDTE::_DTE> m_pMacrosIDE; CLSID clsid; CLSIDFromProgID(L"VisualStudio.DTE.10.0",&clsid); CComPtr<IUnknown> punk; HRESULT hr = GetActiveObject(clsid,NULL,&punk); m_pDTE = punk; m_pDTE->get_MacrosIDE((void **)&m_pMacrosIDE);
См. также
Задачи
Практическое руководство. Добавление ссылок на пространства имен автоматизации
Практическое руководство. Управление надстройками с помощью диспетчера надстроек
Основные понятия
Присоединение к конкретным экземплярам интегрированной среды разработки
Диаграмма модели объектов автоматизации