最近从头开发了一遍一个VSIX的插件,用于调测的一个工具:

特此把相关的过程经验记录下来:

第一步:建立工程

1.      首先是安装上:

需要安装Visual Studio SDK,这个在安装VS的时候缺省是不选的,需要个人手动选择一下。

也需要安装C#,VSIX是使用C#开发的。

2.      新建项目时,选择VSIX

Visual C# -> Extensibility -> VXIXProject

在这个阶段,可以在.vsixmanifest文件中把Product Name, Author, Description修改一下

Select Edition可以把支持平台选一下

(注:我所用的是VS2017)

第二步:添加配置

1.       添加一个菜单项

在工程上右键

添加->新建项->Visual C#项->Extensibility->VSPackage->Custom Command

命令缺省添加在了“工具”- IDM_VS_MENU_TOOLS下,参见.csvt文件中的配置

2.      修改为右键菜单(可选)

如果要改成右键菜单的话,需要替换为IDM_VS_CTXT_CODEWIN

IDM_VS_MENU_TOOLS –>IDM_VS_CTXT_CODEWIN

附几个定义的说明

IDM_VS_MENU_TOOLS 菜单

IDM_VS_CTXT_CODEWIN 右键菜单添加命令

IDM_VS_CTXT_SOLNNODE 是指的解決方案資源管理器的解決方案,

IDM_VS_CTXT_SOLNFOLDER 是指的解決方案資源管理器裏的解決方案裏的文件夾,不是項目裏的哈,這個文件夾是虛擬的,沒有實際的文件夾映射,

IDM_VS_CTXT_PROJNODE 是指的解決方案資源管理器裏的項目,

IDM_VS_CTXT_FOLDERNODE 是指的解決方案資源管理器裏的項目裏的文件夾,

IDM_VS_CTXT_ITEMNODE 是指的解決方案資源管理器裏的項目裏的項,就例如cs、js文件

3.      菜单缺省禁用或不可见配置(可选)

参见.csvt文件中

<CommandFlag>DefaultDisabled</CommandFlag>

<CommandFlag>DefaultInvisible</CommandFlag>

<Strings>

<ButtonText>Invoke Command1</ButtonText>

</Strings>

4.      配置VSIX的缺省加载(可选)

在Package的类定义上,添加前置语句,当工程一打开就加载,否则在首次调用命令时加载。

[ProvideAutoLoad(UIContextGuids80.SolutionExists)]

5.      配置快捷键(可选)

参见.csvt文件中,在文件中添加快捷键映射,注意不要和VS中的快捷键冲突

<KeyBindings>

<KeyBinding guid="MyProjectCmdSet" id="idCommand1" editor="guidVSStd97" key1="A" mod1="ALT" />

</KeyBindings>

第三步:编写业务处理

1.      从代码编辑窗口取选中项

DTE dte = (DTE)GetService(typeof(DTE));

if (dte.ActiveDocument != null && dte.ActiveDocument.Type == "Text")

{

var selection = (TextSelection)dte.ActiveDocument.Selection;

string text = selection.Text;

// Modify the text, for example:

text = ">>" + text + "<<";

// Replace the selection with the modified text.

selection.Text = text;

}

有时需要扩展选中区域,那就需要使用焦点了

EditPoint pt1 = (EditPoint)selection.ActivePoint.CreateEditPoint();

EditPoint pt2 = pt1.CreateEditPoint();

QString text = pt1.GetText(pt2);

此时,可以使用CharLeft()/CharRight()来扩展选定的范围,扩展时,注意判断AtStartOfLine/AtEndOfLine

2.      注册命令监听处理

例如,当进入debug模式时触发某个处理,就需要监听debug的变更事件

public xxx()

{

m_debugEvents = watch.m_dte.Events.DebuggerEvents;

m_debugEvents.OnEnterBreakMode += OnEnterBreak;

}

public void OnEnterBreak(dbgEventReason Reason, ref dbgExecutionAction ExecutionAction)

{

}

// 获取当前的调试模式dte.Debugger.CurrentMode

(注意:vsix获取到的元素是com机制的,如果要保证监听的正常执行,需要在运行期间持有对应的Events,例如上面的使用m_debugEvents存储DebuggerEvents)

3.      对调试进程内存读写

可以通过加载kenel32.dll,调用openprocess, readMemory, writeMemory,closehandle方式来读写;

但推荐使用DkmProcess来读写。

DkmStackFrame frame = DkmStackFrame.ExtractFromDTEObject(dte.Debugger.CurrentStackFrame);

DkmProcess prcess = frame.Process;

byte* pBtes = prcess.ReadMemoryString(nAddr, DkmReadMemoryFlags.None, 1, MaxReadLength);

strContent = System.Text.Encoding.ASCII.GetString(pBtes);

注:使用DkmProcess需要通过nuget下载引用项,注意下载

using Microsoft.VisualStudio.Debugger;

using Microsoft.VisualStudio.Debugger.CallStack;

4.      输出信息

可以自己定制窗口,也可以使用VS的输出窗口输出信息,向vs窗口输出的话,采用

Window wind = (Window)dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput);

