Nel progetto che sto seguendo ho avuto la necessità di creare una macro per Visual Studio 2005 che esegua un comando passando come parametro il path dell'item selezionato nel Solution Explorer.
Elencherò tutti i passi necessari per aggiungere la macro al proprio progetto:
Per prima cosa apriamo il Macros IDE (menu Tools -> Macros -> Macros IDE oppure Alt + F11), clic col il destro sul progetto MyMacros, dal context menu clic su Add Module e scegliamo un nome per il modulo, nel mio caso userò RunCommandModule.
Se i passi sono stati eseguiti correttamente dovremmo visualizzare qualcosa del genere:
A questo punto aggiungiamo una funzione che ritorni il nodo selezionato del Solution Explorer:
Public Module RunCommandModule
Private Function GetFirstSelectedProjectItem() As UIHierarchyItem
Dim UIHSolutionExplorer As UIHierarchy
UIHSolutionExplorer = DTE.Windows.Item(Constants.vsext_wk_SProjectWindow).Object
Dim UIHierarchyItems() As Object
UIHierarchyItems = UIHSolutionExplorer.SelectedItems
If UIHierarchyItems.Length = 0 Then
GetFirstSelectedProjectItem = Nothing
Else
GetFirstSelectedProjectItem = UIHierarchyItems(0)
End If
End Function
End Module
A me serve solo il primo item selezionato, ma se volete lanciare il comando su tutti gli item selezionati basta far ritornare un Array di UIHierarchyItem.
Ogni UIHierarchyItem contiene una property Object in cui il Type dipende dal nodo selezionato. Nel nostro caso ci interessano i nodi di tipo ProjectItem.
Aggiungiamo quindi un metodo per estrarre il path da un UIHierarchyItem:
Private Function GetPath(ByVal item As UIHierarchyItem) As String
Dim projectItem As EnvDTE.ProjectItem
If TypeOf (item.Object) Is EnvDTE.ProjectItem Then
projectItem = item.Object
GetPath = projectItem.FileNames(1)
Else
GetPath = ""
End If
End Function
A questo punto aggiungiamo il metodo, questa volta, public RunCommand:
Public Sub RunCommand()
Dim selectedItem As UIHierarchyItem
selectedItem = GetFirstSelectedProjectItem()
If selectedItem Is Nothing Then
MsgBox("You should select a project item")
Exit Sub
End If
Dim path As String
path = GetPath(selectedItem)
If Len(path) = 0 Then
MsgBox("Invalid selected item")
Exit Sub
End If
Shell("somecommand.exe " & path, AppWinStyle.NormalFocus, True)
End Sub
Ovviamente bisognerà sostituire al primo parametro del metodo Shell il nome corretto del comando da seguire.
Se aveste bisogno di chiedere all'utente ulteriori parametri si può usare il metodo InputBox. Es:
Dim parameter As String
parameter = InputBox("Enter a string")
In questo caso quando lanciate la macro vi apparirà una finestra del tipo:
Non rimane altro che aggiungere una voce al context menu del progetto. Per far questo chiudiamo il Macros IDE clic con il destro sulla toolbar e clic su customize:
Dal Tab Toolbars selezioniamo Context Menus poi selezioniamo il tab Commands da Categories selezioniamo Macros e dall'elenco a Destra trasciniamo il comando MyMacros.RunCommandModule.RunCommand nel menu Project and Solution Context menu -> Item.