vs2010extension实践

张柯宇 张柯宇     2022-08-26     464

关键词:

在上一篇(VS2010 Extension (1)实践)里,主要展示了如何使用MEF扩展VS2010,来扩展编辑控制和展现自己的UI;在实现QuickToolbar的时候,发现MEF仅仅提供了很基本的编辑控制,如果需要高级的操作,比如注释选择的代码,就捉襟见肘,很是麻烦。

本篇我将展示如何深入挖掘VS2010 Extension,使它成为锋利的军刀,而不是绣花枕头。鉴于此,这里就从上面提到了的Feature——注释和取消注释选择的代码来剖析,希望可以为大家拓宽思路,更好的利用VS2010。

首先回顾一下上篇中的实现,当时是基于TextViewLine做注释代码的,这里有两个潜在问题:其一,TextViewLine,顾名思义,是“可视区域”的行,所以如果选择超出可视区域,超出的部分就没有注释掉;其二,当选择的结束位置在行的结尾时,无法实现IDE注释代码后保持Caret在选择结尾而不跳到下一行的行为,当尝试自己重新选择并移动Caret就会收到ITextSpanshot无效的异常。

上面提到了VS2010 Extension对编辑器的编辑行为的控制能力仅仅提供了通用的,比如Cut/Copy/Paste等等,而其他的诸如注释/取消注释代码,添加、删除、导航到Bookmark等程序员常用功能没有暴露出来,具体可以参考IEditorOperationsInterface(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.text.operations.ieditoroperations_methods%28VS.100%29.aspx),这里的所有Member表达了其所支持的编辑操作。总之,这条路只有这么几个目的地。

那么,还有其他方法吗?貌似走到了死胡同了,但是当我们使用IDE时候,却是可以很容易的通过Edit菜单找到所有的功能的,问题是,它们要怎样才能为我所用呢?

我首先想到的是在VSSDK中找找,结果一个名字看起来很顺眼的接口撞到眼里,它就是IVsUIShellInterface(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivsuishell%28VS.100%29.aspx),MSDN上市这么说的:

This interface provides access to basic windowing functionality, including access to and creation of tool windows and document windowsprovided by the environment.

也就是说这是一个由IDE提供的全局的Service,可以创建、访问工具窗口和编辑窗口。浏览一下这个所有Member,发现了一个叫IVsUIShell.PostExecCommand(...)(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivsuishell.postexeccommand%28VS.100%29.aspx)的方法,MSDN描述说通过它可以异步执行Command,那么,只要找到注释代码的Command,在通过这个接口就可以实现VS IDE一样的注释代码的Feature了。酷毙了,就是它,当怎么得到它呢?现在请留心MSDN上的解释,就是上面我使用红色粗体表示出来的部分——这个由IDE提供的全局的Service,那么可以通过Package.GetGlobalService(...)(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.package.getglobalservice%28VS.100%29.aspx)来获取:

IVsUIShell shell = Package.GetGlobalService(typeof(IVsUIShell)) as IVsUIShell;

 

接下来是找到自己需要Command,然后PostExecCommand就搞定了;而VS提供的Command有两部分组成:Guid和CommandID,这个大部分都在VSConstants Class(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants%28VS.100%29.aspx)里面,以注释代码为例,其Guid是:VsConstants.VSStd2k,而CommandID是VSConstants.VSStd2kCmdID.COMMENTBLOCK。下面是我包装的注释和取消注释的代码片段:

 

public static void ProcessComments(bool comment)
{
    IVsUIShell shell = Package.GetGlobalService(typeof(IVsUIShell)) as IVsUIShell;
    if (shell != null)
    {
        Guid std2k = VSConstants.VSStd2K;
        uint cmdId = comment ?
                  (uint)VSConstants.VSStd2KCmdID.COMMENT_BLOCK :
                  (uint)VSConstants.VSStd2KCmdID.UNCOMMENT_BLOCK;
        object arg = null;
        shell.PostExecCommand(ref std2k, cmdId, 0, ref arg);
    }
}

至此,我们通过VSSDK提供的能力,顺利的挖掘出VS2010 Extension的部分宝藏,你是不是也有点心动,要自己去挖掘一点呢?

 

PS:

本文所讲解内容是根据练习之作而进行的,如果需要源代码,请自行到GCDN论坛下载,代码和VSIX安装程序均匀更新

[VS2010扩展]浮动工具栏(http://gcdn.grapecity.com/showtopic-345.html

如何破解vs2010的visualassistx控件

...va_x.dll即可vc2010的破解方法:因为2010的visualassistx是使用extension的方式安装的,所以你得到这个路径去破解,就是把破解补丁拷贝到这个路径下,直接运行补丁程序或者覆盖va_x.dll即可:windows7路径c:/users/用户名/appdata/local/microsoft/... 查看详情

同时安装了vs2008和vs2010,番茄工具装了,vs2008有显示番茄,2010没有,

...用2010的朋友,因为2010以及更新版本中的VisualAssistX是使用Extension的方式安装的,所以你得到这个路径去破解,就是把破解补丁拷贝到这个路径下,直接运行补丁程序或者覆盖VA_X.dll即可:Windows7和Windows8中的路径:C:/Users/用户名/Ap... 查看详情

如何更改 jslint(VS 2010 扩展名)以忽略文件?

...展名)以忽略文件?【英文标题】:HowcanIchangejslint(VS2010extension)toignorefiles?【发布时间】:2011-07-0110:43:21【问题描述】:我通过扩展管理器在Vs2010中安装了jslint作为扩展。它发现了很多错误,但它们都来自外部插件或jquery库。我... 查看详情

