共用方式為


HOW TO:取得參考至 DTE 和 DTE2 物件

更新:2007 年 11 月

EnvDTE 組件中,DTE 物件表示 Visual Studio 整合式開發環境 (IDE),而且是 Automation 模型階層架構中最高層級的物件。所有 Automation 應用程式都必須要有此物件的參考,才能存取核心 Automation 模型。在 Visual Studio 2005 中情況依舊是如此。

不過新加入的 EnvDTE80 組件提供了一個名為 DTE2 的最上層取代物件,此物件會取代 DTE 物件。這兩個物件的作用與程式設計方式都很類似,只是 DTE2 包含了新的功能,而且裝載 (Host) 了一些新的與更新的物件和集合。

因此,在建立新的 Automation 應用程式和增益集 (Add-In) 時,應建立這兩個物件的參考。新的 DTE2 物件可以用來存取新的功能,而 DTE 物件則可以用來存取其餘的核心 Automation 功能。請盡可能使用 DTE2 中的新物件和集合,不要使用 DTE 中的物件和集合。

在下列程序中,會說明如何取得 DTE2 物件的參考 (同樣的程序亦適用於 DTE 物件)。在加入物件的參考之前,您必須先加入適合組件和型別程式庫的參考。如需詳細資訊,請參閱 HOW TO:在 EnvDTE、EnvDTE80 和 EnvDTE90 命名空間中加入參考

要使用的程式設計識別項 (ProgID) 是 VisualStudio.DTE.8.0。接著您就可以將傳回的物件轉換為 DTE2 介面。

呼叫 DTE2 屬性、方法和事件時,會傳回 DTE 型別。例如,Solution 會傳回 Solution 物件,而非預期的 Solution2 物件。這就是為什麼在使用 DTE2 成員或其他型別成員時必須明確轉換其型別。這麼做是基於幾個原因。第一個原因是提升一致性,並且降低混淆的可能性。EnvDTE80 組件對於所有 DTE2 屬性都會一致傳回相同的介面。如果是傳回最新的介面板本,就有可能造成混淆。例如,如果 Visual Studio 的未來版本有一個 DTE3 型別,那麼就有可能發生某些介面傳回 DTE,某些傳回 DTE2,而又有某些傳回 DTE3 的不一致情況。此外,這也可能造成 COM Interop 發生問題,因為在 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);
    

請參閱

工作

HOW TO:在 EnvDTE、EnvDTE80 和 EnvDTE90 命名空間中加入參考

HOW TO:以增益集管理員控制增益集

概念

附加至特定的 IDE 的執行個體

增益集登錄

Automation 物件模型圖表

其他資源

建立增益集和精靈