共用方式為


如何:取得參考至 DTE 和 DTE2 物件

注意事項注意事項

在 Visual Studio 2013 中,增益集已被取代。我們建議您將增益集升級為 VSPackage 擴充功能。如需詳細資訊,請參閱常見問題集:將增益集轉換成 VSPackage 擴充功能

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

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

當您建立新的 Automation 應用程式時,建議您建立對兩物件的參考轉換為 DTE2 物件以提供存取新功能和針對 DTE 物件可以用來存取核心功能的其餘部分。 也建議您盡可能在 DTE2 使用新的物件和集合而非使用 DTE

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

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

當它們被呼叫時, DTE2 屬性、方法和事件時會傳回 DTE 型別。 例如,Solution 會傳回 Solution 物件,而非預期的 Solution2 物件。 這就是為什麼當您使用 DTE2 成員或其他型別成員時必須明確轉換其型別。 這個設計提升一致性並減少混淆。 EnvDTE80.dll 組件會對所有 DTE2 屬性一致傳回相同的介面。 傳回最新介面版本可能容易混淆。例如,如果 Visual Studio 未來的版本有 DTE3 型別,而某些介面可能傳回 DTEDTE2和一些 DTE3。 此外,這也可能造成 COM Interop 發生問題,因為在 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;
    

請參閱

工作

如何:加入 Automation 命名空間的參考

如何:使用增益集管理員來控制增益集

概念

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

增益集登錄

Automation 物件模型圖表

其他資源

建立增益集和精靈