C#的MEF中动态删除出口的问题

Yoxi 2011-07-15 02:14:45
小弟正在学习C#,刚看了有关MEF的一章,有一点疑问。
书上说可以动态删除出口,例如:

ComposablePart part = AttributedModelServices.CreatePart(ext);
var batch = new CompositionBatch();
batch.RemovePart(part);
container.Compose(batch);

我不太清楚这样做了之后,实际发生了些什么?程序具体做了哪些工作?这样做有什么意义?
希望有人能解答下我的问题。
...全文
143 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
youchunnnn 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

MEF已经是.net framework中的标准功能,而且silverlight中也支持。
[/Quote]说了这么多能不能解决一下楼主的问题啊,动态删除一个插件。我就遇到这样的问题,加载完后DLL文件一直被占用,没法删除插件啊
Yvan_Hou 2012-02-10
  • 打赏
  • 举报
回复
我也想知道如何删除出口,卸载某个插件
Yvan_Hou 2012-02-10
  • 打赏
  • 举报
回复
楼主的问题好像还是没有解决
Yoxi 2011-07-18
  • 打赏
  • 举报
回复
谢谢楼上的解答!
  • 打赏
  • 举报
回复
给你举个例子吧。比如说你需要收集项目中许多的方法,然后在一个测试程序中统一地调用这些方法。可以定义一个类型
public class Bag
{
[ImportMany("测试用例")]
public IEnumerable<Action> _testcases;
}


而你的项目中到处散布这类似这样的代码
public class ABC
{
[Export("测试用例")]
public static void test1()
{
....
}

[Export("测试用例")]
public static void test20()
{
....
}

那么你只要写这样两条代码
var bg = new Bag();
var catlog = new AggregateCatalog(new DirectoryCatalog(@".\"), new DirectoryCatalog(@".\", "*.exe"));
new CompositionContainer(catlog).SatisfyImportsOnce(bg);
这时候整个项目中凡是以.dll、.exe后缀的文件中所有的标记为测试用例的方法,就被MEF自动实例化为委托并且装进bg.__testcases集合中了。你就可以随便挑一些委托(或者全部委托)来执行它们。

而你无需明显地自己写反射代码。

并且不仅仅可以反射当前目录下,也可以反射其它应用程序发布的目录,也就是说把其它应用程序发布的代码动态地装载为当前应用程序的一部分来执行。就好像在Excel中可以调用Word似地。

我这里只是举了一个最简单的例子。不仅仅可以Import方法,也可以针对属性、对象。比如你声明要导入对象类型,那么一旦调用MEF,它就给你搜索目标应用程序下所有的可以导入的类型,并且分别实例化为对象了。这完全代替了自己写反射代码。
  • 打赏
  • 举报
回复
有了MEF,在大的控制框架上,你几乎就不需要自己写反射代码。这就是他的作用。如果没有大规模用过反射,这个很难以理解。
Yoxi 2011-07-17
  • 打赏
  • 举报
回复
再UP
  • 打赏
  • 举报
回复
MEF已经是.net framework中的标准功能,而且silverlight中也支持。
Yoxi 2011-07-16
  • 打赏
  • 举报
回复
没有人知道么?
Yoxi 2011-07-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xuexiaodong2009 的回复:]
没听说过MEF,落伍啊
[/Quote]
其实跟插件框架差不多
xuexiaodong2009 2011-07-15
  • 打赏
  • 举报
回复
没听说过MEF,落伍啊

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