目录

环境准备

Hello World

理解 VSIX 项目结构

Command

Package

.vsct 文件

实践

代码格式化


环境准备

安装 Visual Studio extension development

如果安装 VS 时已选择了此功能,则跳过这一步。

Hello World

本节通过一个最简单的 Hello World 示例演示如何创建一个 VS 插件。

创建 VSIX 项目

在项目中添加一个 Command.

进入新添加的 Command 的 Execute 方法, 修改变量 message,  可改为任意测试字符串.

调试运行该项目(直接按 F5 即可),程序会自动启动一个试验版(experimental) Visual Studio。

在试验版的 Visual Studio 上,Tools 菜单下会出现 Invoke XxxxCommand(即新添加的 Command )。正常的(非试验版) Visual Studio 上不会有该菜单。

点击 Invoke XxxxCommand, 即显示上一步修改的测试字符串。

编译该项目即可生成一个 VS 插件 (.vsix 文件),双击即可安装,安装过程可能需要关闭所有 VS。具体安装过程略。

安装完成后, 打开 VS 即可看到新的菜单。

至此, VS 插件的 Hello World 即完成。

理解 VSIX 项目结构

Command

自定义菜单的命令,即点击菜单后会执行的操作逻辑都写在该文件中。

通常只需修改 Execute 方法内容,将插件的功能逻辑写在此处。

Package

插件包,可以包含多个 Command。

一个 VSIX 项目下可建多个 Package, 但是通常情况下,我们使用一个 Package 即可。

如果一个 VSIX 仅有一个 Package, 则添加 Command 时,VS 会自动将 Command 添加到 Package 下。

.vsct 文件

Visual Studio Command Table,  xml 文件,包含所有自定义菜单配置。

vstc 文件包含如下 3 部分:

  • 宏和预处理
  • 命令
  • GUIDs

宏和预处理

VSCT 编译器能使用 C++ 宏和预处理

从外部引入一些宏可以简化 vsct 的配置. 下面以 vsshlids.h 为例说明。

vsshlids.h 头文件位于 {VS安装目录}\VSSDK\VisualStudioIntegration\Common\Inc, 例如我的目录是 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VSSDK\VisualStudioIntegration\Common\Inc。

vsct 文件中有用到宏 IDM_VS_MENU_TOOLS, 它表示 VS 上的 Tools 菜单的ID,这个宏即位于 vsshlids.h 头文件中。

如果不引入该头文件,不使用宏 IDM_VS_MENU_TOOLS, 就得使用 0x0085 来表示 VS 上的 Tools 菜单, 这无疑会大大增加配置和维护的难度。

命令

这部分配置自定义的菜单:按钮文字,所属组,图标等等。

以 Hello World 示例的命令为例说明。

组的概念:

菜单中,以横线分割在一起的菜单属于一个组。

GUIDs

VSIX 项目配置中,几乎所有东西都通过 GUID 进行关联

以 Hello World 示例的命令为例说明。

实践

代码格式化

VS 本身已有代码格式化功能,本节实践只是为了练习在 VS 中添加自定义菜单

期望目标:在 VS Edit 菜单下增加一个子菜单,实现对当前选中的代码进行格式化。

基于 Hello Word Demo 程序上修改。

添加一个命令 FormatSelectionCommand

打开 .vsct 文件, 找到新添加的 FormatSelection 命令。

修改 Button 的 Parent,  使得 Button 位于 VS Edit 菜单下。并修改按钮文本。

注:宏 IDG_VS_EDIT_OBJECTS 位于 vsshlids.h 文件中。

运行程序,可以看到 Format Selection 菜单已加到 VS Edit 菜单下。

接下来,修改 FormatSelectionCommand 的 Execute 方法,实现代码进行格式化功能。

我们不需从 0 开始实现代码格式化功能,而是通过执行 VS 内置的命令的方式来实现。具体代码如下:

private async void Execute(object sender, EventArgs e)
{await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();var service = await this.ServiceProvider.GetServiceAsync<SVsCmdNameMapping, IVsCmdNameMapping>();service.MapNameToGUIDID("Edit.FormatSelection", out Guid pguidCmdGroup, out uint pdwCmdID);var cmdId = Convert.ToInt32(pdwCmdID);var commandID = new CommandID(pguidCmdGroup, cmdId);var commandService = await this.ServiceProvider.GetServiceAsync(typeof(IMenuCommandService)) as OleMenuCommandService;commandService.GlobalInvoke(commandID);
}

注:代码中用的 "Edit.FormatSelection" 来自:https://docs.microsoft.com/en-us/visualstudio/ide/reference/visual-studio-command-aliases?view=vs-2019

编译项目,生成 .vsix 文件。然后安装。效果如下图。

至此,VS 插件的实践完成。

完整代码附件:https://download.csdn.net/download/u013688451/18740986

尚未解决的问题

本人在实践过程中遇到一个问题,尚未找到原因。

上述代码格式化的功能,使用调试的方式启动的试验版 VS 上,Edit.FormatSelection 不能正常执行,但 Edit.FormatDocument 又能正常执行。

