管线开发
外接程序管线是管线段的路径,宿主应用程序及其外接程序必须使用管线段来互相进行通信。
下面的插图显示了通信管线及其段。
外接程序管线
宿主应用程序位于管线的一端,外接程序位于管线的另一端。 宿主应用程序和外接程序分别从各自的端开始向中间移动,它们都具有一个抽象基类,用于定义它们共享的对象模型的视图。 这些类型(类)组成外接程序视图管线段以及外接程序管线段的宿主视图。 外接程序视图管线段通常包含多个抽象类,但外接程序从中继承的类称为外接程序基。
外接程序端适配器管线段和宿主端适配器管线段转换其视图管线段和协定管线段之间的类型流。 管线的中段是从 IContract 接口派生的协定。 此协定定义宿主应用程序及其外接程序都将使用的方法。
如果将宿主和外接程序加载到不同的应用程序域,则您就会拥有将宿主应用程序范围与外接程序范围分开的隔离边界。 协定是唯一同时加载到宿主和外接程序应用程序域中的程序集。 宿主和外接程序只引用它们各自的协定方法视图。 因此,它们被一个抽象层从协定中隔离开。
若要开发管线段,必须创建包含管线段的目录结构。 有关开发要求以及范围准则的更多信息,请参见管线开发要求。
下面的插图显示了组成管线段的类型。 插图中显示的类型名称是任意的,但除宿主和外接程序宿主视图之外的所有其他类型都需要特性,以使构造信息存储区的方法可以发现它们。
具有类型的外接程序管线
下表介绍了用于激活外接程序的管线段。 有关这些段的更多信息,请参见协定、视图和适配器。
管线段 |
说明 |
---|---|
宿主 |
创建外接程序实例的应用程序程序集。 |
外接程序的宿主视图 |
表示用于与外接程序通信的对象类型和方法的宿主应用程序的视图。 宿主视图是一个抽象基类或接口。 |
宿主端适配器 |
具有一个或多个类的程序集,该程序集调整方法以使其适合协定,或者调整协定以使其适合方法。 此管线段使用 HostAdapterAttribute 特性来标识。 不支持多模块程序集。 |
协定 |
派生自 IContract 接口并定义宿主及其外接程序之间的通信类型协议的接口。 此管线段通过设置 AddInContractAttribute 特性来标识。 |
外接程序端适配器 |
具有一个或多个类的程序集,该程序集调整方法以使其适合协定,或者调整协定以使其适合方法。 此管线段使用 AddInAdapterAttribute 特性来标识。 包含具有 AddInAdapterAttribute 特性的类型的外接程序端适配器目录中的每个程序集都将加载到外接程序的应用程序域中。 外接程序端目录中的每个程序集都加载到其自己的应用程序域中。 不支持多模块程序集 |
外接程序视图 |
一个程序集,表示用于与宿主通信的对象类型和方法的外接程序的视图。 外接程序视图是一个抽象基类或接口。 此管线段使用 AddInBaseAttribute 特性来标识。 包含具有 AddInBaseAttribute 特性的类型的 AddInViews 目录中的每个程序集都将加载到外接程序的应用程序域中。 |
外接程序 |
一个执行宿主服务的实例化类型。 |
管线激活路径
下面的插图显示了外接程序激活时类型的激活。 该图还显示了到宿主的对象传递,例如计算结果或对象集合的传递。 这是最为典型的情形。
从外接程序到宿主的激活路径
通过如下操作,构造管线的激活路径:
宿主应用程序使用 Activate 方法激活外接程序。
将外接程序、外接程序视图、外接程序端适配器以及协定程序集加载到外接程序的应用程序域。
将外接程序视图(其中,类由 AddInBaseAttribute 特性标识)用作外接程序端适配器实例的构造函数创建该实例。 外接程序端适配器从协定中继承。
将类型化为协定的外接程序端适配器跨(可选)隔离边界传递到宿主端适配器的构造函数。
将外接程序宿主视图、宿主端适配器以及协定程序集加载到宿主的应用程序域中。
创建宿主端适配器的实例,并将协定用作其构造函数。 宿主端适配器从外接程序的宿主视图中继承。
宿主具有外接程序(类型化为外接程序的宿主视图)并可以继续调用其方法。
演练
以下三个演练主题介绍了如何使用 Visual Studio 创建管线:
-
介绍为宿主执行加、减、乘和除计算的计算器外接程序。
-
介绍具有增强计算功能的计算器外接程序,并介绍如何保持与第一个计算器外接程序的兼容性。
-
介绍如何使用书店方案通过管线传递数据集合。