zoukankan      html  css  js  c++  java
  • 【转】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:");

  • 相关阅读:
    Jenkins简明入门(三) -- Blue Ocean,让一切变得简单
    TeamForge使用指南
    Jenkins简明入门(二) -- 利用Jenkins完成Python程序的build、test、deployment
    谈谈Python中的decorator装饰器,如何更优雅的重用代码
    Jenkins简明入门(一) -- 安装
    Python CSV 超简明用法
    Intel CPU命名规则的简略解析
    ef core 2.1 利用Query Type查询视图
    asp.net core 开发环境自定义域名及端口
    ef core 使用include进行外键连接查询
  • 原文地址:https://www.cnblogs.com/chriskwok/p/10724970.html
Copyright © 2011-2022 走看看