在Visual Studio.NET中使用自定义插件最大化您的生产力
原文连接:http://msdn.microsoft.com/msdnmag/issues/02/02/VSIDE/print.asp
作者:Leo A. Notenboom
翻译:张翔 kilxy@hotmail.com
这篇文章假设您已经熟悉C#, Visual Basic .NET和CLR
难度程度 1 2 3
摘要
对于开发者来说,不管多么强大的集成开发环境(IDE)都需要具有自定义插件的功能。基于这个原因,Visual Studio. NET IDE提供了一个可扩展的、添加方便的而且还没有数量限制的自定义插件功能。这个自定义插件可以用Visual Basic、C、C#或则其它的.NET的使用的语言来编写。这篇文章解释了如何在Visual Studio. NET中增加一个自定义插件的例子。这个例子将演示如何通过自定义插件完成一个自定义的文本编辑功能,其中实现了两个功能,一个是在文本中简单的插入当前的日期,另一个是更加复杂的功能是实现重新格式化一段文本。最后您将学习如何在选项对话框中增加一个页。
如果您开始使用Microsoft Visual Studio .NET你应该知道他充满了新特征和技术。虽然,你肯能认为集成开发环境(IDE)是一个编写代码的简单的文本编辑器,它已经非常强大了。它提供的框架支持开发工具的插入而且是单一的无缝的可开发的。当然,IDE并不能满足所有的人,你或则我所要的功能可能并没有在这里。幸运的是IDE已经提供了可扩展的功能,它允许您扩展你所需要的任何东西。
开始
插件和宏是扩展IDE的两种方法。宏是可以被记录的和被立即执行的。因此,这是一种探索对象模型的强大的方法。宏使用一个以 .vsmacros 文件的形式来分布,通过双击这个文件来加载到宏编辑器中。宏在加载可用之后,宏就可以被使用者非常容易的修改。
另一方面,插件是编译的而且在分布之后就不能被修改。这样保护了你的知识财产。通过插件,你可以创建工具窗口这些操作对于Visual Studio.NET就像操作本地的功能一样。插件可以动态的改变菜单、工具条事件的状态和在帮助对话框中增加信息。插件是通过微软的安装文件(.MSI)来进行部署的,它可以轻易的安装和通过控制面板中的添加/删除程序对话框进行卸载。
创建一个插件的步骤在Visual Studio.NET的在线帮助中已经隐藏起来,同样也在Visual Studio.NET Automation Examples Web site中被隐藏了。我在这里不想介绍每一个的具体过程,但是可以回顾一下我创建一个插件所选择的过程。
创建一个插件首先要创建一个项目,在新建项目(New Projects)对话框其他项目(Other Projects)下面,你会发现扩展性项目(Extensibility Projects)。选择Visual Studio.NET外接程序(Visual Studio.NET Add-in)。图一显示了在一个点上的新建工程对话框。点击确定按钮开始向导。
图1创建一个新工程
对于我的插件,向导中的前三步都比较容易。第一步,我选择了C#语言作为插件的开发语言。第二步,我选择了Microsoft Visual Studio.NET作为插件的主机(host)。在您的插件中你当然可以包括VSMacros IDE。第三步,插件命名为“Text Editing Utilites”,并给出了适当的描述。
图2
在向导中的第四步,如图2所示,需要一些操作。
l 选择“是的,创建工具菜单项”。
l 确定“我的外接程序不提供……”没被选中。这个例子中我没有准备提供一个模式用户界面,但是如果你真的想更多的扩展你的插件功能,你可以选择此项。
l 确定“我希望我的外接程序在宿主程序启动时加载”没被选中。这样可以使调试是容易一些。插件的用户可以在以后的插件管理的操作中改变此选项。
l 我选择了“我的外接程序不仅仅……”选项。在我的计算机中我是真正的用户,同样我确认这个例子也是为了更多的开发者。这个选项仅仅是改变插件已经注册的用户。
第五步,你可以包含一些帮助信息。选中复选框,在下面输入任何的联系信息。现在,你可以完成向导,开始我们的插件。
下面列出了Connect对象的方法。这些方法是不完整的,可以在Connect.cs文件找到该类。这些你的新建项目的一部分。
l Connect::Connect。这是构造函数,在这里你可做简单初始化。
l Connect::OnConnection。这个方法是在IDE真正加载您的插件时调用。在这里你可以初始化你的插件,而且必须为IDE提供命令信息、制定键盘绑定等等。
l Connect::QueryStatus。这个方法是在适当的时候IDE确定当前状态时被调用。
l Connect::Exec。这个方法是IDE真正的执行命令是被调用的。
现在,所有的基础内容在这里,让我们开始开发一个简单的插件例子。