最近从头开发了一遍一个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:");

【转】VS2017的VSIX插件开发的更多相关文章

  1. VSIX 插件右键菜单

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

  2. VS2017插件开发-项目右键菜单

    1.创建自定义命令 2.更改.vsct中Group节点的id <Group guid="guidPublishOwinPackageCmdSet1" id="MyM ...

  3. VS2017离线安装QT插件出错:未能正确加载VSIX包

    问题现象: 问题已解决,忘记截图了 出现原因:可能是自己离线安装,安装版本与不符合当前VS吧.记得当时下载了一个最新的版本.重新卸载当前插件,再装一个合适版本即可 http://download.qt ...

  4. Visual Studio Package 插件开发

    背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包"不亦乐乎"...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一 ...

  5. VS简单注释插件——VS插件开发续

    VS简单注释插件——VS插件开发续 前些时候,我写过一篇<VS版权信息插件——初试VS插件开发小记>分享过一个用于添加注释信息的插件,但那个插件有几个问题: 不能添加带块注释(/**/), ...

  6. Visual Studio Package 插件开发之自动生成实体工具

    前言 这一篇是VS插件基于Visual Studio SDK扩展开发的,可能有些朋友看到[生成实体]心里可能会暗想,T4模板都可以做了.动软不是已经做了么.不就是读库保存文件到指定路径么…… 我希望做 ...

  7. VS2017搭建驱动开发环境WDK

    先安装VS2017,然后在安装WDK,WDK会自动关联到VS2017中,不用你任何操作,自动在新建项目中可以找到驱动开发. 如果以上安装完成后,在VS2017中新建项目中没有发现WDK,那么需要进行修 ...

  8. XNA、FNA以及在VS2017中编写XNA

    XNA是早期DX SDK支持的C#游戏开发环境,虽然现游戏开发大多是以Unity3D,Unreal 4为主,但是许多独立游戏开发者,特别是2D游戏,依然使用XNA进行开发, 纠其原因,猜测是C#开源且 ...

  9. VSCode插件开发全攻略(十)打包、发布、升级

    更多文章请戳VSCode插件开发全攻略系列目录导航. 发布方式 插件开发完了,如何发布出去分享给他人呢?主要有3种方法: 方法一:直接把文件夹发给别人,让别人找到vscode的插件存放目录并放进去,然 ...

随机推荐

  1. 如何使用fastJson来解析JSON格式数据和生成JSON格式数据

    由于项目用到了JSON格式的数据,在网上搜索到了阿里的fastjson比较好用,特此记录fastjson用法,以备以后查询之用. decode: 首先创建一个JSON解析类: public class ...

  2. hdu4553约会安排(线段树区间合并)

    链接 poj3667的加强版 当时的题解 这里只不过对于女神需要另开算,DS的占用的时间不加在女神身上,女神的时间都要加,清空的时候也都要算. #include <iostream> #i ...

  3. yii2 加载静态资源

    1.在 assets/AppAsset 里定义方法 <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright ( ...

  4. django-Haystack库

    本文参考自Haystack官方文档:https://django-haystack.readthedocs.io/en/master/tutorial.html#configuration 简介 Ha ...

  5. 洛谷[LnOI2019]长脖子鹿省选模拟赛t1 -> 快速多项式变换

    快速多项式 做法:刚拿到此题有点蒙,一开始真没想出来怎么做,于是试着去自己写几个例子. 自己枚举几种情况之后就基本看出来了,其实本题中 n 就是f(m)在m进制下的位数,每项的系数就是f(m)在m进制 ...

  6. 在每天黄金时刻将数据库中数据获取包装成Excel表

    过程: 1.由Timer对象实现安排指定的任务在指定的时间进行重复的固定的延迟操作 a.设定时间间隔24小时:PERIOD_DAY = 24 * 60 * 60 * 100; b.指定每天执行操作的时 ...

  7. No input file specified的解决方法

    (一)IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二:请修改php.ini找到; cgi.for ...

  8. ace editor 使用教程

    <!DOCTYPE html><html> <head> <title>Demo of ACE Editor</title> <!-- ...

  9. 多线程下载命令--axel

    axel是轻量级多线程下载工具,对比传统下载工具curl和wget,下载速度上提升不少 centos安装如下 yum install -y axel 命令行用法 axel [option] url1 ...

  10. 【转载】K-mer算法

    k-mer是指将reads分成包含k个碱基的字符串,一般长短为m的reads可以分成m-k+1个k-mers.举个例子吧,为了简化,有这么个reads(当然实际比这个长):AACTGACTGA.如果k ...