Visual Studio 2010:扩展/差异

】VisualStudio2010:扩展/差异【英文标题】:VisualStudio2010:extensions/discrepancies【发布时间】:2011-03-1717:18:47【问题描述】:VisualStudio2010具有许多与C++标准相关的扩展(默认激活)/差异。这种差异可能会令人惊讶,并引发与其他行为... 查看详情

Partials vs for 循环——最佳实践

】Partialsvsfor循环——最佳实践【英文标题】:Partialsvsforloop—bestpractices【发布时间】:2010-06-0722:00:12【问题描述】:在编写视图模板时,您可以渲染部分视图并传递要为每个对象渲染一次的对象数组。或者,您可以在@blank循环... 查看详情

halcon11与vs2010联合开发

...资料都是Halcon10的,我用的是Halcon11和VS2010的开发环境,实践了一下发现有一些问题,于是把自己的配置的过程写出来共享一下。首先新建一个Halcon工程,这里用个读入图片的简单例子。新建一个Halcon程序,输入以下代码:read_ima... 查看详情

Kotlin Android 视图绑定:findViewById vs Butterknife vs Kotlin Android Extension

】KotlinAndroid视图绑定:findViewByIdvsButterknifevsKotlinAndroidExtension【英文标题】:KotlinAndroidViewBinding:findViewByIdvsButterknifevsKotlinAndroidExtension【发布时间】:2018-03-1022:58:20【问题描述】:我正在尝试找出在Kotlin中进行Android视图绑定的最... 查看详情

ViewBinding vs Kotlin Android Extensions 与合成视图

】ViewBindingvsKotlinAndroidExtensions与合成视图【英文标题】:ViewBindingvsKotlinAndroidExtensionswithsyntheticviews【发布时间】:2020-02-0913:42:07【问题描述】:新的ViewBinding与带有合成视图绑定的KotlinAndroidExtensions相比如何?除了新的ViewBindings... 查看详情

vs2022extensions-codemaid

1.概要最近在整理公司项目的源码,发现维护的人一旦多了起来很多人会不注意代码缩进和不需要的命名空间的移除等陋习。但是项目文件少则几百多则上千,如果一个人去做这件事情是会非常崩溃的如果让大家一起遵守... 查看详情

VS Package Extension 将新项目类型添加到新项目选项窗口

】VSPackageExtension将新项目类型添加到新项目选项窗口【英文标题】:VSPackageExtensiontoaddanewprojecttypetothenewprojectsoptionswindow【发布时间】:2014-05-0620:00:45【问题描述】:我想创建一个VisualStudio扩展。我选择了Package选项,因为AddIn选... 查看详情

[转]windows下vs2010中lib与dll文件的生成与使用

...参考了不少帖子,有的讲得也不是很清楚明白,先将本人实践过的记录一下,供后期自己查询,也供各位大牛点评。一、lib文件的生成与使用1、lib的生成相对来说,静态库文件还是比较容易生成和使用的, 查看详情

安装vs2010后,如何设置老版本的项目文件不是默认用vs2010打开

参考技术A系统先后安装了VS2005和VS2010,在打开用VS2005创建的项目文件时总是会默认用VS2010打开,选择打开方式都不行,很不方便,差点把VS2010卸载了,其实只需要简单设置VS2010就不会关联老版本文件了:打开VS2010-工具-选项-环境-... 查看详情

VS Code Prettier - Code Formatter Extension 不适用于使用 Typescript 模板的 Create-React-App

】VSCodePrettier-CodeFormatterExtension不适用于使用Typescript模板的Create-React-App【英文标题】:VSCodePrettier-CodeFormatterExtensionnotworkingwithCreate-React-AppusingTypescripttemplate【发布时间】:2020-11-1506:14:13【问题描述】:我目前正在尝试使用Create-Re 查看详情

vs2010msdn文档安装方法

vs2010的MSDN是不能独立安装,必须安装VS2010后才能安装。 安装方法:1、vs2010的ISO光盘文件中,里面会有个ProductDocumentation文件夹,其实这个就是安装MSDN的文件夹了。2、先安装vs2010,运行vs2010,点击help,打开managehelpsettings(... 查看详情

vs2010_慢

1、http://blog.csdn.net/chenlycly/article/details/497217991.1、VS2010调试慢在命令行中执行devenv.exe /resetuserdata,将VS2010的环境重置一下。1.2、VS2010运行慢vcpksrv.exe进程,得知是与VS的智能感知相关的,可以在VS的菜单栏中的工具->选项->... 查看详情

vs2010如何重置开发环境

...环境成了一个难题,今天我们就来讲解一下,如何更改VS2010的开发环境,此方法对VS2008,VS2005和VS2012均适用工具/原料 VS2010软件方法/步骤 1打开VS2010软件2进 查看详情

VS 2010 的鼹鼠?

】VS2010的鼹鼠?【英文标题】:MoleforVS2010?【发布时间】:2011-03-1411:08:07【问题描述】:有人知道KarlShifflett在VS2010上的Mole吗?【问题讨论】:鼹鼠2010有更新吗?我已经做了一些搜索,但我找不到任何东西..【参考方案1】:这是2... 查看详情

VS 2012 与 VS 2010 的互操作性

】VS2012与VS2010的互操作性【英文标题】:VS2012interoperabilitywithVS2010【发布时间】:2014-09-2522:03:51【问题描述】:我用C++编写的应用程序是用VisualStudio2010构建的,它需要链接到两个外部动态库。其中一个库是用VS2010构建的(这里没... 查看详情