版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、动态加载与插件系统的初步实现(一) :反射与 MEF 解决方 案涉及内容:反射与 MEF 解决方案AppDomain 卸载与代理WinForm 、 WcfRestService 示PRRT1: 反射实现 插件系统的基本目的是实现宿主与组件的隔离,核心是作为 接驳约定的接口,宿主使用类型发现及挂载插件,以下是反 射实现。创建类库项目 Plugin,添加接口 IPIugin :public interface IPluginString DoStuff();创建控制台程序 HostApp ,添加对 Plugin 项目的引用, Main 方法代码:class Programstatic void M
2、ain(string args) IEnumerable<Type> pluginTypes =GetPluginTypes(); foreach (Type pluginType in pluginTypes)IPlugin plugin =(IPlugin)Activator.CreateInstance(pluginType);Console.WriteLine(plugin.DoStuff();private static IEnumerable<Type>GetPluginTypes()String root =AppDomai
3、n.CurrentDomain.BaseDirectory;String files = Directory.GetFiles(root, "*.dll", SearchOption.TopDirectoryOnly); foreach (String file in files)Type types =Assembly.LoadFrom(file).GetTypes();foreach (Type type in types)if (type.IsClass &&typeof(IPlugin).IsAssignableFrom(type)y
4、ield return type;创建类库项目 MyPlugin1 ,添加对 Plugin 项目的引用,添加Plugin1 类并实现 IPlugin :public class Plugin1: IPluginpublic String DoStuff()return "MyPlugin1 Plugin1.DoStuff"修改该项目的属性,在“生成”选项卡中找到输出,将“输 出路径”指向 HostApp 下的 binDebug 文件夹,运行。宿主使用无参的 IPlugin 子类完成组件调用。 代码逻辑并不复 杂但我们还有更优雅的解决方式即 MEF 框架,这里拿 MEF 的完
5、成所需功能,组件生命周期等内容并不深入讨论,如有 需求请自行 MSDN 。PRRT2: MEF 实现MEF 框架以 Import 、Export 特性为功能入口, 修改 MyPlugin 项目,引用 System.ComponentModel.Composition ,为 MyPlugin 添加 Export 特性:Export(typeof(IPlugin)public class Plugin1: IPluginpublic String DoStuff()return "MyPlugin1 Plugin1.DoStuff"注意 Export 明确指定导出类型为 IPl
6、ugin ,在 Plugin 项目中 添加类 PluginProvider ,引用System.ComponentModel.Composition 和 System.ComponentModel.Composition.Hosting ,添加 IEnumerable<Lazy<IPlugin>> 类型只读属性并标 注 ImportMany 特性:public class PluginProviderImportManypublic IEnumerable<Lazy<IPlugin>>
7、; Plugins get; private set; public PluginProvider()AggregateCatalog catalog = new AggregateCatalog(); catalog.Catalogs.Add(new DirectoryCatalog("."); CompositionContainer container = new CompositionContainer(catalog);container.ComposeParts(this);抽象基类 ComposablePartCatalog 表示组件目录,子类Director
8、yCatalog 使用指定目录进行搜索。 PluginProvider 使 用了当前程序运行目录作为 dll 路径。同时导入点所在字段 或属性可以是 IEnumerable<T> 、IEnumerable<Lazy<T>> 、IEnumerable<Lazy<T, TMetadata>> 等,延迟绑定能 相对降低内存开销,这里使用了第 2 种,接着修改 Main 方 法:class Programstatic void Main(string args)PluginProvider pluginProvider = new PluginProvider();foreach (Lazy<IPlugin> plugin in p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 织布厂生产岗位责任制度
- 下属单位安全生产责任制度
- 污水厂环境隐患责任制度
- 信息安全工作责任制度
- 环境损害责任制度范本
- 混凝土公司安全责任制度
- 市委政法委工作责任制度
- 幼儿园校园安保责任制度
- 工地配电室岗位责任制度
- 学校治安保卫责任制度
- 2026春统编版三年级下册道德与法治每课知识点清单
- 2025中国国新控股有限责任公司招聘7人笔试历年常考点试题专练附带答案详解
- 2026贵州毕节织金县部分县直单位公开考调工作人员47人实施笔试参考题库及答案解析
- 2026陕煤集团榆林化学有限责任公司招聘(162人)考试备考题库及答案解析
- GB/T 27664.3-2026无损检测仪器超声检测设备的性能与检验第3部分:组合设备
- 2026广东江门职业技术学院管理教辅人员招聘4人备考题库带答案详解(基础题)
- GB/T 46977-2026铸造用再生砂氮、硫、磷含量测定方法
- 突发事件创伤伤员医疗救治规范2025年版
- 2026年跨境电商平台合同
- 数控多工位钻床的设计
- 部编四年级语文下册 全册教案 (表格式)
评论
0/150
提交评论