如何:获取对 DTE 和 DTE2 对象的引用【DTE 和 DTE2 的区别,EnvDTE,EnvDTE80,EnvDTE90,EnvDTE90a,EnvDTE100】
如何:获取对 DTE 和 DTE2 对象的引用
在 EnvDTE 程序集中,DTE 对象表示 Visual Studio 集成开发环境 (IDE),并且是自动化模型层次结构中最高级别的对象。 所有的自动化应用程序必须有对此对象的引用,以获取对核心自动化模型的访问权。 Visual Studio 的情况也如此。
但是添加的 EnvDTE80 程序集提供了一个名为 DTE2 的顶级替换对象,以取代 DTE 对象。 两个对象的作用和编程方式相似,但是 DTE2 包含一些新功能,并承载了许多新建和更新的对象和集合。
因此,在创建新自动化应用程序和外接程序时,应创建对这两个对象的引用。 新 DTE2 对象提供了对新功能的访问权,而 DTE 对象提供了对核心自动化功能其余部分的访问权。 只要可能,就应使用 DTE2 下的新对象和集合,而不使用 DTE 中的对象和集合。
下面的过程显示如何获取对 DTE2 对象的引用。 (此过程也适用于 DTE 对象。)在添加对对象的引用前,必须添加对相应的程序集和类型库的引用。 有关更多信息,请参见如何:添加对自动化命名空间的引用。
要使用的编程标识符 (ProgID) 为 VisualStudio.DTE.10.0。 然后可以将返回的对象强制转换为 DTE2 接口。
DTE2 属性、方法和事件在被调用时,将返回 DTE 类型。 例如,Solution 会返回一个 Solution 对象,而不是您可能期望的 Solution2 对象。 所以,当使用成员 DTE2 或其他类型的成员时,必须显式强制转换它们的类型。 这样做有许多原因。 首先这样可以提高一致性并减少发生混淆。 对于所有 DTE2 属性,EnvDTE80.dll 程序集一致地返回相同的接口。 返回最新的接口版本造成混淆。 例如,如果将来版本的 Visual Studio 有一个 DTE3 类型,则有些接口可能返回 DTE,有些返回 DTE2,还有些返回 DTE3。 另外,它会造成 COM 互操作问题,这是因为 EnvDTE80 中的“2”接口派生自 EnvDTE 接口。 例如,Window2 派生自 Window。 如果将 DTE 属性添加到 Window2,它就会隐藏 Windows 属性,而不会与 COM 应用程序一起正常工作。
注意 |
---|
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。 这些过程是在“常规开发设置”处于活动状态时开发的。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 有关更多信息,请参见 使用设置。 |
在 Visual Basic 和 C# 中引用 DTE2 对象
-
在代码中添加以下内容:
' 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");
-
若要在代码中引用宏 IDE 对象,请添加以下内容:
' 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;
在 Visual C++ (ATL) 中引用 DTE 或 DTE2 对象
-
在代码中输入以下内容:
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;
-
若要在代码中引用宏 IDE 对象,请添加以下内容:
// 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);