前言

VS概览中,我们简单回顾了一下VS的历史。本文将通过两个简单的例子来说明Macro和Add-In的开发。通过Macro我们把VS中的一些重复操作录制下来,之后可以多次运行,节省时间并保持好的心情;通过Add-In,我们可以自己动手来为VS添加新的功能,扩展了VS就意味着扩展了我们自己。

VS 2008扩展方式一览

在上篇VS概览中提到了扩展VS有三种主要的方式:Macro、Add-In和VsPackage。事实上,还有更多的选择,这里先简单列一下:

  • Macro
  • Add-In
  • VsPackage
  • VS Shell
  • Domain Specific Language Tool
  • Visualizer
  • Code Snippet
  • Project/Item Template
  • MSBuild

甚至External Tools(菜单Tools->External Tools)也可看作是一种扩展方式,我们可以将外部工具添加到VS菜单中,这样使用起来会更方便一点。之前曾写过关于VS中的模板Code Snippet的随笔,它们属于比较简单的扩展方式了。

在本文中将简单介绍一下Macro和Add-In的用法,它们可以访问共同的API,既然这样,了解一下Macro对Add-In的开发也会有帮助,然后就正式步入Add-In的开发。之后对于其它的扩展方式也会尽量多介绍一点。

开发第一个Macro

作为程序员,我们在编写代码的时候害怕重复,它的危害人人知晓。另一方面,对于某些操作,如果经常重复进行也会让人厌烦,Macro此时也许能帮得上忙。

Macro一般翻译为,它的一个含义是“大量使用的”,这个词对于我们Windows平台下的开发人员来说应当不陌生,在Word和Excel中都有它的身影。宏的作用是将我们在VS中的一些重复操作录制下来,之后可以多次运行,也就可以节省很多时间,心情也会因此变得好一点。

在VS中,宏可以用两种方式来创建,一是录制,二是手工编写代码。可以想见的是,第一种方式更为简单,第二种方式则更为灵活、强大。需要注意的是,当前只能用VB.NET来开发宏

以前我曾用VBA开发过简单的Excel自动化,当时如果某些操作不知如何用代码表示,就录制一个宏,看看它生成的代码。VS中的宏与此类似,这也是为什么我说对Add-In开发也有帮助了。我们可以将前面说的两种方式结合起来使用,看看下面的例子。

1)Macro Explorer

通过菜单Tools -> Macros -> Macro Explorer(快捷键Alt+F8)打开Macro Explorer:

它的结构看起来有点像Solution Explorer。在Macros上点击右键,选择New Macro Project...,我这里把宏命名为FirstMacro,将其设置为录制项目:

2)录制宏

现在可以进行录制了,按下Ctrl+Shift+R,这时会出现一个小工具栏,可以暂停、停止或取消一次录制(如果某些操作不想录制,就可以将它暂停)。然后执行以下操作:

  • 按下Ctrl+F打开Find and Replace对话框
  • 输入":a+"(含引号),查找范围为Current Document,然后选择使用正则表达式
  • 点击Find Next
  • 按下Ctrl+Shift+R停止录制

3)运行宏

这个简单的宏可以用来查找当前文档内硬编码的字符串。按下Alt+F8打开Macro Explorer,可以看到新录制的宏TemporaryMacro:

通过右键菜单运行它,怎么样,是不是很方便涅?现在打开另一个文件,再次运行宏。奇怪的是,还是在刚才的那个文件内查找!看来刚才在录制的时候把文件名也录制进去了,这时我们利用第二种方式:手工编写代码。

4)修改宏

参考上图,在TemporaryMacro上点击右键,对它进行编辑。在新打开的Macro IDE内可以看到如下代码:

VB.NET Code
    Sub TemporaryMacro()
        DTE.ExecuteCommand("Edit.Find")
        DTE.Windows.Item("ListViewSample.cs").Activate()
        DTE.Find.FindWhat = """:a+"""
        DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument
        DTE.Find.MatchCase = False
        DTE.Find.MatchWholeWord = False
        DTE.Find.Backwards = False
        DTE.Find.MatchInHiddenText = True
        DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxRegExpr
        DTE.Find.Action = vsFindAction.vsFindActionFind
        If (DTE.Find.Execute() = vsFindResult.vsFindResultNotFound) Then
            Throw New System.Exception("vsFindResultNotFound")
        End If
    End Sub

果然,这里包含了刚才打开的文件名,把这一行注释掉。另外最后的异常信息也不喜欢,改成"Sorry, I cannot find it:("。

VB.NET Code
    Sub TemporaryMacro()
        DTE.ExecuteCommand("Edit.Find")
        'DTE.Windows.Item("ListViewSample.cs").Activate()
        DTE.Find.FindWhat = """:a+"""
        DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument
        DTE.Find.MatchCase = False
        DTE.Find.MatchWholeWord = False
        DTE.Find.Backwards = False
        DTE.Find.MatchInHiddenText = True
        DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxRegExpr
        DTE.Find.Action = vsFindAction.vsFindActionFind
        If (DTE.Find.Execute() = vsFindResult.vsFindResultNotFound) Then
            Throw New System.Exception("Sorry, I cannot find it:(")
        End If
    End Sub

