教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 互联网资料 >

SharpDevelop插件系统完全分析(2)

来源:网络收集 时间:2026-07-30
导读: 首先判断插件树是否为空,即插件树是否已经创建,如果没有创建,则实例化一个默认的插件树对象。代码如下: if(addInTree == null) { addInTree = new DefaultAddInTree(); InternalFileService fileUtilityService

首先判断插件树是否为空,即插件树是否已经创建,如果没有创建,则实例化一个默认的插件树对象。代码如下:

if(addInTree == null)

{

addInTree = new DefaultAddInTree();

InternalFileService fileUtilityService = new InternalFileService();

StringCollection addInFiles = null;

if (ignoreDefaultCoreAddInDirectory == false) //如果没有忽略默认的插件路径,即采用默认的插件路径

{

addInFiles = fileUtilityService.SearchDirectory(defaultCoreAddInDirectory, \

InsertAddIns(addInFiles);

}

else //如果忽略默认的插件文件的路径

{

if (addInDirectories != null)

{

foreach(string path in addInDirectories)

{

addInFiles = fileUtilityService.SearchDirectory(Application.StartupPath + Path.DirectorySeparatorChar + path, \

InsertAddIns(addInFiles);

}

}

}

} 在DefaultAddInTree的构造函数中,通过LoadCodonsAndConditions(Assembly.GetExecutingAssembly());

从核心项目Core程序集中加载所有的代码子和条件对象。那么这个函数到底作了什么呢?

首先从程序集中得到所有的类型,然后判断如果某个类型是从AbstractCodon抽象类继承而来并且这个类型上有CodonNameAttribute特性,则说明当前类是一个具有某个功能的代码子类,然后立即创建一个CodonBuilder对象,并将该对象添加到一个Factory工厂对象的Builders哈希表中。添加时以CodonName为主键。另外,对于条件操作也是类似操作。

继续回到CreateAddInTree方法中,判断是否忽略默认的插件文件路径,如果不忽略,则使用默认的插件文件路径“..\\addIns“来搜索所有的插件文件,并放到一个字符串集合中。然后调用InsertAddIns方法。下面是这个方法的源代码:

static void InsertAddIns(StringCollection addInFiles)

{

foreach (string addInFile in addInFiles)

{

AddIn addIn = new AddIn();//先新建一个插件实例

try

{

实例

树中

}

addIn.Initialize(addInFile);//通过当前插件文件来初始化这个插件 addInTree.InsertAddIn(addIn);//将这个初始化好的插件插入到插件} catch (Exception e) { throw new AddInInitializeException(addInFile, e); }

}

这个方法的功能是接受一个插件文件的集合列表参数,然后对每个插件文件都创建一个插件对象,并将该插件对象插入到插件树中。在这个过程中,关键是插件对象如何创建?以及创建好的对象如何插入到插件树中?所以,如果这两个问题解释清楚了,那么,整个插件系统的创建过程就清楚了。现面先分析插件对象如何创建,转入AddIn文件的Initialize方法:

该方法的关键是在foreach循环中,它对插件文件根节点下的所有子节点进行迭代,判断子节点的类型,

如果为RunTime节点,则将该节点的所有子节点所指定的程序集加载到内存,并将该程序集对象添加到一个哈希表中。当然,这里并不是只是简单的根据程序集文件名创建一个程序集对象,在创建了程序集对象之后,还像刚开始从核心项目Core程序集加载所有的代码子对象一样加载了当前程序集中的所有的代码子和条件对象。

如果为Extension节点,则说明当前节点是一个功能扩展,所谓功能扩展是指在某个插件树路径下的功能集合。一般情况下一个功能扩展的特点是:

一个路径(Path):指定该功能扩展在整个系统中的逻辑路径;

一些可以嵌套定义的代码子节点;

一些作用在代码子节点上的条件节点;

所以,在SharpDevelop中特别定义了一个Extension类,专门用来描述XML文件中定义的Extension节点。

在遇到Extension节点时调用AddExtensions方法,该方法接受一个Extension XML节点,在AddExtensions方法内部关键是AddCodonsToExtension方法,该方法比较复杂,下面我分析其中最关键的default部分:

…… 此处隐藏:237字,全部文档内容请下载后查看。喜欢就下载吧 ……
SharpDevelop插件系统完全分析(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/443140.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)