跳至正文
首页 » 博客 » Easily extend your IDE with Extensibility feature for Visual Studio 2015

Easily extend your IDE with Extensibility feature for Visual Studio 2015

Visual Studio 2015是一个非常高级的IDE,具有大量有用的选项,但有时您可能会发现没有足够的功能来满足您的需求。某些操作可能更加自动化,或者您可能希望支持更多项目类型或语言。听起来很熟悉?如果是这样,有一个简单的方法来处理这种情况。

不久前,有宏和加载项,使我们的IDE对开发人员更友好,并满足我们的需求。在Visual Studio 2015中,不再支持这些扩展环境的方法; 而是Visual Studio扩展性 (VSX或VSIX)。这种可能性首先在2005版本中发布,现在已经足够成熟,可以为我们提供构建自己的插件的丰富经验。

由于可扩展性功能,我们可以扩展菜单和命令,创建自定义工具窗口,编辑器,项目模板,扩展用户设置,属性属性窗口,创建Visual Studio独立Shell应用还有更多。基本上,唯一的限制是我们的需求和想象力。在本文中,我们将简要介绍Visual Studio扩展的功能。

要从扩展开发开始,我们需要将Visual Studio与Visual Studio SDK 2015在一起。你可以在这里免费获得Visual Studio社区:Visual Studio社区2015下载。在安装过程中,只需选择Visual Studio扩展性工具它将与IDE的其他部分一起安装。

如果你已经安装了Visual Studio 2015,只需打开它,请转到文件/新项目并扩展Visual C #/扩展性。选择Visual Studio扩展性工具并按照说明进行操作。

MSBuild扩展 (自动自定义生成)

今天我们要做一个简单但仍然非常有用的扩展,它将让我们使用自定义 *.proj文件来使用MSBuild构建解决方案。首先,让我们创建一个VSIX项目。为此,请转到文件/新建/项目,然后选择可扩展性/VSIX项目并指定名称。在这种情况下,它将是CustomBuilder(图1)。

1

Visual Studio已生成一个Visual Studio扩展入门帮助页面。您可以删除这些文件,因为您不需要使用它们 (除非您想阅读它)。删除index.htmlstylesheet.css但保持source.extension.vsixmanifest-我们待会儿用.

添加包

现在我们需要添加一个包,通过添加新项目我们的项目 (图2)。

2

并在添加新项目窗口选择Visual C # 项/扩展性/VSPackage并创建新的Visual Studio包。它的名字CustomBuilderPackage.cs。(图3)

3

添加命令

我们需要在项目中多一个项目-命令。要添加它,请完成与包相同的步骤,但在添加新项目窗口选择自定义命令而不是Visual Studio包。名称将是CustomBuildCommand.cs(图4)

4

加载包装后打开解决方案

我们希望我们的软件包仅在打开解决方案时可用。要限制用户使用选项,请添加属性ProvideAutoLoadCustomBuildPackage类,并在类定义之前添加以下代码 (图5)。

[ProvideAutoLoad (Microsoft.VisualStudio.Shell.Interop. UIContextGuids .SolutionExists)]

公共密封CustomBuildPackage:包装

{

//…

}

5

在custombuildbpackage.vsct中将命令标志

设置为DefaultDisabled在标记: 按钮 (图6):

< 按钮 >


<按钮guid=guidCustomBuildPackageCmdSetid=CustomBuildCommandId优先级=0x0100类型=按钮>


< guid = guidCustomBuildPackageCmdSet id = MyMenuGroup/>


< 图标 guid = guidImages id = bmpPic1/>


<CommandFlag>DefaultDisabled</CommandFlag>


< 字符串 >


< ButtonText > 调用CustomBuildCommand </ButtonText >


</ Strings >


</ 按钮 >


</ 按钮 >

6

命令按钮布局和快捷键

要自定义命令的外观,您可以在中指定一些布局选项CustomBuildPackage.vsct文件。变化<ButtonText>标记来设置将在工具菜单。

图标

您还可以添加一个图标来区分您的插件。第一次添加<GuidSymbol>标记到

<GuidSymbol姓名=cmdIcon={9194BBE0-78F3-45F7-AA25-E4F5FF6D10F9}><IDSymbol姓名=命令=1/></GuidSymbol>

7

