看图说话,编写VS2005插件,增强VS2005 IDE


 
前几天写了个小插件,发了个bog,说要把过程写出来,今天来个看图说话吧。


 

1、使用VS2005。创建新项目,选择Visual Studio 外接程序模版。

  1

2、VS2005会启动外接程序向导

2

3、选择语言C#

3

4、选择应用主机

 4

5、起个名字

 5

6、选择界面,第一项打勾,向导会帮我们生成在“工具”菜单下增加我们自定义的子菜单的代码

 6

7、关于对话框,要不要两可

 7

8、到此完成

 8

向导运行完毕,VS2005自动添加了一系列文件,最主要的就是Connect.cs,我们的自定义代码都要写在这个文件中。另外还有一个资源文件,在查找菜单项时使用,从而可以增加多语言支持。

 9

下面是主要代码,请注意其中的黑体部分。

        public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
        {
            _applicationObject = (DTE2)application;
            _addInInstance = (AddIn)addInInst;
            if(connectMode == ext_ConnectMode.ext_cm_UISetup)
            {
                object []contextGUIDS = new object[] { };
                Commands2 commands = (Commands2)_applicationObject.Commands;
                string toolsMenuName;

                try
                {
                    //若要将此命令移动到另一个菜单,则将“工具”一词更改为此菜单的英文版。
                    //  此代码将获取区域性,将其追加到菜单名中,然后将此命令添加到该菜单中。
                    //  您会在此文件中看到全部顶级菜单的列表
                    //  CommandBar.resx.
                    ResourceManager resourceManager = new ResourceManager("CodeFormater.CommandBar", Assembly.GetExecutingAssembly());
                    CultureInfo cultureInfo = new System.Globalization.CultureInfo(_applicationObject.LocaleID);
                    //注意这里要做一下修改,VS2005向导生成的代码有点小问题
                    //这是根据CultureInfo在资源文件中查找"工具"菜单的名称.
                    //注意到CommandBar.resx资源文件中,我们采用的中文版vs2005,"工具"对应的名称是"zh-CHSTools"

                    10

                    string resourceName;
                    if (cultureInfo.TwoLetterISOLanguageName == "zh")
                    {
                        resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "-", cultureInfo.ThreeLetterWindowsLanguageName, "Tools");
                    }
                    else
                    {
                        resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
                    }
                    toolsMenuName = resourceManager.GetString(resourceName);

                }
                catch
                {
                    //我们试图查找“工具”一词的本地化版本,但未能找到。
                    //  默认值为 en-US 单词,该值可能适用于当前区域性。
                    toolsMenuName = "Tools";
                }

                //将此命令置于“工具”菜单上。
                //查找 MenuBar 命令栏,该命令栏是容纳所有主菜单项的顶级命令栏:
                Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];

                //在 MenuBar 命令栏上查找“工具”命令栏:
                CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
                CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;

                //如果希望添加多个由您的外接程序处理的命令,可以重复此 try/catch 块,
                //  只需确保更新 QueryStatus/Exec 方法,使其包含新的命令名。
                try
                {
                    //将一个命令添加到 Commands 集合:
                    Command command = commands.AddNamedCommand2(_addInInstance, "CodeFormater", "CodeFormater", "格式化选中代码的格式", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);

                    //将对应于该命令的控件添加到“工具”菜单:
                    if((command != null) && (toolsPopup != null))
                    {
                        command.AddControl(toolsPopup.CommandBar, 1);
                    }
                }
                catch(System.ArgumentException)
                {
                    //如果出现此异常,原因很可能是由于具有该名称的命令
                    //  已存在。如果确实如此,则无需重新创建此命令,并且
                    //  可以放心忽略此异常。
                }
            }
        }

 

 

 

        /// <summary>实现 IDTCommandTarget 接口的 Exec 方法。此方法在调用该命令时调用。</summary>
        /// <param term='commandName'>要执行的命令的名称。</param>
        /// <param term='executeOption'>描述该命令应如何运行。</param>
        /// <param term='varIn'>从调用方传递到命令处理程序的参数。</param>
        /// <param term='varOut'>从命令处理程序传递到调用方的参数。</param>
        /// <param term='handled'>通知调用方此命令是否已被处理。</param>
        /// <seealso class='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 == "CodeFormater.Connect.CodeFormater")
                {

                    //在这里就可以实现自己的逻辑来扩展VS2005的功能了,这里我自己写了个很简单的类,来帮我处理代码对齐功能
                   
                    string selectedCode = ((TextSelection)_applicationObject.ActiveDocument.Selection).Text;
                    string outCode = CodeSmart.AlignText(selectedCode, "=");            //对齐选中文本中的"="
                    outCode = CodeSmart.AlignText(outCode, "//");                              //对齐选中文本中的"//"
                    ((TextSelection)_applicationObject.ActiveDocument.Selection).Insert(outCode, (int)vsInsertFlags.vsInsertFlagsCollapseToEnd);


                    handled = true;
                    return;
                }
            }
        }

编译,运行,你就会看到一个新的VS2005启动了,工具菜单下多了一个CodeFormate菜单,就这样,一个简单的VS2005插件就做好了。过程是这样,你还可以编写其他的逻辑来实现你自己想要的功能。

源代码下载:

CodeFormater_src.rar 45KB 0 2008/4/9 21:26:03 Download

插件下载:

CodeFormater.zip 10KB 154 2008/4/7 20:48:19 Download

作者:峻祁连
邮箱:junqilian@163.com
出处:http://junqilian.cnblogs.com
转载请保留此信息。
原文地址:https://www.cnblogs.com/junqilian/p/1145733.html