快捷搜索:

(翻译)LearnVSXNow!-#5 VSX的基本概念

在前几篇文章中,我们只是经由过程创建和“阐发”三个异常小的、由VSPackage领导天生的package来坐井观寰宇见识了一下VSX。这些例子有助于我们认识创建小的package的基础步骤。然则,我们必须更深入一些, 看一下Visual Studo IDE是如何事情的,以及它是如何集成package的。

在我们涉及到其他细节之前,我们先要收拾一下对VSX的熟识。在本篇文章里,我们不会创建任何代码,只是试图去搞清楚和VSX相关的观点。

警告:“底层用的是COM”

我在前面几篇文章中多次提到过,Visual Studio扩展性开拓是基于COM技巧的。package中的工具和实体(例如敕令、菜单、对象栏、窗口、编辑器、项目等)都是COM工具。当然,假如我们用的是托管代码(例如C#、VB.NET),我们看到这些类和实例是托管的.NET类型和实例。但假如我们用了非托管代码,我们不得不处置惩罚COM工具和实例。

在开拓VSX的代码时,之以是可以用很多模式和特点,是由于VSX里里外外都用了COM。我假设你对COM没有太深入的理解(我自己也不是一个COM专家),但我待会会奉告你一些必须要懂得的根基常识。

什么是Visual Studio Package?

在前几篇文章中,我们创建了几个简单的Visual Studio Package,以是我们已经对VSPackage有了一个初步的熟识,现在让我们更深入的探究一下它。

VSPackage是构建Visual Studio的一个基础的单元。实际上,Visual Studio是由一系列的VSPackage协同事情而成的,就像一个生态系统一样。一个Package,不论是从VS体系布局上来看,照样从支配、安然和许可认证方面来看,它都是VS的一个基础单元。别的,在物理上,一个或多个package可以存在于同一个法度榜样集中。

开拓者(包括Visual Studio的开拓者)经由过程创建VSPackage来扩展VS IDE。这些扩展可所以:

办事(Service)。办事是一些工具,它们供给功能供开拓者或者其他package调用。例如,C#说话办事(顾名思义)是一个办事。

界面元素。例如菜单、对象栏、窗口等,开拓者可以用它们在用户界面上履行一些动作,显示消息、信息和图片等等。

编辑器。在开拓历程中,我们经由过程编写法度榜样去创建利用法度榜样。编写法度榜样这项义务是由编辑器认真的。Visual Studio 2008有它自己的核心编辑器,然则我们也可以在VSPackage中创建我们自己的编辑器。

设计器。利用法度榜样的创建不光是简单的敲入文本这么简单。我们拥有很多被称为设计器的可视化对象,我们可以使用他们来设计模块、组件、零部件、以致全部利用系统。闻名的例子是WinForm设计器,我们可以用它来创建WinForm的用户界面。

项目。当开拓利用法度榜样的时刻,我们一样平常会面向一大年夜堆的文件。项目用来组织这些源文件和资本,并且不是简单的存储这些文件这么简单,它还可以用来编译、调试和宣布由源文件创建的产品。

在后面的文章中,我们将一一探究这些扩展的细节,本日在这里我先给大年夜家一个基础概述来阐明它们是什么,以及它们若何在VS中应用。

别的,一个package可以在Visual Studio的启动界面里或在关于对话框里显示它自己的信息。

一个package可以把它的状态和设置设置设备摆设摆设信息保存在持久化存储设备中,并且可以读取这些设置设置设备摆设摆设。例如文本编辑器可以设置语法高亮、字体、颜色、标签等。

每个package必须被所谓的package load key(PLK)署名,Visual Studio经由过程它来反省package的合法性。Visual Studio只会加载拥有合法PLK的package。别的,从技巧上来说,Package是实现了IVsPackage接口的类型。这一次我们不会深入评论争论IVsPackage,但在后面的文章中,我们将经由过程代码来测试它的细节。

什么是办事(Service)?

一样平常来讲,我们不会为了开拓package而开拓package。我们创建package是由于它们不只可以为我们自己供给功能(此时,我们是破费者),也可以为其他的package供给功能(此时,其他package是破费者)。例如,假设我们的package供给了一个对象窗去查找特定措施的引用,我们便是这个窗口的破费者。假如这个package不仅为这个对象窗供给查找功能,也作为“可调用的措施”为其他package办事,那么其他package便是这个办事的破费者。

以是,办事是package之间或package和与它相关的工具(当我说“package的工具”时,我指的是窗口、敕令、设计器等这些被package自己创建的器械)之间的左券。

下图阐清楚明了VSPackage和办事之间的观点:

(译者注:异常遗憾,这里缺图。原文中的图片链接已经无效,联系了原文作者但不停没有回应,今后假如找到这个图片必然补上。)

VSPackage可以包孕办事,这些package被称为service provider。在上图中,VSPackage1和VSPackage3是service provider,而VSPackage2不是。能给其他package调用的办事被称为全局办事(global service)。VsPackage1和VsPackage3都包孕global service,这些办事可以被VSPackage2调用(当然也可以被其他的package调用)。package也可以包孕只能被自己调用或者只能被package的工具调用的办事。这种办事被称为本地办事(local service)。VSPackage1和VSPackage3都包孕local service,它们被工具调用(例如被VSPackage1中的编辑器和VSPackage3中的对象窗)。

应用Service

关于VSX中的办事,有一个坏消息:它们是隐蔽的,不轻易被发明。这意味着我们不能预测出一个package(或其他工具)中能供给哪些办事。

以是,假如你想应用一个办事,你必须“经由过程它的名字调用它”,这意味着你必须知道这个办事的名字。要知道办事的名字,独一的措施是去查阅这些办事所在package供给的文档。VSX的文档里列出了大年夜概130个办事。

一样平常来说,办事被定义成接口。大年夜部分办事只实现一个接口,但也有一部分办事实现了多个。以是,当我们想应用一个办事的时刻,我们必须要知道两个“名字”:办事的名字和接口的名字。

你大概留意到了,我在“名字”这里用了引号。这是由于所有的办事都是工具。假如我们用的是interop类型,“名字”便是它们的.NET类型;假如我们用的是COM工具(非托管代码),“名字”便是这些COM类型的GUID。

让我们用一个例子来更清楚的阐明它!在SimpleCommand里,我们应用SVsUIShell办事去显示一个消息框,我们用GetService措施去得到一个IVsUIShell接口的引用:

1: IVsUIShell uiShell = (IVsUIShell)GetService(typeof(SVsUIShell));

2: uiShell.ShowMessageBox(...);

您可能还会对下面的文章感兴趣: