Visual Studio 2010中的扩展管理器

简介

\

扩展能够为核心应用程序提供附加的功能或者自定义设置。 在很多应用程序中这都是很流行的,包括流行的web浏览器IE和Firefox、微软的Office、媒体播放器、Photoshop、Eclipse、Visual Studio等等。其中有些可能比较新奇,而针对开发工具——像Eclipse和Visual Studio——的扩展让开发者的生产力得到了显著提高。

\

Visual Studio早期的版本是构建在COM技术之上的。 而Visual Studio的主要扩展方式插件是通过COM接口实现的。 随着时间的变化,插件机制已经得到了改善。 在2002年,随着Visual Studio .NET的发布,微软引入了.NET和COM之间的互操作性。 在Visual Studio 2005中,插件支持使用XML的简化部署方式。 之后不久,微软发布了Visual Studio SDK开发包,这是一种更为新式的机制,通过底层的API提供了与Visual Studio的IDE更深层次的整合。

\

随着时间的推移,Visual Studio扩展的部署技术也得到了改善。 在Visual Studio 2005中引入了Visual Studio 内容安装器(Content Installer VSI),它可以用于部署宏、插件、工具箱控件、代码片段以及模板。 而更广泛地用于应用程序安装的Windows安装包(MSI),则成为针对Visual Studio包的主要部署技术。 VSI和MSI格式的文件中都包含了完整的分发包。

\

这种设计导致了一些交付问题。 为了获得扩展,用户需要在不计其数的网络站点中搜索、下载和安装。 管理扩展的依赖关系和更新既不简单,也不易懂。

\

在Visual Studio 2010增加的多种新特性中,新的扩展管理器就是为了解决扩展部署问题的。 它遵循了一种新的用于发布和部署第三方扩展的趋势,这种趋势是由于像Firefox和Eclipse这样的项目而变得流行。

\

本文会向你介绍Visual Studio 2010的扩展管理器。 你会了解到如何构建简单的扩展,并把它部署到Visual Studio Gallery中。

\

崭新的用户体验

\

应用程序扩展是与核心应用程序分别发布的。 传统上认为它们更像是独立的应用程序。 尽管随着时间的推移,Visual Studio扩展性的很多方面都得到了改善,然而交付机制还是没有太多的改变。 它遵循的是双击工作流(double-clicking workflow),那并不容易。

\
  1. 在哪里能够找到扩展?\
  2. 如何管理扩展的生命周期,包括安装、更新和卸载?\

在过去,想要找到针对Visual Studio的正确的扩展,我们需要做大量的搜索工作。 开发者可以在Internet上搜索扩展,或者可以从杂志的文章中、论坛的帖子中或者博文中获得扩展的信息。但我们很难发现所有可用的选择,而且也很难对类似的扩展进行比较。

\

有了Visual Studio Gallery之后,这种状况已经得到了改变。 这个站点是Visual Studio扩展的官方和集中资源所在。 你可以浏览并且订阅扩展的RSS。 你还可以阅读评论,并提供你的反馈,对扩展打分。

\

Visual Studio 2010的扩展管理器是与Visual Studio Gallery结合使用的。 它把Visual Studio Gallery带到了Visual Studio IDE中(如图1所示)。 我们不再需要使用web浏览器来搜索或者运行安装程序了。 在Visual Studio 2010中,我们可以通过Tools | Extension Manager菜单来打开扩展管理器。 当扩展管理器打开之后,它会列出已经安装了的扩展。 如果对于扩展有更新可用,也会在其中列出来。 在左边的面板中,点击“Online Gallery”标签页,你就可以浏览和搜索在“Visual Studio Gallery”中可用的扩展了。 当你选择一项扩展,相关的描述就会显示在右侧的面板中。 点击“下载”按钮,扩展管理器马上就会开始下载选中的扩展。

\

Visual Studio 2010中的扩展管理器

\

图1 Visual Studio 2010的扩展管理器

\

有时,安装一项扩展需要重启Visual Studio。 这也没关系。 IDE会返回之前的样子,载入最新的解决方案。 删除扩展同样很容易。 通过Tools | Extension Manager 菜单打开扩展管理器,选择扩展,然后点击“Uninstall”按钮。

\

它不仅提供了简单的方式,让我们可以在Visual Studio IDE中搜索和安装扩展。 还提供了对扩展完整的生命周期管理。 我们还可以在Visual Studio IDE中对扩展进行启用/禁用、更新和卸载。

