外接程序和扩展性(MAF)_第1页
外接程序和扩展性(MAF)_第2页
外接程序和扩展性(MAF)_第3页
外接程序和扩展性(MAF)_第4页
外接程序和扩展性(MAF)_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

外接程序和扩展性外接程序为宿主应用程序提供扩展的功能或服务。.NETFramework提供了一个编程模型,编程人员可以使用该模型开发外接程序并在外接程序的宿主应用程序中激活它们。该模型通过在宿主与外接程序之间构造一个通信管线来实现这一点。该模型是通过使用System.AddIn、System.AddIn.Hosting、System.AddIn.Pipeline和System.AddIn.Contract命名空间中的类型来实现的。有关更多代码示例以及用于生成外接程序管线的工具的客户技术预览,请参见ManagedExtensibilityandAdd-InFrameworksiteonCodePlex(CodePlex上的托管扩展性和外接程序框架站点)。©本节内容外接程序概述描述.NETFramework的外接程序编程模型。管线开发描述从宿主应用程序到外接程序之间的段的通信管线。在演练主题中提供了一些代码示例,这些主题介绍如何在VisualStudio中构造管线以及如何将段部署到管线。外接程序的发现介绍如何使外接程序可被宿主应用程序发现。外接程序的激活描述如何激活和停用外接程序。外接程序性能描述如何使用域无关的程序集加载和本机映像来提高外接程序性能。如何:使用不同的隔离和安全级别激活外接程序。介绍如何在各种应用程序域、进程以及安全级别方案中激活外接程序。如何:使用限定数据描述如何应用和访问属于外接程序和管线段的自定义数据。外接程序开发人员体验描述如何开发一个外接程序以使用必需的外接程序管线段。外接程序概述.NETFramework3.5更新:2007年11月外接程序的.NETFramework编程模型支持通信管线的开发,通信管线可以实现在各种各样的可适应情形下承载外接程序。兰说明:可以在ManagedExtensibilityandAdd-InFrameworksiteonCodePlex(CodePlex上的托管扩展性和外接程序框架站点)上找到更多代码示例,以及有关用于生成外接程序管线的工具的客户技术预览。Q外接程序模型外接程序模型包含一系列的段,这些段组成负责外接程序和宿主之间所有通信的外接程序管线(也称为通信管线)。管线是在外接程序与外接程序宿主之间交换数据的段的对称通信模型。在宿主和外接程序之间开发这些管线段可以提供必需的抽象层,用于支持外接程序的版本管理和隔离。下图显示了管线。外接程序管线rti-i:协l仅接11帼的締㈱外接程序管线rti-i:协l仅接11帼的締㈱宓|:或II囁忙类外接程序的补匸鼎运陀器外接即||:外接程序这些管线段的程序集不需要在同一应用程序域中。可以将外接程序加载到其自己的新应用程序域、现有的应用程序域中,甚至加载到宿主的应用程序域中。可以将多个外接程序加载到同一应用程序域中,从而使外接程序可以共享资源和安全上下文。外接程序模型支持并建议在宿主和外接程序之间有一个可选边界,这个可选边界称为隔离边界(也称为远程处理边界)。此边界可以是应用程序域或进程边界。管线中间的协定段加载到宿主的应用程序域和外接程序的应用程序域。协定定义宿主和外接程序之间用于互相交换类型的虚方法。若要通过隔离边界进行传递,则类型必须或者是协定类型,或者是可序列化类型。非协定或非可序列化类型的类型必须由管线中的适配器段转换为协定。管线的视图段是抽象基类或接口,用于向宿主和外接程序提供一个它们共享的、由协定定义的方法的视图。有关开发管线段的更多信息,请参见管线开发。下面几节介绍外接程序模型的功能。独立的版本控制外接程序模型允许宿主和外接程序独立进行版本控制。因此,使用外接程序模型可以实现以下方案:创建一个适配器,该适配器使宿主能够使用为以前版本的宿主生成的外接程序。创建一个适配器,该适配器使宿主能够使用为以后版本的宿主生成的外接程序。创建一个适配器,该适配器使宿主能够使用为其他宿主生成的外接程序。发现和激活可以使用表示某个信息存储区中发现的外接程序的集合中的标记来激活外接程序。外接程序是通过搜索对宿主的外接程序视图进行定义的类型找到的。您还可以通过定义外接程序的类型发现特定的外接程序。信息存储区包含两个缓存文件:管线存储区和外接程序存储区。有关更新和重新生成信息存储区的信息,请参见外接程序的发现。有关激活外接程序的信息,请参见外接程序的激活和如何:使用不同的隔离和安全级别激活外接程序。。隔离级别和外部进程外接程序模型支持外接程序与其宿主之间或者不同外接程序之间的若干隔离级别。从最低的隔离程度开始,这些级别如下所述:外接程序与宿主运行在同一应用程序域中。不建议使用此隔离级别,其原因是您失去了使用不同应用程序域时获取的隔离和卸载功能。多个外接程序加载到同一应用程序域,并且该应用程序域不同于宿主使用的应用程序域。每个外接程序以独占形式加载到其自己的应用程序域。这是最为常见的隔离级别。多个外接程序加载到外部进程中的同一应用程序域。每个外接程序以独占形式加载到外部进程中其自己的应用程序域。这是一种隔离程度最高的方案。有关使用外部进程的更多信息,请参见如何:使用不同的隔离和安全级别激活外接程序。。生存期管理由于外接应用程序模型跨应用程序域和进程边界,因此自行进行垃圾回收不足以释放和回收对象。外接程序模型提供使用标记和引用计数的生存期管理机制,通常不需要进行额外编程。有关更多信息,请参见生存期管理。区分外接应用程序和宿主外接程序和宿主的区别仅在于宿主激活外接程序。宿主可以是两个程序中较大的一个,例如,字处理应用程序和其拼写检查器;宿主也可以是两个程序中较小的一个,例如,嵌入媒体播放器的即时消息客户端。外接程序模型既在客户端方案中支持外接程序,也在服务器方案中支持外接程序。服务器外接程序的示例包括提供具有病毒扫描、垃圾邮件筛选器和IP保护功能的邮件服务器的外接程序。客户端外接程序示例包括字处理的引用外接程序、图形程序和游戏的专用功能以及本地电子邮件客户端的病毒扫描。请参见概念应用程序域和程序集其他资源外接程序和扩展性管线开发.NETFramework3.5.NETFramework3.5更新:2007年11月外接程序管线是管线段的路径,宿主应用程序及其外接程序必须使用管线段来互相进行通信下面的插图显示了通信管线及其段。外接程序管线外接程序管线宿主应用程序位于管线的一端,外接程序位于管线的另一端。宿主应用程序和外接程序分别从各自的端开始向中间移动,它们都具有一个抽象基类,用于定义它们共享的对象模型的视图。这些类型(类)组成外接程序视图管线段以及外接程序管线段的宿主视图。外接程序视图管线段通常包含多个抽象类,但外接程序从中继承的类称为外接程序基。外接程序端适配器管线段和宿主端适配器管线段转换其视图管线段和协定管线段之间的类型流。管线的中段是从IContract接口派生的协定。此协定定义宿主应用程序及其外接程序都将使用的方法。如果将宿主和外接程序加载到不同的应用程序域,则您就会拥有将宿主应用程序范围与外接程序范围分开的隔离边界。协定是唯一同时加载到宿主和外接程序应用程序域中的程序集。宿主和外接程序只引用它们各自的协定方法视图。因此,它们被一个抽象层从协定中隔离开。若要开发管线段,必须创建包含管线段的目录结构。有关开发要求以及范围准则的更多信息,请参见管线开发要求。下面的插图显示了组成管线段的类型。插图中显示的类型名称是任意的,但除宿主和外接程序宿主视图之外的所有其他类型都需要属性,以使构造信息存储区的方法可以发现它们。具有类型的外接程序管线

