我有一个可以使用插件自定义的基于 MEF 的应用程序。此应用程序有几个导入的部分,我想在用户决定删除该插件时在运行时删除其中的一些(以便能够删除包含它们的 .dll)。
CompositionBatch 可以满足我的需要,但它需要 ComposablePart
实例作为 RemovePart()
的输入参数方法,我只有实现 ISomething 接口(interface)的普通对象,或 AggregateCatalog
中的 ComposablePartDefinition
实例。所以我的问题是:
- 如何找到 ComposablePart 表示导入的实例 我想摆脱的对象?
- 或者 或者:我如何获得列表 属于的 ComposablePart 对象的 到某个 .dll?
我会使用如下内容:
var parts = Container.Catalog.Parts
.Where(p => iDontNeed(p))
.Select(p => howDoIConvertComposablePartDefinition2ComposablePart(p));
var batch = new CompositionBatch();
parts.ToList().ForEach(part => batch.RemovePart(part));
谢谢
最佳答案
how do I get the list of ComposablePart objects that belong to a certain .dll?
要从特定程序集中删除零件,您只需调用 AggregateCatalog.Catalogs.Remove
即可删除该 AssemblyCatalog
。您必须设计零件以允许 Recomposition虽然。
但是,这不会帮助您删除插件程序集。该程序集仍将被加载,您不能在加载时更改或删除 .NET 程序集。在不停止进程的情况下卸载程序集的唯一方法是卸载程序集加载到的AppDomain
。但是,如果您为插件引入一个单独的 AppDomain
,那么您基本上必须通过远程处理等方式与这些插件进行通信。
停止应用程序、删除插件程序集并重新启动可能更简单、更安全、更有效。
编辑:实际上,有一种方法可以在不停止进程或卸载整个应用程序域的情况下删除插件 dll 文件:您可以启用 shadow copying应用程序域指示 .NET 在加载程序集之前制作副本。副本将保持加载状态,但至少您可以删除或替换原始文件。
关于c# - 如何在运行时删除 MEF 插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5395817/