none
VS-Makro: Projekt-Item identifizieren RRS feed

  • 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

    Montag, 4. Oktober 2010 08:44

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
    Dienstag, 5. Oktober 2010 10:29
  • 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

    Dim pProject As Project = pItem.Object
    
    
    Hier wird die Exception geworfen.

    Gruß,

    Batty

    Dienstag, 5. Oktober 2010 11:32
  • 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
    Dienstag, 5. Oktober 2010 12:17
  • Die Idee hatte ich auch schon und habe es mit einem try-catch versucht, aber das Problem ist leider, dass es selbst dann "knallt", wenn ich ein Projekt im Solution-Tree selektiert habe, der cast also funktionieren müsste...

    Dienstag, 5. Oktober 2010 12:48
  • 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
    Dienstag, 5. Oktober 2010 13:58
  • 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

    Freitag, 8. Oktober 2010 07:29