叫我的隔离边界[AddIiiContract)一1111■—[Addin]Ho&tVleuDfAddlh(AddInBa$«][Host叫我的隔离边界[AddIiiContract)一1111■—[Addin]Ho&tVleuDfAddlh(AddInBa$«][HostAdapter][AddlnAdapter]LJ能示可境现性的荚塑上需吩的屈件。宿主和HostVIewOrAddln鏗型不帝罢属性.管线段 说明宿主创建外接程序实例的应用程序程序集。外接程序的宿主视图表示用于与外接程序通信的对象类型和方法的宿主应用程序的视图。宿主视图是一个抽象基类或接口。宿主端适配器具有一个或多个类的程序集,该程序集调整方法以使其适合协定,或者调整协定以使其适合方法。此管线段使用HostAdapterAttribute属性来标识。不支持多模块程序集。协定派生自IContract接口并定义宿主及其外接程序之间的通信类型协议的接口。此管线段通过设置AddlnContractAttribute属性来标识。外接程序端适配器具有一个或多个类的程序集,该程序集调整方法以使其适合协定,或者调整协定以使其适合方法。此管线段使用AddlnAdapterAttribute属性来标识。包含具有AddlnAdapterAttribute属性的类型的外接程序端适配器目录中的每个程序集都将加载到外接程序的应用程序域中。外接程序端目录中的每个程序集都加载到其自己的应用程序域中。不支持多模块程序集

外接程序视图一个程序集,表示用于与宿主通信的对象类型和方法的外接程序的视图。外接程序视图是一个抽象基类或接口。此管线段使用AddlnBaseAttribute属性来标识。包含具有AddlnBaseAttribute属性的类型的AddlnViews目录中的每个程序集都将加载到外接程序的应用程序域中。外接程序一个执行宿主服务的实例化类型。§管线激活路径下面的插图显示了外接程序激活时类型的激活。该图还显示了到宿主的对象传递,例如计算结果或对象集合的传递。这是最为典型的情形。从外接程序到宿主的激活路径HoitVIewOfAddin—[AddlnBase][AddlnAdspter][HostAdapter]HoitVIewOfAddin—[AddlnBase][AddlnAdspter][HostAdapter]lAdclInCbritract)—Host——[Addin]丨丨标类型釆川箭头棍杜的绸塑柞为门巳的构輦函靠.yH标英叫曲詩虫报处ii勺类脱承-LJ庁括巧措不需要属忡的鏗叨。通过如下操作,构造管线的激活路径:宿主应用程序使用Activate方法激活外接程序。将外接程序、外接程序视图、外接程序端适配器以及协定程序集加载到外接程序的应用程序域。将外接程序视图(其中,类由AddInBaseAttribute属性标识)用作外接程序端适配器实例的构造函数创建该实例。外接程序端适配器从协定中继承。将类型化为协定的外接程序端适配器跨(可选)隔离边界传递到宿主端适配器的构造函数。将外接程序宿主视图、宿主端适配器以及协定程序集加载到宿主的应用程序域中。创建宿主端适配器的实例,并将协定用作其构造函数。宿主端适配器从外接程序的宿主视图中继承。宿主具有外接程序(类型化为外接程序的宿主视图)并可以继续调用其方法。演练以下三个演练主题介绍了如何使用VisualStudio创建管线:演练:创建可扩展的应用程序介绍为宿主执行加、减、乘和除计算的计算器外接程序。演练:在宿主发生变化时启用向后兼容性介绍具有增强计算功能的计算器外接程序,并介绍如何保持与第一个计算器外接程序的兼容性。演练:在宿主和外接程序之间传递集合介绍如何使用书店方案通过管线传递数据集合。请参见概念外接程序管线方案外接程序概述外接程序的发现.NETFramework3.5其他版本"MfcwMMrft[)00HWnnATJ~~1——■此主题尚未评级-评价此主题更新:2007年11月宿主应用程序可以发现可用于它们的外接程序。发现包括两个任务:将有关所有外接程序和管线段的信息注册到缓存文件中。通过搜索缓存查找外接程序的指定宿主视图的外接程序。宿主通常在启动、加载文档或用户请求时发现外接程序,具体情况取决于应用程序。AddInStore类提供执行这些任务的方法。在发现外接程序之后,可以按照外接程序的激活和如何:使用不同的隔离和安全级别激活外接程序。中的说明激活它们。§注册外接程序和管线段注册过程涉及通过检查管线段的属性来确定有效外接程序以及构造有关其管线的信息。有关将属性应用于管线段以及创建管线目录结构的更多信息,请参见管线开发要求。管线目录结构可以包含一个或多个管线。此信息缓存在管线根目录中的两个文件中:PipelineSegments.store和Addlns.store。用于注册的方法采用一个表示管线根路径的字符串变量,或是一个来自PipelineStoreLocation枚举的值。如果以前尚未创建缓存文件,则这些方法将创建新的缓存文件。这些方法重新生成或者更新缓存文件,如下表所述。注册方法说明Rebuild重新生成管线段缓存并包括任何新添加项。如果外接程序在管线目录结构中,则此方法还重新生成外接程序缓存。RebuildAddlns为位于指定位置的外接程序重新生成外接程序缓存。如果外接程序在管线目录结构夕卜,则调用此方法。Update用任何添加项更新管线段缓存。如果外接程序在管线目录结构中,则此方法还更新外接程序缓存。如果没有新的管线段或外接程序,则此方法仅验证缓存。UpdateAddlns为位于指定位置的任何新外接程序更新外接程序缓存。如果外接程序在管线目录结构夕卜,则调用此方法。如果未安装新的外接程序,则此方法仅验证缓存。Rebuild和Update方法重载将管线目录结构的根目录或者PipelineStoreLocation枚举中的值作为参数。这些方法使用只反射加载获得信息并且不运行外接程序的代码或管线段的代码。缓存的信息带有时间戳,这样在更新期间就不会重新计算缓存的信息。缓存文件调用注册方法可以生成两个缓存文件:PipelineSegments.store此文件位于管线目录结构的根目录中。AddIns.store此文件位于包含一个或多个外接程序子目录的目录中。此目录可以在管线目录结构内,也可以在其他位置。查找外接程序FindAddIns方法检查存储文件以查找与该外接程序的指定宿主视图匹配的所有外接程序。根据协定中所指定的,外接程序的宿主视图是描述由宿主和外接程序使用的方法的抽象基类或接口。为了查找由注册方法创建的缓存文件,此方法将管线目录结构的根目录或者PipelineStoreLocation枚举中的值作为参数。仅在确定存储文件已经生成和更新并且因此可找到所有可用的外接程序后,才调用FindAddln。FindAddlns方法返回描述每个具有有效管线的可用外接程序的标记集合IList<T〉。AddlnToken类描述每个标记。每个标记都有与外接程序有关的以下信息,这些信息是从外接程序的类上的AddInAttribute属性中获得的:名称说明发行者•版本在多数情况下,IList<T〉集合中仅有一个标记。如果其中有多个标记,宿主应用程序可以使用此信息帮助用户选择要激活的外接程序。有关激活的更多信息,请参见外接程序的激活。若要查找管线目录结构之外的外接程序,必须包含AddInPaths参数。因为此参数是一个字符串数组,所以可以指定多个位置。还可以使用返回由一个标记组成的集合的FindAddIn方法查找特定的外接程序。示例下面的示例演示如何生成缓存文件以及查找外接程序。C#VB复制//Getpathforthepipelineroot.//Assumesthatthecurrentdirectoryisthe//pipelinedirectorystructurerootdirectory.StringpipeRoot=Environment.CurrentDirectory;//Updatethecachefilesofthe//pipelinesegmentsandadd-ins.string[]warnings=AddInStore.Update(pipeRoot);if(warnings.Length>0){foreach(stringwarninginwarnings){Console.WriteLine(warning);//Searchforadd-insoftypeCalculator(thehostviewoftheadd-in)//specifyingthehost'sapplicationbase,insteadofapath,//fortheFindAddInsmethod.Collection<AddInToken>tokens=AddInStore.FindAddInst(ypeof(Calculator),PipelineStoreLocation.ApplicationBase);请参见概念外接程序的激活管线开发要求协定、视图和适配器其他资源外接程序和扩展性外接程序的激活.NETFramework3.5其他版本此主题尚未评级-评价此主题更新:2007年11月在已经使用发现方法并获得指定宿主视图的外接程序标记集合后,可以通过使用外接程序的标记来激活该集合中的外接程序,标记是由AddInToken对象表示的。有关如何发现可在您的系统上使用的外接程序的更多信息,请参见外接程序的发现。在对AddInToken对象使用Activate方法重载时,可以指定下列激活选项:外接程序加载到的应用程序域。向为外接程序创建的应用程序域授予的安全信任级别或权限集。在其中激活外接程序的外部进程。这是一个高级外接程序开发选项。Activate方法返回外接程序的宿主视图;如同协定中所定义的,之后宿主应用程序可以调用方法。宿主应用程序可以通过使用AddInController类关闭外接程序来控制外接程序的生存期。当不再对外接程序进行引用时,宿主应用程序还可以让垃圾回收器来回收外接程序。©激活通常,宿主应用程序使宿主和外接程序在不同的应用程序域中运行,并且每个外接程序一个应用程序域。这样便使外接程序可以在与宿主及其他外接程序隔离的上下文中运行。这种隔离可以防止冲突并支持外接程序的版本控制。由于外接程序在其自己的应用程序域中,因此您可以在它自己的环境中测试它,还可以测试管线的外接程序端。外接程序适配器、协定及外接程序视图管线段与外接程序加载到同一个应用程序域内。外接程序所需的任何其他程序集也全都加载到外接程序的应用程序域中。激活外接程序时,宿主应用程序通常使用Activate方法重载,该方法重载采用指定的安全级别并自动为外接程序创建一个应用程序域。可以为该安全级别指定AddInSecurityLevel或PermissionSet。当Activate方法为外接程序创建一个应用程序域时,会将该应用程序域的配置文件设置为addinassemblyname.config(如果存在该文件)。若要获得更精细的控制或者要集中外接程序,可以使用Activate方法的重载指定一个现有的应用程序域来加载外接程序。如果指定一个现有的应用程序域,就可以轻松地与其他外接程序共享资源、安全上下文和区域性信息。应该考虑将要应用于外接程序的应用程序域的安全上下文。例如,宿主应用程序可以在完全信任下运行,但它可能需要以较低权限运行外接程序。可以使用Activate方法的重载来指定具有AddInSecurityLevel枚举的安全区域。这些安全区域包括FullTrustHostIntranet或Internet。安全区域的适当权限将应用于在该应用程序域内运行的代码。可用于这些安全区域的权限取决于.NETFramework的现有安全设置。如果您不想将权限用于安全区域,可以使用Activate方法的重载提供您自己的PermissionSet对象。可以使用Activate方法的重载为外接程序创建一个外部进程,或者将外接程序附加到一个现有的外部进程(创建该进程是为了承载外接程序)。这些重载使用AddInProcess和AddInEnvironment类。有关在外部进程中激活外接程序的更多信息,请参见如何:使用不同的隔离和安全级别激活外接程序。。外接程序生存期的控制AddInController类提供用于执行下列外接程序任务的方法:关闭外接程序。获取外接程序的应用程序域。获取外接程序的标记以便在以后进行激活。获取用于外部进程激活的AddInEnvironment对象。使用GetAddInController方法获得指定外接程序的控制器。Shutdown方法处理关闭一个外接程序所需的详细信息。这包括了解外接程序在何处加载、其应用程序域以及外接程序可能在其中运行的外部进程。如果应用程序域是自动创建的,则此方法会卸载该应用程序域。如果外接程序是在指定的应用程序域中激活的,则远程协定对象上的生存期服务将超时,使该应用程序域处于已加载状态。在释放该协定对象时,便可以通过垃圾回收来回收外接程序。示例下面的示例在自动创建的应用程序域中激活一个具有指定安全级别的外接程序。C#VB复制//Asktheuserwhichadd-intheywouldliketouse.AddInTokenselectedToken=ChooseAddIn(tokens);//ActivatetheselectedAddInTokeninanew//applicationdomainwiththeInternettrustlevel.CalculatorCalcAddIn=selectedToken.Activate<Calculator>(AddInSecurityLevel.Internet);//Runtheadd-inusingacustommethod.RunCalculator(CalcAddIn);请参见任务如何:使用不同的隔离和安全级别激活外接程序概念外接程序的发现生存期管理协定、视图和适配器其他资源外接程序和扩展性外接程序性能.NETFramework3.5其他版本此主题尚未评级-评价此主题更新:2007年11月通过对管线协定使用非特定于域的加载,可以提高外接程序性能。通过生成管线段的本机映像可以提高激活性能。Q非特定于域的加载可提高跨域调用的性能当外接程序加载到单独的应用程序域中时,宿主和外接程序之间的调用将由管线跨应用程序域边界进行封送。如果包含协定的程序集是以非特定于域的方式加载的,则这些跨域调用的性能将得到显著提高。程序集必须具有强名称,并且必须安装在全局程序集缓存中,它必须具有带LoaderOptimization.MultiDomainHost标志或LoaderOptimization.MultiDomain标志的LoaderOptimizationAttribute。避免使用JIT编译器可提高激活性能实时(JIT)编译器会大大增加外接程序激活的性能开销,尤其是当在单独的应用程序域中激活外接程序时。若要避免使用JIT编译器,请遵循下列准则:对管线程序集使用强名称,并将其安装在全局程序集缓存中。使用本机映像生成器(Ngen.exe)创建管线程序集的本机映像。确保包含协定的程序集以非特定于域的方式加载,如上节所述。兰说明:这一点非常重要。如果不以非特定于域的方式加载协定,则外接程序端组件都不能使用本机映像。以MultiDomainHost标志或MultiDomain标志将LoaderOptimizationAttribute应用于宿主程序集,可以允许跨应用程序域共享.NETFramework程序集的本机映像。兰说明:在调试器下运行时,检测不到这种性能提高,原因是宿主进程(vshost.exe)未设置为可进行程序集共享。您可以禁用该宿主进程,但建议不要这样做。在调试器下运行时,不应测量性能。请参见概念应用程序域和程序集参考LoaderOptimizationAttributeLoaderOptimization本机映像生成器(Ngen.exe)如何:使用不同的隔离和安全级别激活外接程序。.NETFramework3.5其他版本此主题尚未评级-评价此主题更新:2007年11月可以使用不同的应用程序域和进程配置激活外接应用程序,以满足您的隔离和安全要求。AddlnToken类的Activate方法重载为激活外接应用程序提供以下选择:在其自己的由系统自动生成的应用程序域中。在包含或不包含其他外接程序的现有应用程序域中。在另一外接程序所处的环境(应用程序域和进程)中。在一个新的、与宿主的进程不同的外部进程中。该新进程可以包含共享该进程的其他外接程序。当激活新应用程序域或进程中的外接程序时,必须使用AddInSecurityLevel或PermissionSet对象指定一个安全级别。有关激活外接程序的更多信息,请参见外接程序的激活。下面的过程演示如何使用Activate方法重载实现这些激活选项。该示例假定已生成管线段和外接程序缓存,还假定已发现一个或多个外接程序并且这些外接程序在名为tokens的AddInToken集合中返回。有关如何生成缓存文件和查找外接程序的更多信息,请参见外接程序的发现。激活新应用程序域中的外接程序•使用Activate<T>(AddInSecurityLevel)或Activate<T>(PermissionSet)方法重载。C#VB复制//Asktheuserwhichadd-intheywouldliketouse.AddInTokenselectedToken=ChooseAddIn(tokens);//ActivatetheselectedAddInTokeninanew