生成一个数字到属性,打开工具菜单并选择生成GUID。现在点击5th格式,复制生成的GUID,退出工具并将其粘贴到您的代码中 (图7)。

8

您必须指定要使用的图片。将 *.png文件放在项目目录下的Resources文件夹中 (图标应为16×16像素),并将此代码添加到<位图>节。

<位图><位图guid=cmdIconhref=Resources \ commandIcon.pngusedList=命令/></位图>

现在更改

< 图标 >标签以引用正确的文件:

< 图标 guid = cmdIcon id = commandIcon/>

快捷键

为了使该工具更加用户友好,您可以为其添加快捷键。所有你需要添加的是3行代码之前<符号>标签:

<键绑定><密钥绑定guid=guidCustomBuildPackageCmdSetid=CustomBuildCommandId编辑=guidVSStd97key1=1mod1=控制/></键绑定>

在哪里key1指定字母数字键或VK_constants,mod1是CTRL、ALT和SHIFT中的任意键。

现在我们的命令应该如图9所示。

9

MSBuilder逻辑

扩展看起来像它应该,但它什么也不做。要使其工作,请添加以下类:

使用System.IO;命名空间CustomBuilder

{

公共CustomMsBuilder

{

私有 字符串 solutionPath;


公共 字符串msBuildLocation

{

得到

{

varCurrentruntedirectory = System.Runtime.InteropServices。RuntimeEnvironment。GetRuntimeDirectory();


返回System.IO.路径。合并 (currentRuntimeDirectory,“msbuild.exe”);

}

私人

{ }
}

public CustomMsBuilder( string solutionPath)

{

这个。solutionPath = solutionPath;

}

公共字符串BuildSolution()

{

返回: FormatOutput(StartMsBuildWithOutputString());

}

私有 字符串StartMsBuildWithOutputString()

{

var outputString = ;


使用 (var customBuilder = GetMsBuildProcess())

{

var标准输出 =新建System.Text.StringBuilder();


(!customBuilder.HasExited)

{
standardOutput.Append(customBuilder.StandardOutput.ReadToEnd());
}
outputString = standardOutput.ToString();
}

返回outputString;

}

私人系统。诊断。流程GetMsBuildProcess()

{

varstartInfo =新建系统。诊断。ProcessStartInfo(msBuildLocation, solutionPath);


startInfo.RedirectStandardOutput = true;


startInfo.UseShellExecute = false;


返回系统。诊断。流程。Start(startInfo);

}

私人字符串格式输出 (字符串processedOutput)

{

字符串解决方案名称 =路径。GetFileName(solutionPath);


var页眉 =“CustomBuilder-生成”解决方案名称“\ r \ n — \ r \ n”;


返回头processedOutput;

}
}
}

此类运行MSBuild.exe进程,构建打开的解决方案从自定义 *.proj文件 (如果项目包含任何),格式和重定向输出的MSBuild.exe进程,它可以显示给用户从我们的扩展。

该构造函数接受一个字符串与解决方案的路径,并将其存储在一个字段,所以它可以读它以后在一个合适的方法。

公共方法BuildSolution()获取正确的MSBuild路径 (使用属性的gettermsBuildLocation),将解决方案路径作为参数启动msbuild.exe进程,从控制台读取输出 (使用字符串生成器),并返回带标题 “CustomBuilder – Build – <解决方案名称>” 的格式化结果。

CustomMSBuilder类完成后,应该从CustomBuildCommand调用它。在CustomBuildCommand中,您必须更新回调函数,如上所示:

使用添加一个:

使用EnvDTE80;

更改回调名称:

私人CustomBuildCommand (包装包装)

{

//…

var menuItem = MenuCommand (that .CustomBuildCallback ,menuCommandID );

commandService.AddCommand(menuItem);
}
}

更改回调函数并添加一个额外的:

私有 void CustomBuildCallback( 对象sender, EventArgs e)

{

var cMsBuilder = CustomMsBuilder (GetSolutionPath());


varoutputMessage = cMsBuilder.BuildSolution();

WriteToOutputWindow(outputMessage);


// 显示输出-我们将创建此方法在下一步

}

公共字符串GetSolutionPath()

{

DTE2 dte = ServiceProvider.GetService( typeof (SDTE )) 作为 DTE2;


返回dte.Solution.FullName ??“”;

}

