如何:获取对 DTE 和 DTE2 对象的引用
在 EnvDTE 程序集中,DTE 对象表示 Visual Studio 集成开发环境 (IDE),并且是自动化模型层次结构中最高级别的对象。所有的自动化应用程序必须有对此对象的引用,以获取对核心自动化模型的访问权。Visual Studio 的情况也如此。
但是添加的 EnvDTE80 程序集提供了一个名为 DTE2 的顶级替换对象,以取代 DTE 对象。两个对象的作用和编程方式相似,但是 DTE2 包含一些新功能,并承载了许多新建和更新的对象和集合。
因此,在创建新自动化应用程序和外接程序时,应创建对这两个对象的引用。新 DTE2 对象提供了对新功能的访问权,而 DTE 对象提供了对核心自动化功能其余部分的访问权。只要可能,就应使用 DTE2 下的新对象和集合,而不使用 DTE 中的对象和集合。
下面的过程显示如何获取对 DTE2 对象的引用。(此过程也适用于 DTE 对象。)在添加对对象的引用前,必须添加对相应的程序集和类型库的引用。有关更多信息,请参见如何:添加对自动化命名空间的引用。
编程标识符 (ProgID) 用于Visual Studio 2012是 VisualStudio.DTE.11.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 Studio 设置。 |
在 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.11.0")
// Get an instance of the currently running Visual Studio IDE. EnvDTE80.DTE2 dte2; dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal. GetActiveObject("VisualStudio.DTE.11.0");
在 Visual C++ (ATL) 中引用 DTE 或 DTE2 对象
在代码中输入以下内容:
CComPtr<EnvDTE::_DTE> m_pDTE; CComPtr<EnvDTE80::DTE2> m_pDTE2; CLSID clsid; CLSID clsid2; CLSIDFromProgID(L"VisualStudio.DTE.11.0",&clsid); CLSIDFromProgID(L"VisualStudio.DTE.11.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;