MEF中可自动刷新的catalog

本文介绍了在MEF(Managed Extensibility Framework)中如何创建一个可自动刷新的目录类`AutoRefreshDirectoryCatalog`,以实现在程序运行过程中动态加载、更新和删除插件DLL,避免程序重启。通过监听文件系统变化,当Add-Ins目录下插件发生变化时,自动刷新目录以加载新插件。
摘要由CSDN通过智能技术生成

我的另一个博客:http://seodashi.sinaapp.com/mef_autorefreshcatalog.html

概述

MEF总结起来就是从目录中把有导出的部件导入到容器中,再根据类型把容器中的东西取出来用。

目录类的继承关系

.net 4.5
System.Object
System.ComponentModel.Composition.Primitives.ComposablePartCatalog
System.ComponentModel.Composition.Hosting.AggregateCatalog
System.ComponentModel.Composition.Hosting.ApplicationCatalog
System.ComponentModel.Composition.Hosting.AssemblyCatalog
System.ComponentModel.Composition.Hosting.CompositionScopeDefinition
System.ComponentModel.Composition.Hosting.DirectoryCatalog
System.ComponentModel.Composition.Hosting.FilteredCatalog
System.ComponentModel.Composition.Hosting.TypeCatalog
.net 4.0
System.Object
System.ComponentModel.Composition.Primitives.ComposablePartCatalog
System.ComponentModel.Composition.Hosting.AggregateCatalog
System.ComponentModel.Composition.Hosting.AssemblyCatalog
System.ComponentModel.Composition.Hosting.DirectoryCatalog
System.ComponentModel.Composition.Hosting.TypeCatalog
.net 4.5里面的目录类型比.net 4.0多出了很多,可以查阅msdn。

需求场景

描述这样一种需求:有一个不能随便重启的程序使用MEF完成了插件机制,插件以dll的形式放在Add-Ins目录下,启动后从Add-Ins目录加载插件,然后在程序运行过程中,插件需要增加、更新、删除等操作,希望不重启程序但是又能用新的插件。
如果只使用MEF,会出现如下问题:
1.向Add-Ins目录增加插件A.dll,程序不会自动对此目录的改变做出响应,所以也就不能发现插件A.dll。
2.删除和更新Add-Ins目录下插件B.dll,会报出“文件正在被其他进程使用,不能删除”。

解决方案

首先我们要解决第一个问题,增加一类自动刷新的目录。
public class AutoRefreshDirectoryCatalog : DirectoryCatalog
  {
      public bool NotifyOnDirectoryChanged { get; private set; }
      public AutoRefreshDirectoryCatalog(string path)
          : this(path, false)
      { }
      public AutoRefreshDirectoryCatalog(string path,
          bool notifyOnDirectoryChanged)
          : base(path)
      {
          this.NotifyOnDirectoryChanged = notifyOnDirectoryChanged;
          if (notifyOnDirectoryChanged)
          {
              FileSystemWatcher fsw = new FileSystemWatcher(path, "*.dll");
              fsw.EnableRaisingEvents = true;
              fsw.Created += (s, e) => {Refresh();};

              fsw.Changed += (s, e) => {Refresh();};

              fsw.Deleted += (s, e) => {Refresh();};

}
}
}

下一篇将会解决第二个问题。
参考资料:
【1】http://msdn.microsoft.com/zh-cn/library/system.componentmodel.composition.primitives.composablepartcatalog%28v=vs.100%29.aspx
【2】http://www.silverlightwpf.fr/post/2010/09/08/MEF-et-DirectoryCatalog-Refresh.aspx



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值