Fragensteller
VS-Makro: Projekt-Item identifizieren

Frage
-
Hallo,
ich möchte wissen, ob das selektierte Item im Solution-Explorer ein Projekt ist oder nicht. Dazu folgenden Code:
Dim pSolutionExplorer As UIHierarchy = DTE.Windows.Item(Constants.vsext_wk_SProjectWindow).Object() Dim aSelectedItems As Array = pSolutionExplorer.SelectedItems Dim pItem As UIHierarchyItem = aSelectedItems(0) Dim pProject As Project = pItem.Object If pProject is Nothing Then Return End If MsgBox("Projekt-Name: " + pProject.Name)
Das ganze funktioniert wunderbar, solange es sich um ein .NET-Projekt handelt, das ich selektiert habe. Benutze ich das Makro allerdings bei anderen Projekttypen, z.B. Win32 oder MFC, dann erhalte ich eine E_NOINTERFACE-Exception.
Gibt es eine Möglichkeit, auch Nicht-.NET-Projekte im Solution-Explorer zu identifizieren?
Gruß
Batty
Alle Antworten
-
Hallo Batty,
die *.vcproj Dateien von C++ Projekten verwenden nicht MSBuild, wie dies bei .net Projekten der Fall ist, ich nehme an das hier das Problem liegt (gilt nicht mehr ab Visual Studio 2010). Du müsstest also auf anderem Wege prüfen ob es sich um ein Projekt handelt. Möglicherweise scheitert es nur am Attribut "Name", das so nicht zur Verfügung steht?
Gruß
- Florian -
Hallo Florian.
Ich hatte eigentlich gedacht (gehofft), dass dass Studio (es geht hier um VS2008, das hatte ich vergessen zu erwähnen) unabhängig von der verwendeten Sprache und Umgebung seine Projektdateien mit einer einheitlichen Syntax und Semantik verwendet. Immerhin muss man ja Projektdateien auch konvertieren, wenn sie mit einer älteren Version des Studios erzeugt wurden. Aber das ist offensichtlich nicht zu 100% der Fall...
Das Name-Property ist im Übrigen nicht das Problem, sondern die Zeile
Hier wird die Exception geworfen.Dim pProject As Project = pItem.Object
Gruß,
Batty
-
Hatte ich befürchtet, dass es dort bereits scheitert. Allerdings zeigt das Visual Studio bei den Eigenschaften an das es sich um eine Projektdatei handelt, diese Eigenschaften kann man bestimmt auch ermitteln. Dein "pItem.Object" könntest Du z. B. dem Typ fragen, bevor Du es einfach "pProject" zuweist, einfach Project anzunehmen halte ich für etwas zu mutig.
- Florian -
Das schrieb ich ja bereits, das Interface "Project" ist nicht kompatibel mit Projekten im Visual Studio die kein MSBuild verwenden, d. h. Du musst das passende Interface ermitteln oder auf anderen Wege an die nötige Information kommen.
Kleine Ergänzung:
so könnte es auch gehen...
Dim aSelectedItems As Array = DTE.ActiveSolutionProjects
For Each one In aSelectedItems
MsgBox("Projekt-Name: " + one.Name)
Next
- Florian- Bearbeitet Florian Haupt Dienstag, 5. Oktober 2010 14:32 Alternativer Lösungsvorschlag
- Als Antwort vorgeschlagen Florian Haupt Montag, 4. Juli 2011 12:52
-
Wenn ich mir vorher den Namen des selektierten Items hole und darüber einen Vergleich mache....? Hmm, könnte gehen, aber eine Identifikation über einen String-Vergleich wirkt irgendwie ein wenig... antiquiert. ;-)
Aber in Ermangelung an besseren Lösungen, werde ich es wohl so machen müssen.Danke auf jeden Fall. :-)
Gruß
Batty