我正在尝试使用视觉工作室插件,并且遇到了非常奇怪的行为。我正在添加一个右键单击上下文菜单项,我没有让事件触发除非我在OnConnect
方法中放置一个断点并等待一段时间。我的表现与this article完全一样。
这是一个完全标准的加载项,代码如下:
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
中添加相同的初始化代码。结果是一样的。我还尝试按照here显示的示例进行操作,但OnConnection
仅在connectMode
设置为Startup
时调用一次。
更新2 我尝试了尽可能多的这种组合,移动所有初始化。最后,我放弃并开始使用另一个使用命令而不是普通上下文菜单的示例。从长远来看,这可能是一个更好的解决方案,但我仍然对原始代码不起作用的原因感兴趣。
答案 0 :(得分:2)
将这些变量设为全局:
CommandBarEvents commandBarEvents;
CommandBar commandBars;
CommandBarControl popup;
如果在OnConnection中创建这些对象,则一旦代码超出范围,它们就会被释放。