可以向 Visual Studio 添加功能。通过创建 VSPackage。 由于 VSPackage 是软件,可将它分配给其他人,以便他们可以在自己的扩展 Visual Studio 的计算机。
使用 Visual Studio 包模板,可以使已具有源文件和配置文件需要创建 VSPackage 的项目。 该项目包含定义类中名为的文件在创建项目时。 此类,从托管包框架类 (MPF)派生一个名为 Package,包括确定中的属性 VSPackage 如何在 Visual Studio 应工作。 包类还包含初始化代码和其他代码 (如菜单命令处理程序。 此类是 VSPackage 的基础。
此演练介绍如何创建 VSPackage 并对其进行自定义,如下所示:
使用包模板,创建 VSPackage。
实现菜单命令处理程序。
添加个键盘快捷键。
添加自定义信息到 Visual Studio 初始屏幕和 有关 对话框。
本演练是了解如何扩展 Visual Studio 集成开发环境 (ide) 系列的一部分 (IDE)。 有关更多信息,请参见 自定义的 Visual Studio 演练使用 Vspackage。
系统必备
若要完成本演练,您必须安装 Visual Studio 2010 SDK。
备注
有关 Visual Studio SDK 的更多信息,请参见 扩展 Visual Studio 概述。若要查找有关中所列如何下载 Visual Studio SDK,请 Visual Studio Extensibility Developer Center 参见 MSDN 网站上。
Visual Studio 包模板位置
Visual Studio 包模板可以在 新项目 对话框的以下位置找到:
在 Visual Basic 扩展性下。 该项的默认语言是 Visual Basic。
在 C# 扩展性下。 该项目的默认语言是 C#。
在其他项下键入扩展性。 该项的默认语言是 C++。
使用创建包模板的 VSPackage
本节演示如何在 Visual Studio 中创建 VSPackage 解决方案。
创建一个基本的 VSPackage 解决方案
使用 Visual Studio 包 " 项目模板,创建 VSPackage。
在 " 欢迎 " 页上,单击 接下来。
在 选择一种编程语言 页上,选择的 Visual C# 或 Visual Basic,选择 " 生成一个新密钥文件对程序集进行签名,然后单击 接下来。
在 基本的 VSPackage 信息 页,在 VSPackage 名称框中,键入 FirstPackage,并接受剩余的默认选项。 公司名称和项目名称将创建包的命名空间。
单击**“下一步”**。
在 选择 VSPackage 选项 页上,选择的 菜单命令,然后单击 接下来。
在 命令选项 页上,在 命令名 框中,键入 第一个命令。 (此文本将显示在 Visual Studio 中的菜单。)在 命令 ID 框中,键入 cmdidFirstCommand。 (此标识符用于代码标识该命令。)
单击**“下一步”**。
在 选择测试选项 页上,单击 完成。
模板创建具有基本功能的 Visual Studio 项目。 可以通过按 F5 尝试它,也称为在调试模式 (实验性生成下生成项目并将其打开在另一个 Visual Studio 实例 Visual Studio)。
备注
当您首次时生成项目, Visual Studio 可能看似停止响应,并且您可能会收到消息 Visual Studio 忙状态。请忽略该消息,并一直等到 Visual Studio 将打开,并且包加载。
在实验性生成,在 工具 菜单,则应将名为 第一个命令 的命令。 第一个命令的名称是您在模板的 命令选项 页键入的通知。
单击 第一个命令。 类似于下面的消息应显示。
检查菜单命令处理程序
显示的消息,在 工具 菜单中单击 第一个命令 来自该处理程序中的代码菜单命令的。 此处理程序是在 FirstPackage.cs 或 FirstPackage.vb 文件。
检查菜单项处理程序
在 解决方案资源管理器,打开 FirstPackage.cs 或 FirstPackage.vb。
查找 FirstPackage 类。 FirstPackage 类的定义如下。
Public NotInheritable Class FirstPackage Inherits Package
public sealed class FirstPackage : Package
通知类从 MPF Package 类派生。
查找菜单处理程序的代码,请 MenuItemCallback 方法实现。 菜单处理程序函数是典型的 windows 窗体事件处理程序方法。
Private Sub MenuItemCallback(ByVal sender As Object, ByVal e As EventArgs) ' Show a Message Box to prove we were here Dim uiShell As IVsUIShell = TryCast(GetService(GetType(SVsUIShell)), IVsUIShell) Dim clsid As Guid = Guid.Empty Dim result As Integer Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(uiShell.ShowMessageBox(0, clsid, "FirstPackage", String.Format(CultureInfo.CurrentCulture, "Inside {0}.MenuItemCallback()", Me.GetType().Name), String.Empty, 0, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_INFO, 0, result)) End Sub
private void MenuItemCallback(object sender, EventArgs e) { IVsUIShell uiShell = (IVsUIShell)GetService(typeof(SVsUIShell)); Guid clsid = Guid.Empty; int result; Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure( uiShell.ShowMessageBox( 0, ref clsid, "FirstPackage", string.Format(CultureInfo.CurrentCulture, "Inside {0}.MenuItemCallback()", this.ToString()), string.Empty, 0, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_INFO, 0, out result)); }
添加键盘快捷键
默认情况下,是由包模板创建的菜单命令没有快捷键。 可以将其添加到第一个命令。
添加默认键盘快捷键
在 解决方案资源管理器,打开 First.vsct。
文件在 Visual Studio 中的 XML 编辑器中打开。
查找命令元素的末尾,由 </Commands> 标记指示。
将 </Commands> 标记和 <Symbols> 标记之间添加以下行。
<KeyBindings> <KeyBinding guid="guidFirstCmdSet" id="cmdidFirstCommand" editor="guidVSStd97" key1="M" mod1="(control shift)"/> </KeyBindings>
此 KeyBinding 元素具有特性。 guid 和 id 属性确定哪个命令将接收键盘快捷键。 GUID 为 VSPackage 的 GUID,并且, id 与您键入的顺序标识符,则当运行该模板。 这两个符号在符号部分定义,如下所示。
<Symbols> <GuidSymbol name="guidFirstCmdSet" value="{600efde8-1f5e-4df5-bc22-06074a411975}"> <IDSymbol name="cmdidFirstCommand" value="0x0100" /> </GuidSymbol>
表示一个上下文键盘快捷方式时可用 editor 属性的值是 GUID。 在 Visual Studio 中,个键盘快捷键绑定到命令的控件作用于特定窗口或使全局 (即所有可用在 Visual Studio)。 例如,在文本编辑器中, CTRL+I 可能运行渐进式搜索命令,但是,在 解决方案资源管理器, CTRL+I 没有键绑定;因此, CTRL+I 只有在文本编辑器。 在本演练中,键盘快捷方式设计是全局的。 因此,编辑属性的值为 guidVSStd97,是值以个键盘快捷键全局。
key1 和 mod1 属性设置必须以激活键盘快捷键和修饰符。 对于 key1 的值,键盘上的所有键可在符号形式,例如, “M”为字母 M 和 “VK_F5”为功能键 F5。 mod1 的值可以是 “Alt”, “控件”,或者 “转换”,由空格分隔,任意组合。
在本演练中, key1 的值是 M ,并 mod1 的值为 (Control Shift)。 因此,键盘快捷键 CTRL+SHIFT+M。
在**“调试”菜单上,单击“开始执行(不调试)”**。
在 Visual Studio 的实验生成,在 工具 菜单,应在 第一个命令旁显示 CTRL+SHIFT+M。
按 CTRL+SHIFT+M。 您应看到显示相同的消息在 工具 菜单中单击 第一个命令 。
有关 .vsct 文件的更多信息,请参见 VSCT XML 架构参考。
添加自定义信息添加到对话框
在 有关 对话框中包括图标以及有关包。 为此,必须对解决方案进行以下更改:
修改主 VSPackage 类的 InstalledProductRegistrationAttribute 参数。
实现主要 VSPackage 类的 IVsInstalledProduct 接口。
将图标添加到 resources 文件夹。
引用在 VSPackage.resx 文件的图标。
主 VSPackage 类在何处使用 InstalledProductRegistration 属性指定找到 有关 对话框的信息。 在本演练中,主类名为 FirstPackage,因此,可以将其打开 FirstPackage.cs 或 FirstPackage.vb 修改。
新项目模板生成以下 InstalledProductRegistration 属性。
<InstalledProductRegistration( false, "#110", "#112", "1.0", IconResourceID := 400)>
[InstalledProductRegistration( false, "#110", "#112", "1.0", IconResourceID = 400)]
资源 ID “#110”和 “#112”如下指 VSPackage.resx 文件中定义的字符串资源,例如:
110 引用 FirstPackage
112 是指关于 " 我的 VSPackage 的信息
IconResourceID 400 指资源文件夹的 Package.ico 文件,在 VSPackage.resx 文件的定义如下。
<data name="400" type="System.Resources.ResXFileRef,
System.Windows.Forms">
<value>Resources\Package.ico;System.Drawing.Icon, System.Drawing,
Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a
</value>
</data>
若要自定义 有关 对话框中,将 InstalledProductRegistration 属性的第一个参数分配 true,因此, VSPackage 可以通过 IVsInstalledProduct 接口提供相应信息。
添加自定义信息到初始屏幕和对话框
打开 FirstPackage.cs 或 FirstPackage.vb,查找 InstalledProductRegistration 属性,并如下更改其参数。
InstalledProductRegistration(True, Nothing, Nothing, Nothing)
[InstalledProductRegistration(true, null, null, null)]
从包和 IVsInstalledProduct 派生 FirstPackage 类。
Public NotInheritable Class FirstPackage Inherits Package Implements IVsInstalledProduct
public sealed class FirstPackage : Package, IVsInstalledProduct
请隐式实现 IVsInstalledProduct 接口。 此步骤对于 C# 和 Visual Basic 不同。
在 c# 中,请将鼠标指针悬停隐式实现 IVsInstalledProduct 接口。 IVsInstalledProduct的中。 当 IntelliSense 菜单出现时,单击第一项。
执行此操作添加以下存根方法。 FirstPackage 类。 在后面的步骤中,您将填充方法。
public int IdBmpSplash(out uint pIdBmp) { throw new NotImplementedException(); } public int IdIcoLogoForAboutbox(out uint pIdIco) { throw new NotImplementedException(); } public int OfficialName(out string pbstrName) { throw new NotImplementedException(); } public int ProductDetails(out string pbstrProductDetails) { throw new NotImplementedException(); } public int ProductID(out string pbstrPID) { throw new NotImplementedException(); }
在 Visual Basic 中,将以下代码添加到 FirstPackage 类的底部。 在后面的步骤中,您将填充方法。
Function ProductDetails( _ <OutAttribute()> ByRef pbstrProductDetails As String) _ As Integer End Function Public Function IdBmpSplash(ByRef pIdBmp As UInteger) As Integer Implements Microsoft.VisualStudio.Shell.Interop.IVsInstalledProduct.IdBmpSplash End Function Public Function IdIcoLogoForAboutbox(ByRef pIdIco As UInteger) As Integer Implements Microsoft.VisualStudio.Shell.Interop.IVsInstalledProduct.IdIcoLogoForAboutbox End Function Public Function OfficialName(ByRef pbstrName As String) As Integer Implements Microsoft.VisualStudio.Shell.Interop.IVsInstalledProduct.OfficialName End Function Public Function ProductID(ByRef pbstrPID As String) As Integer Implements Microsoft.VisualStudio.Shell.Interop.IVsInstalledProduct.ProductID End Function
将 Visual Studio SDK installation path\Common7\IDE\NewFileItems 的 Icon.ico 并将其粘贴到包中解决方案的资源文件夹。
在 解决方案资源管理器,右击资源文件夹,指向 添加,然后单击 现有项目。 将文件类型筛选器将 所有文件 (*.*) 然后添加 Icon.ico。
在 解决方案资源管理器,右击 VSPackage.resx,然后单击 打开。。 选择 XML 编辑器 然后单击 好 打开 XML 编辑器中的文件。
添加在最终 </root> 标记前面的代码行。
<data name="500" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>Resources\GenericPackage.ico; System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a </value> </data>
此标记声明 Icon.ico 作为资源 ID 500。
使用以下代码,以便 FirstPackage.cs 或 FirstPackage.vb,请替换 IVsInstalledProduct 接口的实现。
Public Function ProductDetails(ByRef pbstrProductDetails As String) As Integer Implements IVsInstalledProduct.ProductDetails pbstrProductDetails = "This is my package" Return Microsoft.VisualStudio.VSConstants.S_OK End Function Public Function IdBmpSplash(ByRef pIdBmp As UInteger) _ As Integer Implements IVsInstalledProduct.IdBmpSplash Return Microsoft.VisualStudio.VSConstants.S_OK End Function Public Function IdIcoLogoForAboutbox(ByRef pIdIco As UInteger) _ As Integer Implements IVsInstalledProduct.IdIcoLogoForAboutbox pIdIco = 600 Return Microsoft.VisualStudio.VSConstants.S_OK End Function Public Function OfficialName(ByRef pbstrName As String) _ As Integer Implements IVsInstalledProduct.OfficialName pbstrName = "My Package" Return Microsoft.VisualStudio.VSConstants.S_OK End Function Public Function ProductID(ByRef pbstrPID As String) _ As Integer Implements IVsInstalledProduct.ProductID pbstrPID = "My Package ID" Return Microsoft.VisualStudio.VSConstants.S_OK End Function
public int IdBmpSplash(out uint pIdBmp) { return Microsoft.VisualStudio.VSConstants.S_OK; } public int IdIcoLogoForAboutbox(out uint pIdIco) { pIdIco = 500; return Microsoft.VisualStudio.VSConstants.S_OK; } public int OfficialName(out string pbstrName) { pbstrName = "My Package"; return Microsoft.VisualStudio.VSConstants.S_OK; } public int ProductDetails(out string pbstrProductDetails) { pbstrProductDetails = "This is my package"; return Microsoft.VisualStudio.VSConstants.S_OK; } public int ProductID(out string pbstrPID) { pbstrPID = "My Package ID"; return Microsoft.VisualStudio.VSConstants.S_OK; }
第二种方法返回图标的资源 ID。 剩下的三个函数返回名称、产品详细信息和产品号,因此,它们将出现在 有关 对话框。
通过完成以下过程测试更改。
测试初始屏幕和有关自定义对话框
在 解决方案资源管理器,右击第一个项目节点,然后单击 属性。 应用程序设计器显示。
单击 调试。 调试选项卡窗格显示。
在 命令行参数 框中,添加 /splash 开关。
按 F5 打开在实验性生成的 Visual Studio。
在 帮助 菜单上,单击 有关 Microsoft Visual Studio。
有关 将显示对话框和图标和文本 VSPackage 中。
接下来的内容
解决方案资源管理器 和 任务列表 是工具窗口的示例。 在 演练:创建工具窗口 (第 2 部分的 4),可以创建 Visual Studio 的停靠并让您播放音乐文件的工具窗口。