\

在扩展管理器中启用和禁用扩展的能力是值得一提的。 正如你将在本文的下一部分将会看到的,创建扩展并把它上传到Visual Studio Gallery中要比之前容易得多。 再也没有批准流程。 上传的内容马上就可以访问。 这可能有些风险。 某些扩展会有质量问题,或者与其它扩展冲突。 在那种情况下,禁用特性会为其提供帮助。

\

自动的扩展更新通知也是很棒的特性。 每次你打开VS 2010的一个实例的时候,它就会自动检查已经安装的扩展的更新。 当找到更新的时候,它就会在系统托盘中显示通知图标。 点击通知,它就会载入扩展管理器来安装新的更新。 这确保你能够拥有最新的扩展更新,而不需要手动地搜索更新。

\

有一些扩展对于开发者是必需的。 在Internet上,人们会告诉你他们最喜欢的扩展。 在此我列出了我所选择的部分。 建议你尝试使用它们。 那很容易,并且如果你不喜欢,总是可以禁用并卸载它们。

\
  • Visual Studio Productivity Power Tool,这是一组用于提高生产力的工具,像解决方案导航器、带有改良的标签页的用户界面、可搜索的添加引用对话框,等等。\
  • Snippet Designer,这种扩展让你可以在Visual Studio中创建代码片段。\
  • Spell Check,这种扩展为纯文本文件、注释、字符串和HTML/ASP代码提供了拼写检查功能。\
  • Tangible T4 Editor,这种扩展为T4模板提供了智能提示和语法的突出显示。\
  • GhostDoc,这是一种能够为C#生成XML文档注释的扩展。\
  • Feature Builder Power Tool,这种扩展会帮助你创建扩展。\
  • PowerGUI,这种扩展为PowerShell 脚本提供了智能提示和语法的突出显示。\
  • IronPython IronRuby Console,这种扩展让你能够在IronPython/IronRuby中与Visual Studio交互。\

扩展管理器的体验让我们想到了一些直观的流程,像下载软件到iPhone、下载插件到Firefox、以及从Amazon下载书籍到Kindle上等等。 这可能就是消费软件部署的趋势。 它是基于Internet或者云,并且与应用程序整合的部署方式。 根据最近在网上泄露的“Windows Store for Windows 8”,我们可能会在下一版本的Windows中看到这种软件部署方式。

\

现在,Visual Studio 2010扩展管理器和Visual Studio Gallery更加以扩展为中心。 将来,它会更加以用户为中心。 我希望它会记住我所选择的扩展,并在所有我登陆的计算机中应用那些扩展。

\

在“创建简单的扩展”部分中,我会一步一步地创建Hello World扩展。
\在尝试这些步骤之前,你需要确保已经下载并安装了Visual Studio SDK。

\

创建Visual Studio Package项目

\

首先,使用“Other Project Types | Extensibilities”下面的Visual Studio Package Project模板创建新的项目。

\

Visual Studio 2010中的扩展管理器

\

图2 Visual Studio Package Project 模板

\

它会载入Visual Studio Package向导,它有七页,我们可以在其中为Hello World包填写基本的信息。 这是很简单的过程。 在第三步中,我选择了“Menu Command”和“Tool Window”选项,从而展现最初针对菜单项和工具窗口的代码。(图3)

\

Visual Studio 2010中的扩展管理器

\

图3 创建菜单命令和工具窗口

\

检查项目结构

\

在创建了项目之后,让我们来检查其中都有什么。 有些东西是值得注意和说明的。

\

其中有一个source.extension.vsixmanifest文件。 在这个文件中,会生成我们在新建项目向导中输入的信息,还有包的引用和内容。 它拥有属于自己的编辑器(图4)。

\

Visual Studio 2010中的扩展管理器

\

图4 编辑器中的source.extension.vsixmanifest文件

\

在项目的属性页中,有一个新的VSIX标签页,让Visual Studio在调试扩展的时候,构建和/或部署VSIX的过程中创建VSIX文件。

\

Visual Studio 2010中的扩展管理器

\

图4.1 项目属性页中的VSIX标签页

\

在Visual Studio 2010之前,扩展是作为安装包部署的,这多少和单独的应用程序有些类似。 它们是在Visual Studio之外使用VSI或者MSI分别安装和维护的。 开发者经常会认为编写Visual Studio扩展很难,或者那不是一般开发者所能够完成的。那是对的。 此外,为Visual Studio扩展创建安装包更困难。