//applicationdomainwiththeInternettrustlevel.CalculatorCalcAddIn=selectedToken.Activate<Calculator>(AddInSecurityLevel.Internet);//Runtheadd-inusingacustommethod.RunCalculator(CalcAddIn);激活与其他外接程序位于同一应用程序域中的外接程序•使用Activate〈T〉(AppDomain)方法重载。C#VB复制//Gettheapplicationdomain//ofanexistingadd-in(CalcAddIn).AddInControlleraiCtrl=AddInController.GetAddInController(CalcAddIn);AppDomainAddInAppDom=aiCtrl.AppDomain;//Activateanotheradd-ininthesameapplicationdomain.CalculatorCalcAddIn3=selectedToken2.Activate<Calculator>(AddInAppDom);//ShowthatCalcAddIn3wasloaded//intoCalcAddIn'sapplicationdomain.AddInControlleraic=AddInController.GetAddInController(CalcAddIn3);Console.WriteLine("Add-inloadedintoexistingapplicationdomain:{0}",aic.AppDomain.Equals(AddInAppDom));激活与另一个外接程序位于同一应用程序域和进程中的外接程序•使用Activate〈T〉(AddInEnvironment)方法重载。

VB复制//GettheAddInControllerofa//currentlyactivedadd-in(CalcAddIn).AddInControlleraiController=AddInController.GetAddInController(CalcAddIn);//Selectanothertoken.AddInTokenselectedToken2=ChooseAddIn(tokens);//Activateasecondadd-in,CalcAddIn2,inthesame//appliationdomainandprocessasthefirstadd-inbypassing//thefirstadd-in'sAddInEnvironmentobjecttotheActivatemethod.AddInEnvironmentaiEnvironment=aiController.AddInEnvironment;CalculatorCalcAddIn2=selectedToken2.Activate<Calculator>(aiEnvironment);//GettheAddInControllerforthesecondadd-intocompareenvironments.AddInControlleraiController2=AddInController.GetAddInController(CalcAddIn2);Console.WriteLine("Add-insinsameapplicationdomain:{0}",aiController.AppDomain.Equals(aiController2.AppDomain));Console.WriteLine("Add-insinsameprocess:{0}",aiEnvironment.Process.Equals(aiController2.AddInEnvironment.Process));激活新进程中的外接程序使用Activate<T>(AddInProcess,AddInSecurityLevel)或Activate<T>(AddInProcess,PermissionSet)方法重载。C#VB复制//Createanexternalprocess.AddInProcesspExternal=newAddInProcess();