wind.Visible = true;

OutputWindow outputWind = (OutputWindow)wind.Object;

OutputWindowPane pane = outputWind.OutputWindowPanes.Add("My Output");

pane.Activate();

pane.OutputString("info:");

转载于:https://www.cnblogs.com/chriskwok/p/10724970.html

【转】VS2017的VSIX插件开发相关推荐

  1. VSIX 插件右键菜单

    vs2017 插件开发 环境 WIN10 VS2017 CMMT VSIX 参考资源: vs菜单命令ID速查 https://docs.microsoft.com/zh-cn/visualstudio ...

  2. 3mdax插件开发之环境配置(3dmax2018SDK +VS2017 +win10)详细步骤

    3dmax插件开发的环境配置,并不复杂,但是自己配置,还是遇到了一大筐问题,由于本人不是程序出身,对于程序也是一直在摸索,最近也是看到了3dmax SDK的东西,所以想动手尝试一下,结果弄了好几天才把 ...

  3. VS2017添加qt-vsaddin-msvc2017-2.7.1.vsix

    QT版本5.12.12,VS版本2017社区版 qt-vsaddin-msvc2017-2.7.1.vsix下载地址: Index of /archive/vsaddin/2.7.1 双击下载的qt- ...

  4. VS2017 add-in for Qt: vsix提示 此扩展不能安装在任何当前安装的产品上

    在VS2017安装Qt扩展的时候出现这个玩意,其他教程有说要改extension.vsixmanifest的,p哦,没头没尾的,还不管用. 去https://download.qt.io/offici ...

  5. 在windows7下安装vs2017插件 GLSL language integration v0.10.120.vsix报错:microsoft.visualc.redist.12

    系列文章目录 文章目录 系列文章目录 前言 一.分析原因 二.解决办法 1.下载对应的 :VC_redist.x64.exe 安装:VC_redist.x64.exe 前言 一.分析原因 官方描述 V ...

  6. VSCode插件开发全攻略(六)开发调试技巧

    更多文章请戳VSCode插件开发全攻略系列目录导航. 前言 在介绍完一些比较简单的内容点之后,我觉得有必要先和大家介绍一些开发中遇到的一些细节问题以及技巧,特别是后面一章节将要介绍WebView的知识 ...

  7. vscode插件开发实践与demo源码

    vscode插件开发实践与demo源码 写在前面 工欲善其事必先利其器.vscode作为优秀的开发工具,给我的日常开发工作提供了极大的便利.其拓展机制更是如此. 但是,最近在做年度专业线任务时,有需要 ...

  8. VSCode插件开发全攻略

    原文:VSCode插件开发全攻略(一)概览 作者:小茗同学 文章索引 VSCode插件开发全攻略(一)概览 VSCode插件开发全攻略(二)HelloWord VSCode插件开发全攻略(三)pack ...

  9. VS2017中创建使用 XRM 工具常用登录控件的WPF应用程序,适用CRM9.X版本

    VS2017中创建使用 XRM 工具常用登录控件的WPF应用程序,适用CRM9.X版本 前提条件 创建WPF项目和修改版本 添加按钮调用登录控件进行调试 总结 微软dynamics官网之前有个CRM ...

最新文章

  1. csvtk:命令行下表格统计分析、数据筛选、替换、整理神器
  2. c++ 纯虚函数和抽象类那些事(三)
  3. win10 linux安卓模拟器,genymotion安卓模拟器在Window10中使用的问题
  4. 移动端跨平台开发框架对比分析
  5. so库文件控制导出符号
  6. MySQL 数据库设计规范
  7. 01慕课网《进击Node.js基础(一)》Node.js安装,创建例子
  8. 人与人之间交往最重要的是什么?
  9. 【学术】施一公分享自身经验:如何提高自己的专业英文文献阅读能力
  10. html div 上下显示不全,div垂直居中 css div盒子上下垂直居中显示
  11. macOS linux 并发测试工具 wrk
  12. Java中equal和==的比较[zz]
  13. sfgghshs测试测试
  14. Be yourself——《按自己的意愿过一生》读后感
  15. vscode 的setting.json的配置
  16. 一个屌丝程序猿的人生(八)
  17. 智慧睡眠风口之上,企业破圈要聚焦“场景竞争力”
  18. linux(shell)查看文件时间戳
  19. 论文阅读笔记(五)CLIP4Clip: An Empirical Study of CLIP for End to End Video Clip Retrieval
  20. phobos勒索病毒的处理,警惕phobos卷土从来

热门文章

  1. Support Web Application Projects
  2. Windows中彻底卸载MySQL
  3. 10个好用的Web日志安全分析工具
  4. php mysql多表关联删除_MySQL中多表删除方法
  5. 【Python3】复制、移动、删除文件及文件夹
  6. 【PL/SQL】用星号拼出金字塔
  7. 【Oracle】详解10053事件
  8. Git:代码冲突常见解决方法
  9. 乐观锁 与 悲观锁 来解决数据库并发问题
  10. nested exception is java.lang.NoClassDefFoundError: org/codehaus/jettison/json/JSONObject异常的解决办法