This bug eluded me during several days because there was another bug that already caused VS 2010 Beta 2 to hang, but finally a couple of days ago I realized that was seeing a different issue (no commandbarbutton involved in this new bug) and I was able to isolate and report it today:
VS 2010 Beta 2 Bug: adding CommandBarPopup to CommandbarPopup causes VS to hang if CommandBarPopup was added to Toolbar before
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=507650
As I expressed some days ago, my feeling with VS 2010 so far (after four builds) is that once you patch your add-in to (somehow) bypass a bug, the add-in finds a new one.
The (VB.NET) code to reproduce it is:
Imports System
Imports Microsoft.VisualStudio.CommandBars
Imports Extensibility
Imports EnvDTE
Imports EnvDTE80
Public Class Connect
Implements IDTExtensibility2
Private _applicationObject As DTE2
Private _addInInstance As AddIn
Private _commandBarToolbar As CommandBar
Private _commandBarPopupOnToolbar As CommandBarPopup
Private _commandBarPopupMenu As CommandBarPopup
Private _commandBarPopupOnMenu As CommandBarPopup
Public Sub OnConnection(ByVal application As Object, ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, ByRef custom As Array) Implements IDTExtensibility2.OnConnection
_applicationObject = CType(application, DTE2)
_addInInstance = CType(addInInst, AddIn)
Select Case connectMode
Case ext_ConnectMode.ext_cm_AfterStartup
InitializeAddIn()
Case ext_ConnectMode.ext_cm_Startup
' OnStartupComplete will be called
End Select
End Sub
Public Sub OnStartupComplete(ByRef custom As Array) Implements IDTExtensibility2.OnStartupComplete
InitializeAddIn()
End Sub
Private Sub InitializeAddIn()
Dim commandBars As CommandBars
Try
commandBars = CType(_applicationObject.CommandBars(), CommandBars)
If MessageBox.Show("Create toolbar before menu?", "", MessageBoxButtons.YesNo) = DialogResult.Yes Then
' This hangs VS 2010 Beta 2
CreateToolbar(commandBars)
CreateMenu(commandBars)
Else
' This causes nested menus but doesn’t hang VS 2010 Beta 2
CreateMenu(commandBars)
CreateToolbar(commandBars)
End If
Catch ex As Exception
System.Windows.Forms.MessageBox.Show(ex.ToString)
End Try
End Sub
Private Sub CreateToolbar(ByVal commandBars As CommandBars)
_commandBarToolbar = commandBars.Add(Name:="My toolbar", Position:=MsoBarPosition.msoBarTop, Temporary:=True)
_commandBarPopupOnToolbar = AddCommandBarPopupToCommandBar(_commandBarToolbar, "MyPopupOnToolbar", "My Popup On Toolbar")
_commandBarToolbar.Visible = True
End Sub
Private Sub CreateMenu(ByVal commandBars As CommandBars)
Dim menuCommandBar As CommandBar
menuCommandBar = commandBars.Item("MenuBar")
_commandBarPopupMenu = AddCommandBarPopupToCommandBar(menuCommandBar, "MyPopupMenu", "My Menu")
_commandBarPopupOnMenu = AddCommandBarPopupToCommandBar(_commandBarPopupMenu.CommandBar, "MyPopupOnMenu", "My Popup On Menu")
_commandBarPopupMenu.Visible = True
End Sub
Public Sub OnDisconnection(ByVal disconnectMode As ext_DisconnectMode, ByRef custom As Array) Implements IDTExtensibility2.OnDisconnection
Try
If Not _commandBarPopupOnMenu Is Nothing Then
_commandBarPopupOnMenu.Delete()
End If
If Not _commandBarPopupOnToolbar Is Nothing Then
_commandBarPopupOnToolbar.Delete()
End If
If Not _commandBarPopupMenu Is Nothing Then
_commandBarPopupMenu.Delete()
End If
If Not _commandBarToolbar Is Nothing Then
_commandBarToolbar.Delete()
End If
Catch ex As Exception
System.Windows.Forms.MessageBox.Show(ex.ToString)
End Try
End Sub
Public Sub OnAddInsUpdate(ByRef custom As Array) Implements IDTExtensibility2.OnAddInsUpdate
End Sub
Public Sub OnBeginShutdown(ByRef custom As Array) Implements IDTExtensibility2.OnBeginShutdown
End Sub
Friend Shared Function AddCommandBarPopupToCommandBar(ByVal objParentCommandBar As CommandBar, _
ByVal sCommandBarName As String, ByVal sCaption As String) As CommandBarPopup
Dim objCommandBarPopup As CommandBarPopup = Nothing
Dim objCommandBar As CommandBar
Dim objCommandBarControl As CommandBarControl
Dim iPosition As Integer
If Not (objParentCommandBar Is Nothing) Then
iPosition = objParentCommandBar.Controls.Count + 1
objCommandBarControl = objParentCommandBar.Controls.Add(Type:=MsoControlType.msoControlPopup, Before:=iPosition)
objCommandBarPopup = CType(objCommandBarControl, CommandBarPopup)
objCommandBar = objCommandBarPopup.CommandBar
If Not (objCommandBar Is Nothing) Then
objCommandBar.Name = sCommandBarName
objCommandBarPopup.Caption = sCaption
End If
End If
Return objCommandBarPopup
End Function
End Class