如何:获取对 DTE 和 DTE2 对象的引用

备注

在 Visual Studio 2013 中,弃用外接程序。我们建议您将外接程序升级到 VSPackage 扩展。有关详细信息,请参阅常见问题:将外接程序转换为 VSPackage 扩展

EnvDTE 程序集中,DTE 对象表示 Visual Studio 集成开发环境 (IDE),并且是自动化模型层次结构中最高级别的对象。 一个自动化应用程序必须有对此对象的引用,以获取对核心自动化模型的访问权。

然而添加的 EnvDTE80 程序集提供了一个名为 DTE2 的顶级替换对象,取代 DTE 对象。 尽管两个对象的作用和编程方式相似,但是 DTE2 包含一些新功能,并承载了许多新建和更新的对象和集合。

当您创建新的自动化程序时我们建议您创建提供了对新功能的访问权的 DTE2 对象和提供了对核心自动化功能其余部分的访问权 DTE 对象的引用。 我们还建议,只要可能,就应使用 DTE2 下的新对象和集合,而不使用 DTE 中的对象和集合。

下面的步骤显示如何获取对 DTE2 对象的引用。(此过程也适用于 DTE 对象。)在您添加对对象的引用前,必须添加对相应的程序集和类型库的引用。 有关详细信息,请参阅如何:添加对自动化命名空间的引用

要为Visual Studio 2013 使用的编程标识符 (ProgID) 为 VisualStudio.DTE.12.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 Studio 版本以及使用的设置决定了这些元素。有关详细信息,请参阅在 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.12.0")
    
    // Get an instance of the currently running Visual Studio IDE.
    EnvDTE80.DTE2 dte2;
    dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.
    GetActiveObject("VisualStudio.DTE.12.0");
    

在 Visual C++ (ATL) 中引用 DTE 或 DTE2 对象

  • 在代码中,添加如下:

    CComPtr<EnvDTE::_DTE> m_pDTE;
    CComPtr<EnvDTE80::DTE2> m_pDTE2;
    CLSID clsid;
    CLSID clsid2;
    CLSIDFromProgID(L"VisualStudio.DTE.12.0",&clsid);
    CLSIDFromProgID(L"VisualStudio.DTE.12.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 的特定实例

外接程序注册

自动化对象模型图表

其他资源

创建外接程序和向导