【转】VS2017的VSIX插件开发
最近从头开发了一遍一个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插件开发的更多相关文章
- VSIX 插件右键菜单
vs2017 插件开发 环境 WIN10 VS2017 CMMT VSIX 参考资源: vs菜单命令ID速查 https://docs.microsoft.com/zh-cn/visualstudio ...
- VS2017插件开发-项目右键菜单
1.创建自定义命令 2.更改.vsct中Group节点的id <Group guid="guidPublishOwinPackageCmdSet1" id="MyM ...
- VS2017离线安装QT插件出错:未能正确加载VSIX包
问题现象: 问题已解决,忘记截图了 出现原因:可能是自己离线安装,安装版本与不符合当前VS吧.记得当时下载了一个最新的版本.重新卸载当前插件,再装一个合适版本即可 http://download.qt ...
- Visual Studio Package 插件开发
背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包"不亦乐乎"...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一 ...
- VS简单注释插件——VS插件开发续
VS简单注释插件——VS插件开发续 前些时候,我写过一篇<VS版权信息插件——初试VS插件开发小记>分享过一个用于添加注释信息的插件,但那个插件有几个问题: 不能添加带块注释(/**/), ...
- Visual Studio Package 插件开发之自动生成实体工具
前言 这一篇是VS插件基于Visual Studio SDK扩展开发的,可能有些朋友看到[生成实体]心里可能会暗想,T4模板都可以做了.动软不是已经做了么.不就是读库保存文件到指定路径么…… 我希望做 ...
- VS2017搭建驱动开发环境WDK
先安装VS2017,然后在安装WDK,WDK会自动关联到VS2017中,不用你任何操作,自动在新建项目中可以找到驱动开发. 如果以上安装完成后,在VS2017中新建项目中没有发现WDK,那么需要进行修 ...
- XNA、FNA以及在VS2017中编写XNA
XNA是早期DX SDK支持的C#游戏开发环境,虽然现游戏开发大多是以Unity3D,Unreal 4为主,但是许多独立游戏开发者,特别是2D游戏,依然使用XNA进行开发, 纠其原因,猜测是C#开源且 ...
- VSCode插件开发全攻略(十)打包、发布、升级
更多文章请戳VSCode插件开发全攻略系列目录导航. 发布方式 插件开发完了,如何发布出去分享给他人呢?主要有3种方法: 方法一:直接把文件夹发给别人,让别人找到vscode的插件存放目录并放进去,然 ...
随机推荐
- 洛谷 P4092 [HEOI2016/TJOI2016]树 || bzoj4551
https://www.lydsy.com/JudgeOnline/problem.php?id=4551 https://www.luogu.org/problemnew/show/P4092 这当 ...
- 关于controller返回的页面js文件和css文件404问题的正式解决
谨用此博客记录一下这条卡了两个星期的bug…… 还是之前的问题,通过get方法,后台@Controller返回页面然后弹窗.但是不知道为什么一直所有js文件和css文件都报404…… (之前的博客记录 ...
- freertos之内存管理
任务.信号量.邮箱才调度器开始调度之前就应该创建,所以它不可能像裸奔程序那样的函数调用能确定需要多少内存资源,RTOS提供了3种内存管理的方法: 1 方法一:确定性好适合于任务.信号量.队列都不被删除 ...
- sql server 时间查询
select CONVERT(varchar, getdate(),8 ) --获取当前时间时分14:13:59 select CONVERT(varchar, getdate(),23 ) - ...
- AndroidStudio第一次提交项目代码到git服务器/github
虽然使用AndroidStudio(以下简称as)开发并使用git管理代码已经有很长时间,但是第一次提交项目到git依然会很不顺利,网上的文章或许因为所使用版本比较老,并不一定完全凑效,因此写此笔记做 ...
- Android仿ios底部弹出框效果
准备: public class ActionSheet { public interface OnActionSheetSelected { void onClick(int whichButton ...
- 【R语言进行数据挖掘】回归分析
1.线性回归 线性回归就是使用下面的预测函数预测未来观测量: 其中,x1,x2,...,xk都是预测变量(影响预测的因素),y是需要预测的目标变量(被预测变量). 线性回归模型的数据来源于澳大利亚的C ...
- Hadoop集群_VSFTP安装配置
原作者写的太好了,我这个菜鸟不自觉就转载了,原文链接:http://www.cnblogs.com/xia520pi/archive/2012/05/16/2503864.html 如果,您认为阅读这 ...
- Jenkins怎么启动和停止服务
笔者没有把Jenkins配置到tomcat中,每次都是用命令行来启动Jenkins.但是遇到一个问题:Jenkins一直是开着的,想关闭也关闭不了.百度了一些资料,均不靠谱(必须吐槽一下百度).于是进 ...
- Android学习总结(九)———— 内容提供器(ContentProvider)
一.内容提供器基本概念 内容提供器主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性.详细资料请看下图: 二.示例 ...