Go homepage(回首页) Upload pictures (上传图片) Write articles (发文字帖)
The author:(作者)delvpublished in(发表于) 2014/1/27 6:51:29 手把手教你制作vs2005装饰_[Asp.Net教程]
1 /**//// 实现 IDTExtensibility2 接口的 OnConnection 方法。接收正在加载外接程序的通知。 2 /// 宿主应用程序的根对象。 3 /// 描述外接程序的加载方式。 4 /// 表示此外接程序的对象。 5 /// 6 public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) 7 { 8 _applicationObject = (DTE2)application; 9 _addInInstance = (AddIn)addInInst;10 if (connectMode == ext_ConnectMode.ext_cm_UISetup)11 {12 object[] contextGUIDS = new object[] { };13 Commands2 commands = (Commands2)_applicationObject.Commands;14 string toolsMenuName = "工具";15 16 //将此命令置于“工具”菜单上。17 //查找 MenuBar 命令栏,该命令栏是容纳所有主菜单项的顶级命令栏:18 Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];1920 //在 MenuBar 命令栏上查找“工具”命令栏: 21 CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];22 23 24 CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;2526 //如果希望添加多个由您的外接程序处理的命令,可以重复此 try/catch 块,27 // 只需确保更新 QueryStatus/Exec 方法,使其包含新的命令名。28 try29 {30 //将一个命令添加到 Commands 集合:31 Command command = commands.AddNamedCommand2(_addInInstance, "RecentProjectCleaner", "RecentProjectCleaner", "Executes the command for RecentProjectCleaner", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);3233 //将对应于该命令的控件添加到“工具”菜单:34 if ((command != null) && (toolsPopup != null))35 {36 command.AddControl(toolsPopup.CommandBar, 10); 37 }38 }39 catch (System.ArgumentException)40 {41 //如果出现此异常,原因很可能是由于具有该名称的命令42 // 已存在。如果确实如此,则无需重新创建此命令,并且43 // 可以放心忽略此异常。44 }45 }46 }
执行命令的操作添加到Exec中,
Exec/**//// 实现 IDTCommandTarget 接口的 Exec 方法。此方法在调用该命令时调用。 /// 要执行的命令的名称。 /// 描述该命令应如何运行。 /// 从调用方传递到命令处理程序的参数。 /// 从命令处理程序传递到调用方的参数。 /// 通知调用方此命令是否已被处理。 /// public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled) { handled = false; if (executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault) { if (commandName == "RecentProjectCleaner.Connect.RecentProjectCleaner") { DialogResult dr = MessageBox.Show("确定要清除最近项目列表么?", "询问", MessageBoxButtons.YesNo); if (dr == DialogResult.Yes) { Microsoft.Win32.RegistryKey regisKey = Microsoft.Win32.Registry.CurrentUser; Microsoft.Win32.RegistryKey key = regisKey.OpenSubKey("Software", true); if (key != null) { key = key.OpenSubKey("Microsoft", true); if (key != null) { key = key.OpenSubKey("VisualStudio", true); } if (key != null) { key = key.OpenSubKey("8.0", true); } if (key != null) { key = key.OpenSubKey("ProjectMRUList", true); } if (key != null) { foreach (string p in key.GetValueNames()) { key.DeleteValue(p, false); } } MessageBox.Show("清除成功,重新启动vs后生效!"); } } handled = true; return; } } }
在程序卸载的时候,卸载菜单项
1 /**//// 实现 IDTExtensibility2 接口的 OnDisconnection 方法。接收正在卸载外接程序的通知。 2 /// 描述外接程序的卸载方式。 3 /// 特定于宿主应用程序的参数数组。 4 /// 5 public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) 6 { 7 object[] contextGUIDS = new object[] { }; 8 Commands2 commands = (Commands2)_applicationObject.Commands; 9 string toolsMenuName= "工具"; 10 //将此命令置于“工具”菜单上。11 //查找 MenuBar 命令栏,该命令栏是容纳所有主菜单项的顶级命令栏:12 Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];1314 //在 MenuBar 命令栏上查找“工具”命令栏: 15 CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];161718 CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;1920 //如果希望添加多个由您的外接程序处理的命令,可以重复此 try/catch 块,21 // 只需确保更新 QueryStatus/Exec 方法,使其包含新的命令名。22 try23 {24 //将一个命令添加到 Commands 集合:25 Command command = commands.AddNamedCommand2(_addInInstance, "RecentProjectCleaner", "RecentProjectCleaner", "Executes the command for RecentProjectCleaner", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);2627 //将对应于该命令的控件添加到“工具”菜单:28 if ((command != null) && (toolsPopup != null))29 {30 command.Delete();31 }32 }33 catch (System.ArgumentException)34 {35 //如果出现此异常,原因很可能是由于具有该名称的命令36 // 已存在。如果确实如此,则无需重新创建此命令,并且37 // 可以放心忽略此异常。38 }39 }
这样一个非常简单的vs2005addins就制作成功了,接下来您就可以将该程序部署到你的倚天剑上了,部署方法超级简单,和vs03不同的是,05支持xcopy部署,您可以将RecentProjectCleaner.AddIn和生成的RecentProjectCleaner.dll拷贝到C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Addins,就完成了addins的部署,值得说下的是RecentProjectCleaner.AddIn,这个文件描述了vs2005应该如何认识新增的伙计,它里面定义了宿主应用程序的信息(名称,版本)和addins的信息(所在程序集,类名,加载方式),如果您想在部署后让addins立即被启用,将LoadBehavior设置为1,还有不知道是我本地项目模板的问题还是其他原因,默认创建的RecentProjectCleaner.AddIn里面的Assembly多了.dll。也就是RecentProjectCleaner.dll,这样的dll显然不存在,去掉一个.dll,就可以了看下部署后的效果吧:重新启动vs2005,点击工具,菜单就多了一项:RecentProjectCleaner,如图点击外接程序管理器,可以多了一项RecentProjectCleaner在菜单中点击RecentProjectCleaner,选择清除,重启vs2005,最近列表项就清除了。这里是源程序,这里只是一个的介绍,大家可以下载下去扩展,很好玩/Files/jillzhang/RecentProjectCleaner.rar来源:jillzhang的专栏
赞