\

为了给Visual Studio 2008扩展创建安装包,MSDN上的一篇文章“教程: 简单的VSPackage部署”建议使用xcopy、安装项目,或者使用Windows Installer XML Toolset (WiX)。 在所有情况下,开发者都不得不学习MSI、WiX,或者理解注册表的键值以注册扩展。

\

使用安装项目的方法,开发者需要编写自定义的安装动作来注册扩展。 使用WiX既耗时又容易出错,因为那需要手动编辑XML文件,并且维护很多GUID值。 默认情况下,WiX安装只有最少的功能。 开发者需要操作更多的XML文件来提供功能,像定义安装文件夹以及显示许可信息等等。

\

在Visual Studio 2010中,对于开发扩展至少在两个方面做出了改进。 使用VSIX来对扩展打包更容易。 VSIX是在Visual Studio 2010中引入的针对扩展的部署单元。VSIX文件是一种使用了开放打包协议(Open Packaging Convention)的压缩文件。 我们可以从本地硬盘中像VSI和MSI的方式安装VSIX。 Visual Studio会识别出VSIX的文件扩展名,把它解压并把文件安装在正确的位置中。 它还可以通过Visual Studio Gallery进行发布和升级。 当你构建扩展项目的时候,Visual Studio 2010扩展项目模板就会生成VSIX文件。

\

在Visual Studio 2010中,开发者需要处理XML文件。 但是开发者不需要编辑原始的XML文件,Visual Studio 2010为其提供了编辑器。 那就是新的VSIX说明文件编辑器(图3)。 你所需要做的就是指定相同的VSIX ID——唯一的标识符,以及新的版本号。 然后把它上传到Gallery中,这样拥有旧版本的用户就可以下载更新。

\

VSIX本质上是一种简单的xcopy部署方式。 安装就是要对包进行复制和解压。 卸载只是删除文件夹。 它不支持高级的安装特性,像为GAC添加程序集或者创建桌面快捷方式等等。 它也不会在Visual Studio之外写入注册表。 它不支持自定义的动作。 MSDN上名为“Visual Studio 扩展部署”的文章对VSIX和MSI能做的和不能做的做了详细的说明。

\

VSIX主要是为了Visual Studio扩展部署而设计的,并且使用Visual Studio Gallery来发布。

\

构建项目

\

在构建了项目之后,构建的输出包括封装后的DLL、包定义文件(pkgdef)以及VSIX文件(图5)。

\

VSIX文件是包的部署文件,你可以把它发送给用户来进行安装,或者上传到Visual Studio Gallery中。

\

Visual Studio 2010中的扩展管理器

\

图5 构建输出

\

调试和运行扩展

\

在项目的属性页中,调试选项被设置为载入Visual Studio实验环境。(图6)

\

Visual Studio 2010中的扩展管理器

\

图6 项目的调试设定

\

按下F5,就会载入部署了VSIX的Visual Studio实验环境的新实例。 Visual Studio实验环境会与Visual Studio开发环境并行运行。 它是用于开发和测试Visual Studio包的沙盒环境。 部署在实验环境中的包不会影响你的主开发环境。 实验环境拥有自己的设定、注册表项和扩展。 我们可以使用开始菜单中的“重置微软Visual Studio 2010实验实例”选项,把它重置为干净的状态。

\

我们创建的简单扩展会在Tools菜单下添加“Hello World”菜单项(图7),并在“View | Other Windows”下添加“Hello World Tool Window”菜单(图8),我们可以使用它来显示工具窗口(图9)。

\

Visual Studio 2010中的扩展管理器

\

图7 Toos菜单下的“Hello World”菜单

\

Visual Studio 2010中的扩展管理器

\

图8 “View | Other Windows”下的“Hello World Tool Window”菜单

\

Visual Studio 2010中的扩展管理器

\

图9 扩展的工具窗口

\

包的主要入口点在于Microsoft.VisualStudio.Shell.Package的子类中。它拥有多个与包的注册相关的属性,我们会在安装和注册的过程中使用它们。(图10)

\

Visual Studio 2010中的扩展管理器

\

图10 Package类

\

你可以在名为Initialize的重载函数中编写代码,从而在载入你的包时与Visual Studio交互。 在我们简单的包中,“Hello World”和“Hello World Tool Window”菜单都是在这个初始化函数中创建的 。