项目编译成 .vsix 文件后安装,Edit.FormatSelection 能正常执行。

VS 2019 插件开发相关推荐

  1. 3dsmax 2019 插件开发要点

    最近有个外包需求,模型那边使用max2019制作,所以我这边要对应编写max2019的导出插件.max2019的sdk使用和max2014上有一些不一样,下面的一些要点要注意. 首先需要安装vs201 ...

  2. jquery 插件开发的作用域及基础

    2019独角兽企业重金招聘Python工程师标准>>> 之前一直有开发jquery插件的冲动,所以一直想学习如何进行插件开发,最近一个项目需要使用图片上传组件及自动无限下拉组件,百度 ...

  3. Nutch插件开发及发布流程

    2019独角兽企业重金招聘Python工程师标准>>>  一,插件开发流程: 1,Nutch开发客户端环境搭建 2,plugin的源代码则保存在/src/java/org/apach ...

  4. 【直播回顾】蚂蚁金服高级开发工程师萧恺:IDEA 插件开发入门教程

    主讲人:萧恺(蚂蚁金服-支付宝事业群-高级开发工程师) 本名:肖汉松 讲师介绍: 热爱阅读,喜欢挑战,热衷尝试新的技术,关注技术背后的原理. 关注领域:Java 服务端开发,分布式系统 关注语言:Ja ...

  5. discuz x3插件开发傻瓜图文教程,用demo说话

    2019独角兽企业重金招聘Python工程师标准>>> 此demo功能是在模板footer部位插入一段javascript代码,这段代码可以是alert提示,也可以是加载广告等等. ...

  6. D2 日报 2019年1月2日

    官网阅读获得更好的体验,传送门<日报 2019年1月2日> 你有一个苹果,我有一个苹果,交换之后我们还是各自有一个苹果. 你有一份知识,我有一份知识,我们互相分享一下就都有了两份知识. 开 ...

  7. android phonegap插件开发方法 plugin

    2019独角兽企业重金招聘Python工程师标准>>> android phonegap插件开发方法 plugin 分类: phonegap 2014-03-03 22:41  59 ...

  8. Qt Creator 插件开发(1):编译 Qt Creator

    2019独角兽企业重金招聘Python工程师标准>>> 从技术架构角度来说,Qt Creator 可以看做是一个插件平台,其大部分功能都是以插件的形式提供的. 本系列文章将着重介绍如 ...

  9. jQuery插件开发的两种方法及$.fn.extend的详解

    2019独角兽企业重金招聘Python工程师标准>>> 作者: 字体:[增加 减小] 类型:转载 时间:2014-01-16 我要评论 jQuery插件开发分为两种:1 类级别.2 ...

  10. 2019年Vue学习路线图

    作者|Anthony Gore 译者|无明 如果你是 Vue 开发新手,可能已经听过很多行话术语,比如单页面应用程序.异步组件.服务器端渲染,等等.你可能还听说过与 Vue 有关的一些工具和库,比如 ...

最新文章

  1. 通过几个Hello World感受.NET Core全新的开发体验
  2. 超参数搜索——网格搜索和随机搜索
  3. 布线时其他区域变黑、高亮Net时其他区域太黑
  4. python多线程实现生产者消费者_用Python实现多线程“生产者-消费者”模型的简单例子...
  5. ubuntu 创建桌面快捷方式
  6. 使用 Label 类在 XNA 中显示文本,WPXNA(七)
  7. dependency报红_解决IDEA中Maven依赖包导入失败报红问题(总结最有效8种解决方案)...
  8. 微信用户全局唯一标识_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法...
  9. ASP.NET 主题(Themes)FAQ
  10. Apache阶段二-
  11. Deep learning:三十四(用NN实现数据的降维)
  12. 《Spring揭秘》知识点总结
  13. 论文复现-金融风控模型案例
  14. 编译器怎么把多个源文件编译成一个程序
  15. 什么是直方图,如何使用它来改善照片?
  16. 爬虫_app 1.1 导学
  17. 用python写一个自动注册脚本_js自己写脚本自动操作注册插件基于chrome浏览器
  18. IOS Appstore 预览图尺寸
  19. 达内python培训四个月靠谱吗
  20. 2021苹果CMS安卓萝卜视频原生影视APP源码支持投屏选集倍速弹幕版(前端二开美化版)

热门文章

  1. linux无桌面浏览器,Ubuntu无桌面进行Web浏览器测试
  2. 关于希捷维修日志中 FAIL Servo Op=0100 Resp=0003 错误信息的解读
  3. 值得推荐的C/C++框架和库
  4. 应用程序无法启动,因为应用程序的并行配置不正确 解决方案
  5. Android 视频缩放/放大
  6. Windows10中同时安装MySQL5和MySQL8
  7. IDEA代码规范插件P3C+代码注释模板
  8. Sql Server2014数据库安装教程
  9. 统计学权威盘点过去50年最重要的统计学思想
  10. 【Visio】 Visio的安装