Gewusst wie: Abrufen von Verweisen auf das DTE-Objekt und das DTE2-Objekt
In der EnvDTE-Assembly stellt das DTE-Objekt die integrierte Entwicklungsumgebung (Integrated Development Environment, IDE) von Visual Studio dar. Hierbei handelt es sich um das Objekt der obersten Ebene in der Hierarchie des Automatisierungsmodells. Alle Automatisierungsanwendungen müssen einen Verweis auf dieses Objekt enthalten, um auf das zentrale Automatisierungsmodell zugreifen zu können. Dies ist auch bei Visual Studio weiterhin der Fall.
Mit der neuen EnvDTE80-Assembly wird jedoch ein anderes Objekt der obersten Ebene mit dem Namen DTE2 bereitgestellt. Dieses tritt an die Stelle des DTE-Objekts. Beide Objekte sind im Hinblick auf Verhalten und Programmierung vergleichbar, allerdings bietet DTE2 neue Funktionalität und umfasst eine Reihe neuer und aktualisierter Objekte und Auflistungen.
Aus diesem Grund sollten Sie beim Erstellen neuer Automatisierungsanwendungen und Add-Ins Verweise auf beide Objekte erstellen. Das neue DTE2-Objekt bietet Zugriff auf die neue Funktionalität, während das DTE-Objekt Zugriff auf den verbleibenden Teil der Kernfunktionalität für die Automatisierung bietet. Verwenden Sie nach Möglichkeit immer die neuen Objekte und Auflistungen unter DTE2 anstelle der Objekte und Auflistungen in DTE.
In den folgenden Prozeduren wird veranschaulicht, wie Sie einen Verweis auf das DTE2-Objekt abrufen. (Dieselbe Prozedur gilt für das DTE-Objekt.) Bevor Sie Verweise auf die Objekte hinzufügen, müssen Sie Verweise auf die entsprechenden Assemblys und die Typbibliothek hinzufügen. Weitere Informationen finden Sie unter Gewusst wie: Hinzufügen von Verweisen auf Automatisierungsnamespaces.
Der zu verwendende Programmbezeichner (ProgID) lautet VisualStudio.DTE.10.0. Sie können dann das zurückgegebene Objekt in eine DTE2-Schnittstelle umwandeln.
Wenn die DTE2-Eigenschaften, -Methoden und -Ereignisse aufgerufen werden, werden die DTE-Typen zurückgegeben. So gibt zum Beispiel Solution ein Solution-Objekt zurück, kein Solution2-Objekt, wie Sie möglicherweise erwarten. Aus diesem Grund müssen Sie verwendete DTE2-Member oder andere Typmember explizit umwandeln. Dies hat verschiedene Gründe. Zunächst wird dadurch Konsistenz gefördert und weniger Verwirrung gestiftet. Die Assembly EnvDTE80.dll gibt konsistent für alle DTE2-Eigenschaften dieselbe Schnittstelle zurück. Wenn immer die neueste Schnittstellenversion zurückgegeben würde, wäre das verwirrend. Würde beispielsweise eine künftige Version von Visual Studio den DTE3-Typ aufweisen, so würden manche Schnittstellen möglicherweise DTE zurückgeben, andere DTE2 und wieder andere DTE3. Zudem könnte es bei COM-Interop zu Problemen kommen, da die mit "2" gekennzeichneten Schnittstellen in EnvDTE80 von den EnvDTE-Schnittstellen abgeleitet sind. So ist z. B. Window2 von Window abgeleitet. Würde eine DTE-Eigenschaft zu Window2 hinzugefügt, so würde die Windows-Eigenschaft ausgeblendet, und die ordnungsgemäße Funktion mit COM-Anwendungen wäre nicht mehr gewährleistet.
Tipp
Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen. Bei der Entwicklung dieser Verfahren war die Option Allgemeine Entwicklungseinstellungen aktiviert. Wählen Sie im Menü Extras die Option Einstellungen importieren und exportieren aus, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Arbeiten mit Einstellungen.
So verweisen Sie in Visual Basic und C# auf das DTE2-Objekt
Fügen Sie im Code den folgenden Code hinzu:
' 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");
Fügen Sie im Code Folgendes hinzu, um auf das Makro-IDE-Objekt zu verweisen:
' 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;
So verweisen Sie in Visual C++ (ATL) auf das DTE-Objekt oder das DTE2-Objekt
Geben Sie im Code den folgenden Code ein:
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;
Fügen Sie im Code Folgendes hinzu, um auf das Makro-IDE-Objekt zu verweisen:
// 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);
Siehe auch
Aufgaben
Gewusst wie: Hinzufügen von Verweisen auf Automatisierungsnamespaces
Gewusst wie: Steuern von Add-Ins mit dem Add-In-Manager
Konzepte
Anfügen an bestimmte Instanzen der IDE
Diagramm "Automationsobjektmodell"