如何:获取对 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 应用程序一起正常工作。

68shb4dw.alert_note(zh-cn,VS.90).gif说明:

显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。这些过程是使用现用的常规开发设置开发的。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 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 命名空间的引用

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

概念

附加到 IDE 的特定实例

外接程序注册

自动化对象模型图表

其他资源

创建外接程序和向导