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

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

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

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

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

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

呼叫 DTE2 屬性、方法和事件時,會傳回 DTE 型別。 例如,Solution 會傳回 Solution 物件,而非預期的 Solution2 物件。 這就是為什麼在使用 DTE2 成員或其他型別成員時必須明確轉換其型別。 這麼做是基於幾個原因。 第一個原因是提升一致性,並且降低混淆的可能性。 EnvDTE80.dll 組件會對所有 DTE2 屬性一致傳回相同的介面。 如果是傳回最新的介面板本,就有可能造成混淆。 例如,如果 Visual Studio 的未來版本有一個 DTE3 型別,那麼就有可能發生某些介面傳回 DTE,某些傳回 DTE2,而又有某些傳回 DTE3 的不一致情況。 此外,這也可能造成 COM Interop 發生問題,因為在 EnvDTE80 中名稱有 "2" 的介面是從 EnvDTE 介面衍生而來。 例如,Window2 是從 Window 衍生而來。 如果將 DTE 屬性加入至 Window2,它會隱藏 Windows 屬性,而且無法在 COM 應用程式中正常運作。

注意事項注意事項

根據您目前使用的設定或版本,您所看到的對話方塊與功能表指令可能會與 [說明] 中描述的不同。 使用 [一般開發設定] 開發了這些程序。 若要變更設定,請從 [工具] 功能表中選擇 [匯入和匯出設定]。 如需詳細資訊,請參閱 使用設定

若要在 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.10.0")
    
    // Get an instance of the currently running Visual Studio IDE.
    EnvDTE80.DTE2 dte2;
    dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.
    GetActiveObject("VisualStudio.DTE.10.0");
    
  • 若要參考巨集 IDE 物件,請在您的程式碼中加入下列程式碼:

    ' Get an instance of the currently running Macros IDE.
    Dim DTE2 as EnvDTE80.DTE2
    Dim MacrosDTE2 as EnvDTE._DTE
    DTE2 = System.Runtime.InteropServices.Marshal.GetActiveObject_
    ("VisualStudio.DTE2")
    MacrosDTE2 = DTE2.MacrosIDE
    
    // Get an instance of the currently running Macros IDE.
    EnvDTE80.DTE2 dte2;
    EnvDTE.DTE MacrosDTE;
    dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.
    GetActiveObject("VisualStudio.DTE.10.0");
    MacrosDTE = dte2.MacrosIDE;
    

若要在 Visual C++ (ATL) 中參考 DTE 或 DTE2 物件

  • 在程式碼中輸入下列程式碼:

    CComPtr<EnvDTE::_DTE> m_pDTE;
    CComPtr<EnvDTE80::DTE2> m_pDTE2;
    CLSID clsid;
    CLSID clsid2;
    CLSIDFromProgID(L"VisualStudio.DTE.10.0",&clsid);
    CLSIDFromProgID(L"VisualStudio.DTE.10.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 物件,請在您的程式碼中加入下列程式碼:

    // Get an instance of the currently running Macros IDE.
    CComPtr<EnvDTE80::DTE2> m_pDTE2;
    CComPtr<EnvDTE::_DTE> m_pMacrosIDE;
    CLSID clsid;
    CLSIDFromProgID(L"VisualStudio.DTE.10.0",&clsid);
    CComPtr<IUnknown> punk;
    HRESULT hr = GetActiveObject(clsid,NULL,&punk);
    m_pDTE = punk;
    m_pDTE->get_MacrosIDE((void **)&m_pMacrosIDE);
    

請參閱

工作

HOW TO:加入 Automation 命名空間的參考

HOW TO:使用增益集管理員來控制增益集

概念

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

增益集登錄

Automation 物件模型圖表

其他資源

建立增益集和精靈