\

Visual Studio 2010中的扩展管理器

\

图11 Initialize函数

\

菜单的回调函数是MenuItemCallBack和ShowToolWindow。 当点击“Hello World”菜单的时候,就会触发MenuItemCallBack 函数。 默认的代码是要显示一个消息框。 它是你的包逻辑的起始点。 当点击“Hello World Tool Window”菜单的时候,就会触发ShowToolWindow 函数。 默认的代码是以标准的方式弹出工具窗口。

\

工具窗口是Visual Studio IDE的子窗口。 和工具箱、解决方案管理器和属性窗口一样,它可以停靠、浮动或者以标签的形式显示在文档框架中。 它们是动态的(或者说是自动可见的)。 有了Visual Studio 2010对多显示器的支持,工具窗口也可以脱离开来,并拖拽到第二台显示器中。 Visual Studio Package Project模板默认情况下会为工具窗口创建WPF的用户控件。

\

现在我们已经有了Visual Studio Package的骨架,可以构建他来生成可以分发的VSIX文件,我们或者可以通过复制的形式或者通过Visual Studio Gallery来分发它。

\

发布到Visual Studio Gallery

\

想要通过Visual Studio Gallery来发布扩展,只需要三步,就可以发布你的扩展,从而让全世界的开发者都能够访问到它。

\
  • 选择你的扩展的类型\
  • 上传VSIX文件\
  • 添加附加的类别和描述。\

Visual Studio Gallery会从VSIX中取得元数据,包括名称、ID、版本、公司、许可以及产品的图片。 扩展管理器会使用版本号来自动管理扩展的更新。

\

Visual Studio 2010中的扩展管理器

\

图12 Visual Studio Gallery

\

当你的扩展有新版本时,你所需要做的就是在VSIX的说明文件编辑器中更改版本号,构建新的VSIX文件并上传到Visual Studio Gallery中。 这样,更新就马上可以提供给用户下载了。 当用户启动Visual Studio新的实例时,Visual Studio就会在系统托盘显示新的更新通知。

\

有时这是很方便的,因为Visual Studio Gallery没有验证过程。 发布扩展就像在推特上发布一条消息一样简单。 对扩展开发者的一项提示是,你应该尽可能地测试以保证质量。 你不应该先上传扩展,然后才开始测试,因为它马上会被大家所发现。 VSIX支持双击安装,就像VSI和MSI一样。 如果其中有bug,那么就使用扩展管理器来卸载它,创建新构建的VSIX,然后双击它来安装并进行测试。 在开发过程中,你不需要提升版本号。 记着在完整地测试之后在把它上传到Visual Studio Gallery中。

\

这会带来另一种提示。 Visual Studio Gallery不支持私有分发。 如果你的扩展只在你的公司的开发者中使用,那么你就不应该把它上传到Visual Studio Gallery中。 相反,你应该在公司内部发布VSIX文件。 在这种情况下,想要更新扩展,你需要手动地与扩展用户沟通。

\

Visual Studio Gallery的目的之一就是要创建Visual Studio扩展的生态系统。 自从几年之前它可以用于Visual Studio 2008开始,人们已经上传了上千个扩展。 与其说是一种商业集市,不如说是一种社区分享站点,就像Apple的App Store和Windows Phone Marketplace一样。 如果开发者想要销售他们的扩展,那么就需要找到其它厂商和付费服务,就像旧式的共享软件发布一样。 用户无法通过扩展管理器付费。 结果是,扩展管理器和Visual Studio Gallery为开源和免费的扩展项目提供了优秀的支持。

\

总结

\

Visual Studio 2010的扩展管理器和Visual Studio Gallery提升了扩展用户和扩展开发者的用户体验。 你应该始终记着,那里有成千上万的扩展可供你扩充Visual Studio的特性。 还应该始终记着,你可以在Visual Studio中搜索和管理扩展的生命周期。 如果你对于扩展Visual Studio有什么好主意,那么我建议你试着创建一些Visual Studio扩展。 Visual Studio扩展会提升开发的生产力。

\

查看英文原文:Extension Manager in Visual Studio 2010

\

感谢侯伯薇对本文的审校。

\

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至[email protected]。也欢迎大家加入到InfoQ中文站用户讨论组中与我们的编辑和其他读者朋友交流。