前几天写了个小插件,发了个bog,说要把过程写出来,今天来个看图说话吧。
1、使用VS2005。创建新项目,选择Visual Studio 外接程序模版。
2、VS2005会启动外接程序向导
3、选择语言C#
4、选择应用主机
5、起个名字
6、选择界面,第一项打勾,向导会帮我们生成在“工具”菜单下增加我们自定义的子菜单的代码
7、关于对话框,要不要两可
8、到此完成
向导运行完毕,VS2005自动添加了一系列文件,最主要的就是Connect.cs,我们的自定义代码都要写在这个文件中。另外还有一个资源文件,在查找菜单项时使用,从而可以增加多语言支持。
下面是主要代码,请注意其中的黑体部分。
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"
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 |