如何:获取对 DTE 和 DTE2 对象的引用
更新:2007 年 11 月
在 EnvDTE 程序集中,DTE 对象表示 Visual Studio 集成开发环境 (IDE),并且是自动化模型层次结构中最高级别的对象。所有的自动化应用程序必须有对此对象的引用,以获取对核心自动化模型的访问权。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 或其他类型的成员时,必须显式强制转换它们的类型。这样做有许多原因。首先这样可以提高一致性并减少发生混淆。对于所有 DTE2 属性,EnvDTE80 程序集一致地返回相同的接口。返回最新的接口版本造成混淆。例如,如果将来版本的 Visual Studio 有一个 DTE3 类型,则有些接口可能返回 DTE,有些返回 DTE2,还有些返回 DTE3。另外,它会造成 COM 互操作问题,这是因为 EnvDTE80 中的“2”接口派生自 EnvDTE 接口。例如,Window2 派生自 Window。如果将 DTE 属性添加到 Window2,它就会隐藏 Windows 属性,而不会与 COM 应用程序一起正常工作。
说明: |
---|
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。这些过程是使用现用的常规开发设置开发的。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置。 |
在 Visual Basic 中引用 DTE2 对象
在代码中添加以下内容:
' 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")
若要在代码中引用宏 IDE 对象,请添加以下内容:
' 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
在 Visual C# 中引用 DTE2 对象
在代码中添加以下内容:
// 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");
若要在代码中引用宏 IDE 对象,请添加以下内容:
// 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;
在 Visual C++ (ATL) 中引用 DTE 或 DTE2 对象
在代码中输入以下内容:
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;
若要在代码中引用宏 IDE 对象,请添加以下内容:
// 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 命名空间的引用