//Activateanadd-inintheexternalprocess//withafulltrustsecuritylevel.CalculatorCalcAddIn4=selectedToken.Activate<Calculator>(pExternal,AddInSecurityLevel.FullTrust);//Showthattheadd-inisananexternalprocess//byverifyingthatitisnotinthecurrent(host's)process.AddInControllerAddinCtl=AddInController.GetAddInController(CalcAddIn4);Console.WriteLine("Add-ininhost'sprocess:{0}",AddinCtl.AddInEnvironment.Process.IsCurrentProcess);§请参见概念外接程序的发现外接程序开发人员体验其他资源外接程序和扩展性如何:使用限定数据.NETFramework3.5其他版本此主题尚未评级-评价此主题更新:2007年11月任何相关意图都可以通过将一个或多个QualificationDataAttribute属性应用于管线段,从而为该管线段分配限定数据来实现。每个属性都指定字符串数据的简单名称/值对。例如,您可以通过指定名称/值对"Security"和"FullTrust",指示应以完全信任的方式来激活外接程序。同样,您可以通过指定名称/值对"Isolation"和"NewProcess",指示应将管线段隔离在其自身的进程中。向管线段应用限定数据使用QualificationDataAttribute属性。C#VB复制//Thispipelinesegmenthas//twoattributes://1-AnAddInAttributetoidentify//thissegmentasanadd-in.////2-AQualificationDataAttributeto//indicatethattheadd-inshould//beloadedintoanewapplicationdomain.[AddIn("CalculatorAdd-in",Version="")][QualificationData"Isolation","NewAppDomain")]publicclassSampleV2AddIn:Calculator2{确定特定管线段的限定数据使用AddInToken对象的QualificationData属性来获取与标记关联的管线段及其限定数据的字典,然后使用相应的AddInSegmentType值获取包含名称/值对的字典,这些名称/值对由所需管线段的限定数据组成。C#VB复制//Usequalificationdatatocontrol//howanadd-inshouldbeactivated.if(selectedToken.QualificationData[AddInSegmentType.AddIn]["Isolation"].Equals("NewProcess")){//Createanexternalprocess.AddInProcessexternal=newAddInProcess();//Activa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论