VS Extension+NVelocity系列(二)——让VS支持 NVelocity的智能提示(上)
一、基础概念
应该庆幸的是,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) 架构简介
VS Extension+NVelocity系列(二)——让VS支持 NVelocity的智能提示(上)的更多相关文章
- VS Extension+NVelocity系列(三)——让VS支持 NVelocity的智能提示(中)
一.定义 我们知道,我们的插件是服务于NVelocity的,在你的项目当中,对于NVelocity的模板应当有一个统一的文件扩展名,以便于VS在打开指定扩展名的文件后,就能起到具体的作用. 如果我没有 ...
- CSS3系列二(媒体支持、文字与字体相关样式、盒相关样式)
CSS3媒体支持 在css3中允许我们在不改变内容的情况下,在样式中选择一种页面的布局以精确的适应不同的设备,从而改善用户体验 可以利用meta标签在页面中指定浏览器在处理本页面时按照多少像素的窗口宽 ...
- vs2015 不支持javascript的智能提示高亮
有些人安装了vs2015后发现居然不支持javascrpt的高亮功能,连工具-选项-文本编辑器里面的javascript也没有了,楼主也碰到这么个情况了,估计是有与装了多个版本的原因,楼主电脑安装了V ...
- vscode 支持 threejs 的智能提示
VSCode Typings and Intellisense: Dummy Learning VS-Code 1 Jun 20, 2016 Updated on Jun 20 2016 for 1. ...
- 让NVelocity做更多的事,VS Extension+NVelocity系列
我不知道园子里到底有多少人喜欢使用NVelocity这个模板引擎,其实说实话,如果现在让我选,我对Razor的喜好要比NVelocity或者T4等等的模板引擎更多一些,当然了,个人看法而已.只是我在公 ...
- Eclipse安装插件支持jQuery智能提示
Eclipse安装插件支持jQuery智能提示 最近工作中用到jQuery插件,需要安装eclipse插件才能支持jQuery智能提示,在网上搜索了一下,常用的有三个插件支持jQuery的智能提示:1 ...
- sed修炼系列(二):sed武功心法(info sed翻译+注解)
sed系列文章: sed修炼系列(一):花拳绣腿之入门篇sed修炼系列(二):武功心法(info sed翻译+注解)sed修炼系列(三):sed高级应用之实现窗口滑动技术sed修炼系列(四):sed中 ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发人员和设计师必读精华文章【系列二十六】
<Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
随机推荐
- centos6.5_64bit_tomcat日志合并在一个.log下
问题 tomcat每次启动时,自动在logs目录下生产以下日志文件,且每天都会生成对应日期的一个文件,造成日志文件众多: 目的 Tomcat以上日志都输出到同一个文件中. 修 ...
- C++ new new[]详解
精髓: operator new()完成的操作一般只是分配内存:而构造函数的调用(如果需要)是在new运算符中完成的. operator new和new 运算符是不同的,operator new只分配 ...
- server 2008 64位安装Rational错误
Administrator has detected that this is a terminal server session.Administrator does not support run ...
- Git-进阶-远程仓库的使用
一.远程仓库怎么玩 1. 自己搭建一个运行Git的服务器 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上,但肯定有一台机器有着最原始的版本库,然后别的机器来克隆这个原始版本库,这 ...
- 使用ecilpse(Java)调用Matlab代码
1 安装java环境: http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载JDK最新版本并安装,CloudSim ...
- IOS 发布程序(打包上传)
• 发布程序的主要步骤 登录开发者主页 生成cer证书:cer是一个跟电脑相关联的证书文件,让电脑具备发布程序的功能 添加App ID:发布哪些app? 生成MobileProvision文件:生成一 ...
- python web应用--WSGI接口(二)
WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求.我们来看一个最简单的Web版本的“Hello, web!”: 1 # server.py 2 # 从wsgiref模 ...
- redis 对cmd的操作
这个是原子递增的知识点: 关于list部分: 利用lpush命令, rpush命令, lrange命令,对列表操作 此前 我已经 在列表(list)中 插入了 部分 元素了 关于集合set 部分 首先 ...
- 第5章 什么是寄存器—零死角玩转STM32-F429系列
第5章 什么是寄存器 集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料 ...
- MySQL事务隔离级别 解决并发问题
MySQL事务隔离级别 1. 脏读: 骗钱的手段, 两个窗口或线程分别调用数据库转账表,转账后未提交,对方查看到账后,rollback,实际钱没转. 演示方法: mysql默认的事务隔离级别为repe ...