Я экспериментирую с визуальным студийным дополнением и столкнулся с очень странным поведением. Я добавляю пункт контекстного меню, вызываемый правой кнопкой мыши, и не получаю, чтобы события запускали , если Я не установил точку останова в методе OnConnect
и немного подождал. Я делаю почти так же, как в этой статье .
Это абсолютно стандартная надстройка с этим кодом:
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
applicationObject = (DTE2)application;
addInInstance = (AddIn)addInInst;
var commandBars = ((CommandBars)applicationObject.CommandBars)["Code Window"];
var popup = commandBars.Controls.Add(MsoControlType.msoControlButton,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value, 1, true);
popup.Caption = "View graph";
var commandBarEvents = (CommandBarEvents)(applicationObject.Events.CommandBarEvents[popup]);
commandBarEvents.Click += ViewGraphClick;
}
private void ViewGraphClick(object commandbarcontrol, ref bool handled, ref bool canceldefault)
{
var selection = (TextSelection)applicationObject.ActiveDocument.Selection;
selection.Insert("Hello, world!");
handled = true;
}
Если я подожду с точкой останова в начале метода, это дополнение будет работать. Если я не буду ждать, это никогда не вызовет мое событие. Однако во всех случаях он добавит мой пункт в контекстное меню.
Насколько я понимаю, этот метод вызывается только один раз. Есть идеи о том, что я здесь делаю не так?
Обновление: Я пытался вставить тот же код инициализации в OnStartup
. Результат тот же. Я также пытался сделать, как показано в примере здесь , но мой OnConnection
вызывается только один раз с connectMode
, установленным на Startup
.
Обновление 2 Я перепробовал как можно больше комбинаций, перемещая всю инициализацию вокруг. В конце концов, я сдался и начал использовать другой пример, который использует команды вместо простых контекстных меню. Это, вероятно, лучшее решение в долгосрочной перспективе, но мне все еще интересно, почему оригинальный код не работал.