一、基础概念

应该庆幸的是,VS的插件是靠着MEF实现而不是MAF,这让你所做的工作减轻了许多.如果在这之前,您已经了解了MEF的原理,我想对于VS插件的编写,您应该是很容易就能理解的.看看几个VS2010 SDK提供的例子,您就能熟练的编写了.

不过我还是简单的介绍一下MEF几个特点,目前来说,只要您了解这几个特点就足够了:

  • 组合容器
  • 部件
  • 目录
  • 使用特性导入、导出

这是一张博主 周金根 介绍MEF的图:

其中,CompositionContainer就是组合容器,Part就是部件,而VS插件的CompositionContainer需要一个“目录”(DirectoryCatalog)对象来发现这些部件.

Import和Export都属于特性,Import会将某个对象声明为一个导入,以便组合容器使用它所标记的对象找到”目录”内有Export标记了同样对象的对象.也就是MEF的定义之一:ExportAttribute 特性的类型必须与 ImportAttribute 相同。

更多关于MEF的情况,请关注本文的参考资料.

二、VS的插件原理

既然VS的插件是靠MEF实现的,那么当我们编写好一个插件,会有哪些东西被放入哪个目录才让VS找到他们呢?

如果你手头已然有了一个成品的或者三方的VS扩展包.也就是.vsix文件,将它复制一份,然后强行改名为.zip的文件.然后用Winrar打开它,您会发现以下内容:

extension.vsixmanifest文件会告诉VS它所依赖的.Net版本、引用的内容、dll、作者信息等内容。

抱歉[Content_Types].xml作用不解.

而其他内容就是我们编译我们的SDK项目所生成的东西.

那么这些内容会放到哪呢?

当你安装一个.vsix文件后,打开以下目录(Win7下默认路径):

C:\Users\Administrator\AppData\Local\Microsoft\VisualStudio\11.0\Extensions

这里面有命名正规的,像Microsoft这样的文件夹,还有像53w4yfez.zmc这样的文件夹

你需要关注的是第二种文件夹.都打开看一下,你会发现,总有一个文件夹和你打开的压缩包的文件基本一样:

VS插件的组合容器就是从这个目录来获取你的插件(部件)的.

有趣的发现

其实你会发现一件事情,微软的产品还是很喜欢.cab和.zip文件的.Office的InfoPath保存的.xsn文件也是如此.里面也是一堆文件.所以当你试图研究某个微软的产品的时候,不妨改成zip扩展名试试:)

三、创建“NVelocity编写插件”项目

安装完VS2012的SDK在创建项目的时候,你会发现多出来这么一些项目:

“NVelocity编写插件”是需要智能提示的,可惜的是,这里面并没有模板,理论上,选择VSIX Project是可以的,但是这个项目模板里面引用的类库实在太少了。方便起见,选择Editor Classifer项目即可,因为在后文,我们还要给NVelocity添加语法高亮的功能,Classifer正是我们需要的功能

关于其他条目的说明请参见:

http://www.codeproject.com/Articles/784998/Introduction-Visual-Studio-Editor-Margin-Extension

博主说他翻译的水平有限,就不坑大家了。。

四、小结

至此我们创建”NVelocity编写插件”的准备工作、基本概念就已经表述完了。本博主喜欢讲代码的时候专门讲代码,讲概念的时候专门讲概念。在下一章,我们将无废话的花费大篇幅的感受”NVelocity编写插件”的代码智能提示部分。本博主是师范出身,当初因为口才和有个程序猿梦的原因没有选择当老师,而且写博文才几篇,不懂太多,失误之处,望请海涵,讲的不对的地方。。。你特么的来打我呀!

五、参考资料

在 .NET 4 中使用托管可扩展性框架构建可组合的应用程序

Getting started with Visual Studio Editor Margin Extensions

Managed Extensibility Framework (MEF)

CodePlex,Microsoft.Composition Documentation

.Net4下的MEF(Managed Extensibility Framework) 架构简介

MSDN:Extending the Editor

最新文章

  1. eclipse使用sublime配色(转)
  2. Zabbix监控nginx-rtmp status(html版)
  3. ArcGIS JS 学习笔记2 实现仿百度的拖拽画圆
  4. wordpress数据库表说明
  5. Python开发【第六章】:Python面向对象
  6. FontAwesome 奥森图标的学习
  7. XML新增、修改、选择
  8. codeforces #330 div2
  9. Flex布局—语法篇
  10. 第七届蓝桥杯省赛javaB组 第七题剪邮票
  11. 通过AccessKey调用阿里云CDN接口刷新CDN资源案例
  12. python selenium-webdriver 生成测试报告 (十四)
  13. [100]find&xargs命令
  14. Python 爬虫-正则表达式
  15. ViewPager 如何得到当前的Fragment (使用FragmentPagerAdapter)
  16. python3 通过qq邮箱定时发送邮件
  17. javascript中用闭包递归遍历树状数组
  18. Android开发:keytool' 不是内部或外部命令 也不是可运行的程序
  19. IIS安全加固
  20. 【前端】强大的javascript原生选择器querySelector 和 querySelectorAll

热门文章

  1. tomcat7 的The Apache Tomcat Native library which allows optimal performance 的解决
  2. 进程—内存描述符(mm_struct)
  3. C++11 新特性之 decltypekeyword
  4. Edmonds-Karp算法,最大流POJ(1459)
  5. 2017.9.30 Java中引用类型变量的创建及使用&循环的高级
  6. 第十五章 函数————函数的递归、生成器send 、匿名函数
  7. java获取文件后缀名(正则表达式)+文件名
  8. 第9章 初识HAL固件库
  9. SpringMVC3中返回json字符串时500 Internal Server Error的处理方案
  10. 优化tableView性能(针对滑动时出现卡的现象)