65.9K
CodeProject is changing. Read more.
Home

Refreshing project references with a Macro

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.45/5 (11 votes)

Feb 25, 2004

CPOL

1 min read

viewsIcon

91843

How to write a macro in order to refresh all the references of all the project of the solution

Introduction

This article show you how to write a macro that refreshes all the references of a solution. This is useful when you have a lot of projects with interrelated DLL references between them. So when you have DLL versions problems, you refresh all the references of the solution an solve it.

Using the code

Take the code showed below and paste it in the Macro IDE (Alt + F11) to create a macro.

RefreshProjectReferences Sub

This function runs the macro code. Obtains the solution projects, display a processing message and iterates between projects refreshing the references. Uses the DTE Status Bar to show a progress bar and a progress message.

    'Refresh the references of all projects in the solution
    Sub RefreshProjectReferences()
        ' Retrieve the VSProject object.
        Dim oVSProject As VSProject

        'Create an popup message window
        Dim frmMessage As PopupMessage
        Try
            frmMessage = New PopupMessage("Refreshing references")
            frmMessage.Show()

        Catch ex As Exception
            'Handle exceptions here
        End Try

        'Iterate solution's projects
        For i = 1 To DTE.Solution.Projects.Count
            'Update progress bar
            DTE.StatusBar.Progress(True, "Refreshing projects references", _
              i, DTE.Solution.Projects.Count)
            'Obtain the project object
            oVSProject = CType(DTE.Solution.Projects.Item(i).Object, VSProject)
            If Not oVSProject Is Nothing Then
                'Refresh references
                oVSProject.Refresh()
            End If
        Next
        'Refreshing finished
        DTE.StatusBar.Progress(False)
        DTE.StatusBar.Text = "Refreshing succeed"
        DTE.StatusBar.Highlight(True)

        Try
            'Destroy objects
            frmMessage.Close()
            frmMessage.Dispose()
            frmMessage = Nothing
        Catch ex As Exception
            'Handle exceptions here
        End Try
    End Sub

PopupMessage Class

This class defines a Popup Window that show a message during refresh execution.

Note: The look & feel of this window is very simple, you can work on it for a best view.

    'Popup Window with a Waiting Message
    Public Class PopupMessage
        Inherits System.Windows.Forms.Form

        Private txtMessage As New System.Windows.Forms.TextBox

        Public Sub New(ByVal pMessage As String)
            Try
                'Form format
                Me.TopMost = True
                Me.ControlBox = False
                Me.FormBorderStyle = _
                       System.Windows.Forms.FormBorderStyle.Fixed3D
                Me.Text = ""
                Me.ShowInTaskbar = False

                'Textbox format
                txtMessage.Top = 20
                txtMessage.Left = 40
                txtMessage.Width = 160
                txtMessage.Font = New System.Drawing.Font("Arial", 10, _
                   System.Drawing.FontStyle.Bold)
                txtMessage.BackColor = System.Drawing.SystemColors.Control
                txtMessage.ForeColor = System.Drawing.Color.Black
                txtMessage.BorderStyle = _
                    System.Windows.Forms.BorderStyle.None
                txtMessage.Text = pMessage
                txtMessage.AutoSize = True
                txtMessage.SelectionLength = 0
                Me.Controls.Add(txtMessage)

                Me.Height = txtMessage.Height + 40
                Me.Width = txtMessage.Width + 80
                Me.StartPosition = _
                   System.Windows.Forms.FormStartPosition.CenterScreen
                txtMessage.Refresh()
                Me.Refresh()

            Catch ex As System.Exception
                'Handle exceptions here
            End Try

        End Sub

    End Class

Tip

After you paste the code in the Macro Editor is useful assign a key combination to the macro (if you plan to use very much times the macro).

To do this:

  1. Open the menu Tools/Options
  2. Go to the folder Enviroment and select the Keyboard item
  3. Then select the macro name (e.g. Macros.Samples.VSEditor.RefreshProjectReferences)
  4. Select the shortcut key combination and assign it

When you select the shortcut key combination, VS will show you if it's already used and in the "Use new shortcut in" you can select the valid shortcut context.

Points of Interest

The only thing I want to remark is that macros makes extensible the Visual Studio environment and if you take a minutes to write a little code you can automate several repetitive actions.