插件的定义

所谓插件,就是根据平台接口开发的第三方程序。第一次听到这个名词很是不了解,听了解释也不是很明白,那我们来举个例子,比如说一辆房车,现在里面只有基本的一些设施,但是你现在想在顶部有一个晒太阳的躺椅,ok,这个功能需求你自己清楚的,那要怎么实现?是不是买个躺椅来就可以了?是的,只要买个躺椅。如果仅仅买个躺椅你是不是就能安装到房车顶部?那肯定不行吧,你得看看房车顶上有没有螺丝柱给你安装吧。可以看到,这个螺丝柱就是房车提供给用户的接口,你的躺椅就是插件实现的功能,而将躺椅安装到螺丝柱上,对于不同的房车肯定是有不同的方法的。所以插件是独立开发的,但是他要依赖一个平台,vs中的插件也是这么回事,vs这个平台提供了一些接口,比如你想开发编辑器相关的插件,有DTE接口,这些接口可以让你访问到vs的其他插件或者功能,你开发插件也必须安装到vs上才能正常工作。

vs中的插件类型

我最开始学习的时候搜索插件,发现很迷糊,因为vs支持的插件类型实在是有点多,所以每搜索一个,都感觉不太相同。
有很多方法去扩展Visual Studio(甚至是Team Foundation Server),VS扩展是对这些方法的一个统称。如果只有一种方式扩展它,Visual Studio就不会是一个伟大的微软式产品。对于编程方面来说,VS扩展的主要方式是通过宏、Add-ins和Visual Studio扩展包(Package)。
在vs中主流的插件开发方式有三种。

  • 我们对Office产品中的宏已经很熟悉了,和在Office里面一样,我们也可以通过宏来扩展Visual Studio 2008。这是扩展VS的最简单的方式——我们甚至不需要VS SDK。Visual Studio提供了功能允许我们去录制宏,宏可以访问的Visual Studio 2008的对象模型,并且可以很容易和和VS的命令融合,并提供非常有用的、自动化的属性值。
    要成为一个非常专业的VS宏开发人员,你需要知道在宏后面的对象模型以及一些使用他们的方法。Visual studio 提供了一些例子。最好的办法是自己录制一些宏然后查看其中的代码,你可以通过这些代码来增加你的对宏的掌握。
    尽管宏对于任务自动化非常棒,但是它并不能用于创建全新的功能。简单来说,宏利用了VS IDE的自动化接口,但是它并没有真正和和VS集成。当用宏开发的时候,你必须认识到任何人都可以通过宏来查看你的源代码。

  • Visual studio Add-ins

    Add-ins具有更加强大的功能来扩展visual studio,因为它可以访问Visual studio 2008的所有对象模型并添加新的UI元素,例如工具窗口、选项页、菜单以及工具栏命令等等,这些添加的功能看起来就行IDE的一部分。Add-ins还可以访问由IDE自己以及其他的Add-in提供的service。
    品牌也被得到保证,因为插件信息会在Visual studio启动时显示的界面里或者“关于”对话框中显示。如果你用宏来扩展VS,宏那么所有人都可以看到你的源代码,但是一个Add-in是编译了的程序集,所以你可以像其他.NET 程序集一样,使用一些保护技术来保护你的代码。
    要发布插件,你只需要简单的创建一个安装项目并编译出.msi文件就可以了。msi程序会做你的Add-in需要的所有的安装和注册任务,安装后你就可以立即使用插件了。 对于一些简单的功能来所,插件是最简单的开始方式。但在这个系列中,我并不会关注如何开发Add-ins,不过Add-in中那些用于VS Package的技术,尤其是如何使用VS IDE提供的对象模型,是非常有用的。

  • Visual Studio Package

    毫无疑问VS扩展包是扩展Visual studio最强大的工具。最直接的证据就是整个visual studio的功能就是建立在以Visual studio外壳(shell)为核心的扩展包上的。所有的Language、编辑器、调试器、Project System以及其他很多的组件都是Package。 从开发人员的角度来看,添加新的VS Package与微软添加VS IDE的核心功能是一样的。VS IDE并不会区别对待微软开发的Package和第三方开发的Package。 Package可以用你最喜爱的语言(c#, VB.NET, C++)开发,所以从知识产权保护的角度来讲他们可以像其他的.NET library一样的安全。 VS SDK提供了Package安装以及注册工具,regpkg.exe。 Visual Studio通过所谓的PLK(Package load key)来检查一个扩展包是否合法,这个PLK可以从微软站点上获取到,它是你的package的数字散列码。如果你的package部署到了产品环境下,它的PLK会被检查。(译者注:在开发与调试下不需要PLK)

注:对于vs插件类型的解释引用了这位博主的内容,大家也可以结合多方资料,来帮助学习。 明年我18

如何选择插件类型

上文已经说过了,vspackage无疑是最好的插件方式,原因有几点,对于宏和add-in ,vs已经逐步的抛弃了他们,这和vs平台的架构是有关系的,vs其实只是一个平台,或者可以说是vspackage的一个集合,它管理着这些package,很多vs自带的功能也是用vspackage来开发的,所以用vspackage来开发插件,从根本上来说和vs原生的功能是没有区别的,我们这个方式来开发,保证了通用性,不会随着版本的迁移导致插件被废弃

文/最怕认真(简书作者)
原文链接:http://www.jianshu.com/p/894fb6a4e8e4
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

visual studio 插件开发的更多相关文章

  1. visual studio插件开发-Menu

    工欲善其事,必先利其器,作为程序员我们很大部分时间在和ide打交道,好的插件可以大大提高我们的编程效率,我开发过几个vs插件来解决一键生成dbmodels,快速部署到服务器,总结下来最关键的还是对于M ...

  2. Visual Studio插件开发基础

    Visual Studio插件主要有两种:Add-in 和 VSX(Visual Studio eXtensibility) 两者区别可参考这篇文章:Visual Studio Extensions ...

  3. Visual Studio 插件开发资源

    微软官方MSDN 官方MSDN永远是最大而全的电子字典Visual Studio Software Development Kit ,不过它的资料虽然详细,但没有一定的基础的话直接使用它的话有点无从入 ...

  4. visual studio插件开发dll类库免加全局缓存处理办法

    1.卸载VSIXProject 2.然后编辑*.csproj 修改如下: 3.重新加载项目 编辑source.extension.vsixmanifest 添加资产: 完事后,直接安装VISX就可以了

  5. 【小试插件开发】给Visual Studio装上自己定制的功能来提高代码调试效率

    背后的故事 随着项目需求的逐步增加,后端开发框架在我手上也慢慢重构为组件开发模式,整体结构类似于NopCommence.在这种结构中,每个组件所在的类库项目其实是生成到网站项目里指定的一个目录的,然后 ...

  6. Visual Studio Package 插件开发

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

  7. SSMS2008插件开发(2)--Microsoft Visual Studio 2008插件开发介绍

    原文:SSMS2008插件开发(2)--Microsoft Visual Studio 2008插件开发介绍 由于开发SSMS2008插件是通过VS2008进行的,有必要先介绍一下VS2008的插件开 ...

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

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

  9. Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)

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

随机推荐

  1. iOS : 静态库制作

    一.静态库简介 1. 什么是库? 库 就是程序代码的集合, 是共享程序代码的一种方式 2. 库的分类? 开源库 公开源代码, 能看到具体实现 例如MJExtension, MJRefresh, AFN ...

  2. GridSplitter的一个简单例子

    GridSplitter可以在Grid布局中根据鼠标发生移动(可拖拽的分隔栏) XAML: <Window x:Class="Layout.MainWindow" xmlns ...

  3. Spring XML配置实现AOP

    1:  首先我们要定义 配置成切面的类 package cn.gbx.example; import org.aspectj.lang.ProceedingJoinPoint; import org. ...

  4. [转载] Google大数据引擎Dremel剖析(1)

    原文: https://mp.weixin.qq.com/s?__biz=MjM5NzAyNTE0Ng==&mid=207895956&idx=1&sn=58e8af26fd3 ...

  5. [转载] 高流量大并发Linux TCP 性能调优

    原文: http://cenwj.com/2015/2/25/19 本文参考文章为: 优化Linux下的内核TCP参数来提高服务器负载能力 Linux Tuning 本文所面对的情况为: 高并发数 高 ...

  6. oracle 10g正则表达式 REGEXP_LIKE 用法

    ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...

  7. Python学习笔记3—字符串

    原始字符串 使用\转义或者r,这种方法在网站设置网站目录结构的时候非常管用. >>> dos="c:\news" >>> print dos c ...

  8. Android ViewPager更新数据

    ViewPager也是一个常用的组件 与ListView类似 当绑定数据后 想刷新数据 需要在适配器中添加如下方法 protected PagerAdapter galleryAdapter = ne ...

  9. [Selenium] 使用Javascript选中Input框里的内容,然后清空

    当我们需要清空Input框里的内容,直接使用el.clear()方法又行不通时,可以使用Javascript先去选中内容,然后再使用el.clear()方法:

  10. [转]使用git命令上传代码

    http://jiajing.elastos.org/2013/04/15/%E4%BD%BF%E7%94%A8git%E5%91%BD%E4%BB%A4%E4%B8%8A%E4%BC%A0%E4%B ...