public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
CommandBars cmdBars = (CommandBars)(_applicationObject.DTE.CommandBars);
CommandBar vsBarProject = cmdBars["Project"];
CommandBarPopup menu = vsBarProject.Controls.Add(MsoControlType.msoControlPopup, Missing.Value, Missing.Value, 1, true) as CommandBarPopup;
menu.Caption = "DemoAddIn";
menu.TooltipText = "";
CommandBarControl menuItem = menu.Controls.Add(MsoControlType.msoControlButton, 1, "", 1, true);
menuItem.Tag = "BuildTest";
menuItem.Caption = "BuildTest";
menuItem.TooltipText = "BuildTest";
menuItemHandler = (CommandBarEvents)_applicationObject.DTE.Events.get_CommandBarEvents(menuItem);
menuItemHandler.Click += new _dispCommandBarControlEvents_ClickEventHandler(MenuItem_Click);
}
private void MenuItem_Click(object commandBarControl, ref bool handled, ref bool cancelDefault)
{
_applicationObject.ExecuteCommand("Build.BuildSelection", "");
}
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
{
CommandBars cmdBars = (CommandBars)(_applicationObject.DTE.CommandBars);
CommandBar vsBarProject = cmdBars["Project"];
vsBarProject.Controls["DemoAddIn"].Delete(null);
}
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
CommandBars cmdBars = (CommandBars)(_applicationObject.DTE.CommandBars);
CommandBar vsBarProject = cmdBars["Project"];
CommandBarPopup menu = vsBarProject.Controls.Add(MsoControlType.msoControlPopup, Missing.Value, Missing.Value, 1, true) as CommandBarPopup;
menu.Caption = "DemoAddIn";
menu.TooltipText = "";
CommandBarControl menuItem = menu.Controls.Add(MsoControlType.msoControlButton, 1, "", 1, true);
menuItem.Tag = "BuildTest";
menuItem.Caption = "BuildTest";
menuItem.TooltipText = "BuildTest";
menuItemHandler = (CommandBarEvents)_applicationObject.DTE.Events.get_CommandBarEvents(menuItem);
menuItemHandler.Click += new _dispCommandBarControlEvents_ClickEventHandler(MenuItem_Click);
}
private void MenuItem_Click(object commandBarControl, ref bool handled, ref bool cancelDefault)
{
_applicationObject.ExecuteCommand("Build.BuildSelection", "");
}
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
{
CommandBars cmdBars = (CommandBars)(_applicationObject.DTE.CommandBars);
CommandBar vsBarProject = cmdBars["Project"];
vsBarProject.Controls["DemoAddIn"].Delete(null);
}
上面代码实现的功能是当你在VS 2005中选择一个项目,点击右键出现一个DemoAddin的菜单,选择该菜单中的BuildTest菜单项,会调用编译命令编译当前项目。
在开发时,遇到了这样的问题:
开始时,把menuItemHandler定义局部变量,点击BuildTest菜单项时,有时不执行MenuItem_Click方法,有时第一次点击时执行,但再点击就不执行。
后来把menuItemHandler定义为类的成员变量才解决问题,具体原因目前还不清楚。
完整代码下载:https://files.cnblogs.com/dudu/DemoAddin.rar
如果你想手动添加上面的代码,Visual Studio 2005提供了Visual Studio Add-in模板,在新建项目时选择Other Project Types>Extensibility>Visual Studio Add-in,新建一个Visual Studio Add-in项目,将上面的代码添加到Connect类中。
编译后,将项目文件夹中的DemoAddin.AddIn及DemoAddin.dll复制到VS 2005的Addins文件夹中(默认在“我的文档\Visual Studio 2005\Addins”),然后打开VS 2005,在Tools>Add-in Manager中启用该Add-In,如果想默认启用该Add-in,可以在DemoAddin.AddIn文件中将LoadBehavior改为1。
参考文章:
Explorer - A Visual Studio 2005 add-in which interacts with Windows Explorer