看图说话,编写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 
转载请保留此信息。




本文转自峻祁连. Moving to Cloud/Mobile博客园博客,原文链接:http://www.cnblogs.com/junqilian/archive/2008/04/09/1145733.html ,如需转载请自行联系原作者
相关文章
|
2月前
|
IDE API 开发工具
通过IDE插件体验阿里云OpenAPI的高效集成, 精品礼品等你来拿!
轻量级的开放API工具——Alibaba Cloud Developer Toolkit及Alibaba Cloud API Toolkit。这些插件支持快速查阅阿里云产品的开放API,提供API调试与SDK示例生成等功能,帮助开发者轻松集成阿里云服务。您可通过JetBrains Marketplace或VS Code Marketplace搜索安装,完成身份验证后即刻体验。欢迎分享您的使用反馈,有机会获得精美礼品!
|
5月前
|
人工智能 IDE API
灵动指尖 :阿里云智能编码插件 更好的为IDE内置社区服务
灵动指尖 :阿里云智能编码插件 更好的为IDE内置社区服务
880 0
|
IDE JavaScript 前端开发
50+VSCode插件,帮你打造地表最强IDE!(二)
50+VSCode插件,帮你打造地表最强IDE!
295 0
|
传感器 JSON 人工智能
50+VSCode插件,帮你打造地表最强IDE!(一)
50+VSCode插件,帮你打造地表最强IDE!
326 0
|
安全 IDE Java
滚蛋吧,安全漏洞——这款 IDE 插件帮你轻松解决安全问题,核心引擎已开源
滚蛋吧,安全漏洞——这款 IDE 插件帮你轻松解决安全问题,核心引擎已开源
滚蛋吧,安全漏洞——这款 IDE 插件帮你轻松解决安全问题,核心引擎已开源
|
XML IDE Java
Eclipse中 Spring Tool 插件 Spring IDE-STS
Eclipse中 Spring Tool 插件 Spring IDE-STS
212 0
Eclipse中 Spring Tool 插件 Spring IDE-STS
|
IDE 程序员 编译器
VS2019正确创建C++步骤以及扩展插件美化你的VS2019的IDE开发环境
VS2019正确创建C++步骤以及扩展插件美化你的VS2019的IDE开发环境
VS2019正确创建C++步骤以及扩展插件美化你的VS2019的IDE开发环境
|
机器学习/深度学习 人工智能 IDE
IDE AI 自动补全插件 TabNine
TabNine 是一个自动补全的编码插件,不同于一般的自动补全插件,它使用了深度学习 来帮助我们补全代码。并且开箱即用,不需要额外配置。
IDE AI 自动补全插件 TabNine
|
IDE 安全 Java
硬核,这 3 款 IDE 插件让你的代码牢不可破(2)
硬核,这 3 款 IDE 插件让你的代码牢不可破
221 0
硬核,这 3 款 IDE 插件让你的代码牢不可破(2)
|
IDE Java 开发工具
硬核,这 3 款 IDE 插件让你的代码牢不可破(1)
硬核,这 3 款 IDE 插件让你的代码牢不可破
153 0
硬核,这 3 款 IDE 插件让你的代码牢不可破(1)