外接程序概述
更新:2007 年 11 月
外接程序的 .NET Framework 编程模型支持通信管线的开发,通信管线可以实现在各种各样的可适应情形下承载外接程序。
说明: |
---|
可以在 Managed Extensibility and Add-In Framework site on CodePlex(CodePlex 上的托管扩展性和外接程序框架站点)上找到更多代码示例,以及有关用于生成外接程序管线的工具的客户技术预览。 |
外接程序模型
外接程序模型包含一系列的段,这些段组成负责外接程序和宿主之间所有通信的外接程序管线(也称为通信管线)。管线是在外接程序与外接程序宿主之间交换数据的段的对称通信模型。在宿主和外接程序之间开发这些管线段可以提供必需的抽象层,用于支持外接程序的版本管理和隔离。
下图显示了管线。
外接程序管线
这些管线段的程序集不需要在同一应用程序域中。可以将外接程序加载到其自己的新应用程序域、现有的应用程序域中,甚至加载到宿主的应用程序域中。可以将多个外接程序加载到同一应用程序域中,从而使外接程序可以共享资源和安全上下文。
外接程序模型支持并建议在宿主和外接程序之间有一个可选边界,这个可选边界称为隔离边界(也称为远程处理边界)。此边界可以是应用程序域或进程边界。
管线中间的协定段加载到宿主的应用程序域和外接程序的应用程序域。协定定义宿主和外接程序之间用于互相交换类型的虚方法。
若要通过隔离边界进行传递,则类型必须或者是协定类型,或者是可序列化类型。非协定或非可序列化类型的类型必须由管线中的适配器段转换为协定。
管线的视图段是抽象基类或接口,用于向宿主和外接程序提供一个它们共享的、由协定定义的方法的视图。
有关开发管线段的更多信息,请参见管线开发。
下面几节介绍外接程序模型的功能。
独立的版本控制
外接程序模型允许宿主和外接程序独立进行版本控制。因此,使用外接程序模型可以实现以下方案:
创建一个适配器,该适配器使宿主能够使用为以前版本的宿主生成的外接程序。
创建一个适配器,该适配器使宿主能够使用为以后版本的宿主生成的外接程序。
创建一个适配器,该适配器使宿主能够使用为其他宿主生成的外接程序。
发现和激活
可以使用表示某个信息存储区中发现的外接程序的集合中的标记来激活外接程序。外接程序是通过搜索对宿主的外接程序视图进行定义的类型找到的。您还可以通过定义外接程序的类型发现特定的外接程序。信息存储区包含两个缓存文件:管线存储区和外接程序存储区。
有关更新和重新生成信息存储区的信息,请参见外接程序的发现。有关激活外接程序的信息,请参见外接程序的激活和如何:使用不同的隔离和安全级别激活外接程序。。
隔离级别和外部进程
外接程序模型支持外接程序与其宿主之间或者不同外接程序之间的若干隔离级别。从最低的隔离程度开始,这些级别如下所述:
外接程序与宿主运行在同一应用程序域中。不建议使用此隔离级别,其原因是您失去了使用不同应用程序域时获取的隔离和卸载功能。
多个外接程序加载到同一应用程序域,并且该应用程序域不同于宿主使用的应用程序域。
每个外接程序以独占形式加载到其自己的应用程序域。这是最为常见的隔离级别。
多个外接程序加载到外部进程中的同一应用程序域。
每个外接程序以独占形式加载到外部进程中其自己的应用程序域。这是一种隔离程度最高的方案。
有关使用外部进程的更多信息,请参见如何:使用不同的隔离和安全级别激活外接程序。。
生存期管理
由于外接应用程序模型跨应用程序域和进程边界,因此自行进行垃圾回收不足以释放和回收对象。外接程序模型提供使用标记和引用计数的生存期管理机制,通常不需要进行额外编程。有关更多信息,请参见生存期管理。
区分外接应用程序和宿主
外接程序和宿主的区别仅在于宿主激活外接程序。宿主可以是两个程序中较大的一个,例如,字处理应用程序和其拼写检查器;宿主也可以是两个程序中较小的一个,例如,嵌入媒体播放器的即时消息客户端。外接程序模型既在客户端方案中支持外接程序,也在服务器方案中支持外接程序。服务器外接程序的示例包括提供具有病毒扫描、垃圾邮件筛选器和 IP 保护功能的邮件服务器的外接程序。客户端外接程序示例包括字处理的引用外接程序、图形程序和游戏的专用功能以及本地电子邮件客户端的病毒扫描。