写点什么

Visual Studio 2010 中的扩展管理器

2010 年 11 月 11 日

简介

扩展能够为核心应用程序提供附加的功能或者自定义设置。 在很多应用程序中这都是很流行的,包括流行的 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”中可用的扩展了。 当你选择一项扩展,相关的描述就会显示在右侧的面板中。 点击“下载”按钮,扩展管理器马上就会开始下载选中的扩展。

图 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 模板创建新的项目。

图2 Visual Studio Package Project 模板

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

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

检查项目结构

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

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

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

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

图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 中。

图 5 构建输出

调试和运行扩展

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

图 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)。

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

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

图 9 扩展的工具窗口

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

图 10 Package 类

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

图 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、版本、公司、许可以及产品的图片。 扩展管理器会使用版本号来自动管理扩展的更新。

图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 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2010 年 11 月 11 日 00:005075
用户头像

发布了 340 篇内容, 共 111.4 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

低/零代码会让程序员失业吗?

代码制造者

程序员 低代码 零代码 信息化 编程开发

看前谷歌工程师是如何副业赚钱的?

非著名程序员

程序员 个人成长 副业赚钱 提升认知

SpringBoot系列(二):如何灵活使用SpringBoot

xcbeyond

Java 微服务 springboot

JAVA位运算

彭阿三

Java 位运算

别让非理性思维毁了你的人生

看山

随笔杂谈 非理性 认知偏差 自控术

微软看上的Rust 语言,安全性真的很可靠吗

华为云开发者社区

数据库 开源 rust 安全 代码

解析中美数字货币竞争战略 | 构建属于“人类命运共同体”的货币体系

CECBC区块链专委会

数字货币 人民币

奋斗在一线大城市的年轻人的生活工作实录(工厂蓝领篇)

Learun

程序员 软件开发 故事 企业信息化 短片小说

Cobra 命令自动补全指北

郭旭东

go cobra

LeetCode题解:88. 合并两个有序数组,for循环合并数组+sort排序,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

《深度工作》学习笔记(完)

石云升

读书笔记 时间管理 专注 深度工作

我国开启“逆袭战”,区块链的盛夏来了?

CECBC区块链专委会

云计算 区块链技术

流量明星翻车的“直播卖房”,为什么众盟做成了?

脑极体

一文搞懂Flink rocksdb中的数据恢复

shengjk1

大数据 flink源码

网站域名备案怎么做?有哪些快速备案的方法?

姜奋斗

网站 备案 网站搭建 域名解析 网站平台

神经网络的学习为何要设定损失函数?

王坤祥

神经网络 学习 损失函数

普通工程师简史

郭华

SpringBoot系列(三):SpringBoot特性_SpringApplication类(自定义Banner)

xcbeyond

Java 微服务 springboot Banner

DSN 主流项目调研 3——Orbit数据库的故事

AIbot

区块链 分布式存储 IPFS 分布式文件 Orbit

DSN 主流项目调研 2——Sia和SAFE Network

AIbot

区块链 分布式存储 分布式文件存储 Sia SAFENetwork

核心稳定、易扩展——开放关闭原则(The Open-Closed Principle)

晃来晃去的萨麦尔

编程习惯 架构分析 软件设计原则

SpringBoot 系列(一):SpringBoot项目搭建

xcbeyond

Java 微服务 springboot

易观CTO郭炜:如何构建企业级大数据Ad-hoc查询引擎

易观大数据

致远互联A6+Cloud C位出道 赋能中小企业乘风破浪

爱极客侠

Windows AD日志分析告警平台—WatchAD安装教程

Young先生

监控 windows 日志 AD 告警

《深度工作》学习笔记(6)

石云升

读书笔记 专注 深度工作

Django查看操作数据库的执行命令

Young先生

数据库 django 操作

流媒体云时代的声与色,融云铺就的桥与路

脑极体

Django中的session的使用

Young先生

django session Cookie

关于微服务架构的一些思考

俊俊哥

微服务

手抖了

shengjk1

随笔杂谈

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

Visual Studio 2010中的扩展管理器-InfoQ