输出

我们可以在输出窗口中显示结果 (与Visual Studio通知生成解决方案是否成功的方式相同)。为此,请将以下代码添加到CustomBuildCommand.cs文件 (位于现有方法的正下方)。

private void writetooutputwindows (string消息)

{

varpane = GetOutputPane(PaneGuid,“CustomBuilder输出”,,、消息);窗格.OutputString (消息“\ n-“);


pane.Activate(); // 激活新窗格以显示输出我们刚刚添加。

}

私人IVsOutputWindowPaneGetOutputPane (GuidpaneGuid,字符串标题,bool可见,boolclearWithSolution,字符串消息)

{

IVsOutputWindow输出 = (IVsOutputWindow) ServiceProvider.GetService (typeof(SVsOutputWindow));IVsOutputWindowPane窗格;


输出.CreatePane (参考paneGuid,标题,转换.ToInt32 (可见),转换.ToInt32(clearWithSolution));


output.GetPane (参考paneGuid,窗格);


返回窗格;

}

我们还需要生成新的guid并将其分配给一个变量在开始我们的文件:

命名空间CustomBuilder

{

内部密封CustomBuildCommand

{

//…

公共静态只读GuidCommandSet =新建Guid(“84a7d8e5-400d-40d4-8d92-290975ef8117”);


///…

}
}

分布

在你完成你的扩展的开发,你确定它工作正常 (仔细检查!),你可以与其他开发人员轻松共享扩展。首先,你必须开源.extension.vsixmanifest并指定一些关于你的扩展的信息。您应填写所有元数据信息、目标版本的Visual Studio、依赖项和其他已知信息。

10

有两种受支持的方式来分发您的扩展。首先,您可以共享您的Visual Studio扩展的 *.vsix二进制文件-例如通过电子邮件发送,发送链接到ftp/云或分发你的愿望。您可以在解决方案的bin/Release文件夹中找到该文件 (如果您构建了扩展的发布版本)。所有收件人要做的就是下载文件,关闭Visual Studio,双击文件并使用安装向导,这是直接的。

Visual Studio库

如果要接触更多的Visual Studio用户,还可以在Visual Studio库中发布扩展。这样做需要几个步骤:

登录到Visual Studio库使用您的Microsoft帐户的网站。选择 “上传” 屏幕上的选项,并创建一个MSDN配置文件,如果你没有任何。指定您的显示名称,同意使用条款并单击继续按钮。

在接下来的几个屏幕上,你必须输入一些关于你的扩展的信息,如扩展类型-无论是工具,控件,模板还是故事板形状 (仅适用于PowerPoint,因此不在这里)。

指定插件的类型后,您可以选择存储 *.vsix文件的位置。您可以将其上传到Microsoft服务器或共享指向Internet中某个自定义位置的链接 (例如,如果您拥有自己的服务器)。

上传 (或链接) 正确的扩展名后,您可以添加基本信息。其中一些是根据我们的source.extension.vsixmanifest从项目中,如标题,版本摘要。您可以选择类别并添加一些标签,以帮助用户轻松找到您的扩展。在成本类别中,您可以指定是否要出售您的扩展 (审判已付选项) 或提供免费。这里包含的一个非常好的功能是,如果您想让用户浏览您的代码,可以选择共享代码存储库的链接。

您还必须提供有关您的插件的更多信息。在描述字段您可以使用给定的模板或创建自己的扩展文档。可以包含视频和图像,以便您可以充分展示您的插件。

以后您必须同意贡献协议 ,方法是选中该框并单击 “ 创建贡献 ” 按钮。

保存进程后,您的扩展尚未发布,但您可以编辑、删除、翻译发布你的项目最终让它活着。

现在很容易在Visual Studio库网站或在扩展和更新在Visual Studio中,键入在上载项目时指定的名称或关键字。

摘要

如您所见,Visual Studio 2015中的可扩展性功能非常简单明了。您可以创建一个项目,就像在Visual Studio中创建一个简单的控制台应用程序一样,您也可以共享它,轻松扩展IDE的功能。

要构建您的桌面、移动或web应用程序以实现高性能控制? 下载终极免费试用 今天或 联系我们 ,看看它可以为你做。

</p