这样使用起来就没问题了。

通过这个小例子我们应当对Macro的用法有基本的了解了。不仅可以编写有用的宏,还可以通过宏来帮助编写Add-In,比如通过上面的代码,我们就可以知道如何打开查找和替换对话框了。下面再来编写我们的第一个Add-In。

开发第一个Add-In

相信有很多人用过Add-In(一般译作插件,这里保留不译),常见的如DPack、TestDriven.NET、GhostDoc等等,这些我都曾经介绍过(至于ReSharper、Visual Assist X等很棒的Add-In,没钱买,又不愿用破解版,故没有尝试)。Add-In与VS环境完全集成,可以为VS添加新的功能。

Add-In可与宏访问相同的API,但是VS处理起来有所不同。宏是可被VS运行的源代码,但没有集成到IDE中,它不被编译为程序集,要分发宏只能使用源代码。而Add-In呢,会被编译为dll,然后VS启动时加载它,这样它就与IDE集成在了一起,部署的时候不需要源代码。另一个区别是,当前只能用VB.NET开发宏,而对于Add-In来说,任何.NET下的语言都可以使用,如C#、VB.NET和VC(理论上来说F#当然也可以,但还没做过尝试)。

Add-In可以操作解决方案、项目、文件、编辑器,也可以操作VS中的各个工具窗口。可以说,它是扩展VS的一种比较专业的方式。下面来看看如何开发我们的第一个Add-In,它的功能是向编辑器内插入当前的日期,不管怎样,还是有一点点用处。

1)Add-In Wizard

新建一个项目:

在Other Project Types->Extensibility中可以看到Add-In项目模板,项目名称设置为FirstAddin,OK。出现欢迎界面,点击Next,进入向导第一步,选择一种语言,如C#,点击Next进入第二步。

这里可以选择Add-In运行的宿主环境,只保留VS 2008,Next进入第三步,设置Add-In的名称和描述信息,进入第四步:

选中第一个选项,这样VS会在Tools菜单中添加一个新菜单项,剩下的部分一路Next下去即可。最后VS会创建一个新的项目,其中包含了Connect.cs文件,这就是今后我们的主战场了。

打开Connect.cs,如果这是你的Add-In初体验,也许会觉得代码有些奇怪,进而感觉有些慌乱,不用担心,很快你就会熟悉它了。找到OnConnection方法,Add-In就是在这里加载,搜索文本"commands.AddNamedCommand2"(大约在77行),这一行创建了一个新的菜单项,将其AddNameCommand2的第二、三个参数都改为"InsertDate"。将QueryStatus和Exec方法稍作修改:

