外接程序的发现
宿主应用程序可以发现可用于它们的外接程序。 发现包括两个任务:
将有关所有外接程序和管线段的信息注册到缓存文件中。
通过搜索缓存查找外接程序的指定宿主视图的外接程序。
宿主通常在启动、加载文档或用户请求时发现外接程序,具体情况取决于应用程序。 AddInStore 类提供执行这些任务的方法。
在发现外接程序之后,可以按照外接程序的激活和如何:使用不同的隔离和安全级别激活外接程序。中的说明激活它们。
注册外接程序和管线段
注册过程涉及检查管线段的特性,以及构造有关其管线的信息,从而确定有效的外接程序。 有关将特性应用于管线段以及创建管线目录结构的更多信息,请参见管线开发要求。 管线目录结构可以包含一个或多个管线。 此信息缓存在管线根目录中的两个文件中:PipelineSegments.store 和 AddIns.store。
用于注册的方法采用一个表示管线根路径的字符串变量,或是一个来自 PipelineStoreLocation 枚举的值。 如果以前尚未创建缓存文件,则这些方法将创建新的缓存文件。
这些方法重新生成或者更新缓存文件,如下表所述。
注册方法 |
说明 |
---|---|
重新生成管线段缓存并包括任何新添加项。 如果外接程序在管线目录结构中,则此方法还重新生成外接程序缓存。 |
|
为位于指定位置的外接程序重新生成外接程序缓存。 如果外接程序在管线目录结构外,则调用此方法。 |
|
用任何添加项更新管线段缓存。 如果外接程序在管线目录结构中,则此方法还更新外接程序缓存。 如果没有新的管线段或外接程序,则此方法仅验证缓存。 |
|
为位于指定位置的任何新外接程序更新外接程序缓存。 如果外接程序在管线目录结构外,则调用此方法。 如果未安装新的外接程序,则此方法仅验证缓存。 |
Rebuild 和 Update 方法重载将管线目录结构的根目录或者 PipelineStoreLocation 枚举中的值作为参数。
这些方法使用只反射加载获得信息并且不运行外接程序的代码或管线段的代码。 缓存的信息带有时间戳,这样在更新期间就不会重新计算缓存的信息。
缓存文件
调用注册方法可以生成两个缓存文件:
PipelineSegments.store
此文件位于管线目录结构的根目录中。
AddIns.store
此文件位于包含一个或多个外接程序子目录的目录中。 此目录可以在管线目录结构内,也可以在其他位置。
查找外接程序
FindAddIns 方法检查存储文件以查找与该外接程序的指定宿主视图匹配的所有外接程序。 根据协定中所指定的,外接程序的宿主视图是描述由宿主和外接程序使用的方法的抽象基类或接口。 为了查找由注册方法创建的缓存文件,此方法将管线目录结构的根目录或者 PipelineStoreLocation 枚举中的值作为参数。
注意 |
---|
仅在确定存储文件已经生成和更新并且因此可找到所有可用的外接程序后,才调用 FindAddIns。 |
FindAddIns 方法返回描述每个具有有效管线的可用外接程序的标记集合 IList<T>。 AddInToken 类描述每个标记。
每个标记都有与外接程序有关的以下信息,这些信息是从外接程序的类上的 AddInAttribute 特性中获得的:
名称
说明
发行者
版本
在多数情况下,IList<T> 集合中仅有一个标记。 如果其中有多个标记,宿主应用程序可以使用此信息帮助用户选择要激活的外接程序。 有关激活的更多信息,请参见外接程序的激活。
若要查找管线目录结构之外的外接程序,必须包含 AddInPaths 参数。 因为此参数是一个字符串数组,所以可以指定多个位置。
还可以使用返回由一个标记组成的集合的 FindAddIn 方法查找特定的外接程序。
示例
下面的示例演示如何生成缓存文件以及查找外接程序。
' Get the path for the pipeline root.
' Assumes that the current directory is the
' pipline directory structure root directory.
Dim pipeRoot As String = Environment.CurrentDirectory
' Update the cache files of the
' pipeline segments and add-ins.
Dim warnings() As String = AddInStore.Update(pipeRoot)
For Each warning As String In warnings
Console.WriteLine(warning)
Next
' Search for add-ins of type Calculator (the host view of the add-in)
' specifying the host's application base, instead of a path,
' for the FindAddIns method.
Dim tokens As Collection(Of AddInToken) = _
AddInStore.FindAddIns(GetType(Calculator), PipelineStoreLocation.ApplicationBase)
// Get path for the pipeline root.
// Assumes that the current directory is the
// pipeline directory structure root directory.
String pipeRoot = Environment.CurrentDirectory;
// Update the cache files of the
// pipeline segments and add-ins.
string[] warnings = AddInStore.Update(pipeRoot);
foreach (string warning in warnings)
{
Console.WriteLine(warning);
}
// Search for add-ins of type Calculator (the host view of the add-in)
// specifying the host's application base, instead of a path,
// for the FindAddIns method.
Collection<AddInToken> tokens =
AddInStore.FindAddIns(typeof(Calculator),PipelineStoreLocation.ApplicationBase);