Visual Studio 扩展入门(三)HelloWorld 下篇

8 篇文章 0 订阅
6 篇文章 0 订阅

本文通过实现Visual Studio启动记事本程序,来里了解Command模板的结构:

一、示例:实现“工具”菜单添加启动记事本程序的按钮

1、创建菜单命令

  1. 创建 VSIX 项目模板,并命名为FirstMenuCommand。
  2. 通过" Visual c # 项> Extensibility(扩展性) > Command(命令)",添加自定义命令 FirstCommand.cs。

此时解决方案目录如下:
在这里插入图片描述

2、修改FirstCommand .cs
  1. 添加命名空间。
using System.Diagnostics;
  1. 修改命令StartNotepadCmd的构造函数。
		private FirstCommand(AsyncPackage package, OleMenuCommandService commandService)
        {
            this.package = package ?? throw new ArgumentNullException(nameof(package));
            commandService = commandService ?? throw new ArgumentNullException(nameof(commandService));
            var menuCommandID = new CommandID(CommandSet, CommandId);
            //var menuItem = new MenuCommand(this.Execute, menuCommandID);//修改前
            var menuItem = new MenuCommand(this.StartNotepad, menuCommandID);//修改后
            commandService.AddCommand(menuItem);
        }
  1. 删除 Execute()方法并添加 StartNotepad()方法。使用类的实例 Process 来运行任何可执行文件,如:calc.exe。
       private void StartNotepad(object sender, EventArgs e)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            Process proc = new Process();
            proc.StartInfo.FileName = "notepad.exe";
            proc.Start();
        }

3、单击调试项目

实验实例中单击 "工具 > " “Invoke** **StartNotepadCmd” ,打开记事本。
在这里插入图片描述

二、Command模板代码结构

FirstCommand结构如下:
    internal sealed class FirstCommand
    {
        public const int CommandId = 0x0100;
        public static readonly Guid CommandSet = new Guid("562896fd-8a7a-4504-a749-a02ce7095683");
        private readonly AsyncPackage package;

        private FirstCommand(AsyncPackage package, OleMenuCommandService commandService){//...}

        public static FirstCommand Instance{get;private set;}

        private Microsoft.VisualStudio.Shell.IAsyncServiceProvider ServiceProvider{get{return this.package;}}
   
        public static async Task InitializeAsync(AsyncPackage package){//...};
    }
  • CommandId:命令ID。
  • CommandSet:命令菜单组(命令集GUID)。

与.vsct文件中IDSymbol 元素和GuidSymbol元素的 属性value相对应,在创建Command文件时,会自动一起创建。

         <GuidSymbol name="guidFirstMenuCommandPackageCmdSet" value="{562896fd-8a7a-4504-a749-a02ce7095683}">
          <IDSymbol name="MyMenuGroup" value="0x1020" />
          <IDSymbol name="FirstCommandId" value="0x0100" />
        </GuidSymbol>
  • package:提供这个命令的VSPackage,不为空。ServiceProvider属性返回它的服务接口。
  • InitializeAsync(AsyncPackage package):异步初始化命令的入口。由FirstMenuCommandPackage调用,在此方法内,会切换UI线程。获取菜单服务,调用构造传入参数,并通过AddCommand()添加菜单命令。


从示例一可以看到,若只修改Command脚本,是默认添加到“工具”菜单栏下面的,通过菜单篇可以了解更多的扩展菜单操作。

博客的示例源码:https://github.com/21thCenturyBoy/VSIX_HelloWorld

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值