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.html和stylesheet.css但保持source.extension.vsixmanifest-我们待会儿用.
添加包
现在我们需要添加一个包,通过添加新项目我们的项目 (图2)。
图2
并在添加新项目窗口选择Visual C # 项/扩展性/VSPackage并创建新的Visual Studio包。它的名字CustomBuilderPackage.cs。(图3)
图3
添加命令
我们需要在项目中多一个项目-命令。要添加它,请完成与包相同的步骤,但在添加新项目窗口选择自定义命令而不是Visual Studio包。名称将是CustomBuildCommand.cs(图4)
图4
加载包装后打开解决方案
我们希望我们的软件包仅在打开解决方案时可用。要限制用户使用选项,请添加属性ProvideAutoLoad到CustomBuildPackage类,并在类定义之前添加以下代码 (图5)。
[ProvideAutoLoad (Microsoft.VisualStudio.Shell.Interop. UIContextGuids .SolutionExists)]
公共密封类CustomBuildPackage:包装
{
//…
}
图5
在custombuildbpackage.vsct中将命令标志
设置为DefaultDisabled,在标记: 按钮 (图6):
< 按钮 >
<按钮guid=“guidCustomBuildPackageCmdSet“id=“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=“cmdIcon“href=“Resources \ commandIcon.png“usedList=“命令“/></位图>
现在更改
< 图标 > 的标签以引用正确的文件:
< 图标 guid = “cmdIcon“ id = “commandIcon“/>
快捷键
为了使该工具更加用户友好,您可以为其添加快捷键。所有你需要添加的是3行代码之前<符号>标签:
<键绑定><密钥绑定guid=“guidCustomBuildPackageCmdSet“id=“CustomBuildCommandId“编辑=“guidVSStd97“key1=“1“mod1=“控制“/></键绑定>
在哪里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());
var的outputMessage = 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的功能。