C# Code - QueryStatus 和 Exec方法
public void QueryStatus(string commandName, )
{
    if(neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
    {
        if (commandName == "FirstAddin.Connect.InsertDate")
        {
            status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported|vsCommandStatus.vsCommandStatusEnabled;
            return;
        }
    }
} public void Exec(string commandName, )
{
    handled = false;
    if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
    {
        if (commandName == "FirstAddin.Connect.InsertDate")
        {
            TextSelection selectedText = _applicationObject.ActiveDocument.Selection as TextSelection;
            selectedText.Text = DateTime.Now.ToShortDateString();             handled = true;
            return;
        }
    }
}

按下F5进行调试,此时打开一个新的IDE窗口,在新的窗口中可以测试Add-In的功能,随便打开一个解决方案,然后打开一个代码文件,查看Tools菜单:

点击新菜单项,看看编辑器内是不是插入了当前日期?注意,这个菜单项只有在调试的时候才会出现。

好,我们第一个Add-In也创建成功了。它颇为简陋,而且菜单项放在编辑器的上下文菜单中会更好,这里先放一放,在后面的文章中我会对此作出修改。

可以在这里下载代码。第一次使用Google Code,感觉很不错。

我们身在何处

本文将通过两个例子说明了Macro和Add-In的开发。希望这些能让你对两者有个基本的认识。在随后的随笔中,我将对Add-In展开详细的介绍。

参考

《Professional Visual Studio® 2008 Extensibility》
《Working with Microsoft Visual Studio® 2005》

转载自:http://www.cnblogs.com/anderslly/archive/2009/02/25/first-macro-addin.html

谢谢浏览!

【转】Visual Studio 2008 可扩展性开发(二):Macro和Add-In初探的更多相关文章

  1. 本周ASP.NET英文技术文章推荐[02/03 - 02/16]:MVC、Visual Studio 2008、安全性、性能、LINQ to JavaScript、jQuery...

    摘要 继续坚持,继续推荐.本期共有9篇文章: 最新的ASP.NET MVC框架开发计划 Visual Studio 2008 Web开发相关的Hotfix发布 ASP.NET安全性教程系列 ASP.N ...

  2. Windows 7 Visual Studio 2008配置OpenGL开发环境

    Windows 7 Visual Studio 2008配置OpenGL开发环境 glut下载地址: http://www.opengl.org/resources/libraries/glut/gl ...

  3. C#语言是专门为.NET提供的开发语言(visual studio 2008序列号)

    .net是微软的一个平台在这个平台上的语言有C#.C++.VB等,其中C#是专门为.NET平台开发的语言,语法简洁美观.建议安装visual studio 2008,你可以去微软官方下载90天试用版, ...

  4. Visual Studio 2008破解激活升级方法

    声明:本文中涉及到的序列号及更新方法均来自互联网,请支持正版. 微软为业余爱好者.热衷者和学生提供了免费版——Express Edition (轻型.易学.易用的开发工具). 如不想支付任何费用,建议 ...

  5. VISUAL STUDIO 2008 WINDOWS FORM项目发布生成安装包详解(转)

    转自:http://www.cnblogs.com/killerofyang/archive/2012/05/31/2529193.html Visual Studio 2008 Windows Fo ...

  6. 关于在Visual Studio 2008/2010 和Opencv平台下出现LINK : fatal error

    http://blog.sina.com.cn/s/blog_9015f3230101bbef.html 关于在Visual Studio 2008/2010 和Opencv平台下出现LINK : f ...

  7. Visual Studio 2008常见问题

    1.asp.net在什么软件上运行?学习asp往往需要测试asp程序,电脑不能直接测试,需要装IIS才能运行,但装IIS要么需要安装盘,要么需要安装包,而且设置也很复搜索杂.这里给大学推荐两个替代II ...

  8. LINQ体验(1)——Visual Studio 2008新特性

    一.写本系列的目的 我平时利用课余零碎时间来学习ASP.NET3.5.LINQ.Silverlight.ASP.NET 3.5 Extensions等新东西,通过笔记形式来记录自己所学的历 程.也给大 ...

  9. 安装了SQL2005再安装SQL 2008R2,提示此计算机上安装了 Microsoft Visual Studio 2008 的早期版本和检查是否安装了 SQL Server 2005 Express 工具的解决方案

    工作电脑上安装了SQL 2005, 但是客户电脑上安装的是SQL 2008R2,有时候连接他们的库调试没法连接,很不方便.然后又安装了个SQL2008 R2,期间遇到这两个问题,网上搜索了一下收到了解 ...

随机推荐

  1. ABAP ALV显示前排序合并及布局显示

    有时候会有用户要求显示出来的ALV立即就是升序或者降序,或者是上下同一个字段值一样的情况显示一次,如 变为 这个时候内表用SORT有时候会不好用,可以使用函数 REUSE_ALV_GRID_DISPL ...

  2. Python-标准库(常用模块)

    前言: 之所以为不同模块划分重要程度,是因为大家不不可能精力一直集中,也不可能一下掌握所有, 但这个并不表示重要度低的可以不用掌握 ! 你必须掌握的点是每个模块分别干什么事,今后在需要实现某些功能时能 ...

  3. Java关键字之abstract、final、static用法

    abstract:即抽象的,可以修饰类.方法: 修饰类:当有一个方法为抽象方法时,这个类就是抽象类,抽象类不能被new,它是一个不完整的类. 修饰方法:这个方法就是抽象的,即只能方法的定义,没有方法的 ...

  4. Linux常见目录说明

    常见目录说明 目录 应放置档案内容 /bin/ 存放二进制可执行文件,系统的命令(ls,cat,mkdir等),是/usr/bin/目录的软链接. /sbin/ 存放系统命令,超级用户可以执行.是/u ...

  5. 关于 Android 状态栏的适配总结

    1.要求状态栏透明,我们的内容布局延伸到系统状态栏,就是人们口中说的沉浸式状态栏: Android 5.0 及其以后版本:设置属性 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCR ...

  6. [b0031] python 归纳 (十六)_线程同步_锁

    # -*- coding: utf-8 -*- """ 学习 多线程同步 使用锁 threading.Lock() 逻辑: 2 个线程,操作同一个整型变量,一个加法,另外 ...

  7. 字符串和id的转换方法

    在项目中经常会遇到一个需求就是字符串和id的转换,比如标签和标签id.因为在存储系统里面存储字符串会比较浪费内存,而存储id会节省内存和提高效率. 问题分解 通过字符串获得id 通过id获得字符串 实 ...

  8. 配置oracle的ssl连接

    配置oracle的ssl连接   网上也没有中文资料,我硬着头皮看官方文档肯完,终于配置成功,下面是我配置步骤 配置安全套接层连接oracle 目录 1.        配置简介        1 2 ...

  9. mysql判断是否包含某个字符的方法和修改表中指定字段

    用locate 是最快的,like 最慢.position一般实战例子:select * from historydatawhere locate('0',opennum) and locate('1 ...

  10. CodeForces - 1260C(贪心+思维)

    题意 https://vjudge.net/problem/CodeForces-1260C 有一串砖,凡是r的倍数而不是b的倍数必须涂红,凡是b的倍数而不是r的倍数必须涂蓝,是公倍数则选一个涂.把涂 ...