如何:获取对 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;
    

请参见

任务

如何:添加对自动化命名空间的引用

如何:使用外接程序管理器控制外接程序

概念

附加到 IDE 的特定实例

外接程序注册

自动化对象模型图表

其他资源

创建外接程序和向导