MEF - 插件及其引用的程序集

Posted

技术标签:

【中文标题】MEF - 插件及其引用的程序集【英文标题】:MEF - Plugins and their referenced assemblies 【发布时间】:2014-09-23 10:02:24 【问题描述】:

对于我正在构建的应用程序,我们使用 MEF 创建插件系统。每个插件都是用它自己的依赖项(引用)构建的,最后复制到应用程序知道的指定文件夹中并查找插件。顺便说一句,复制是通过构建后脚本完成的。

问题是我们有单独的插件,它们可能引用同一程序集的不同版本。为此,我们的想法是,我们应该让每个插件在插件文件夹中创建自己的文件夹,以防止程序集相互覆盖。但是我们得到了异常,因为 AppDomain 不知道要查找插件所需的引用。我们确实发现我们可以提供带有探测的路径。但这意味着必须在 app.config 中注册每个插件。我们希望以更通用的方式做到这一点。

该应用程序不是 Web 应用程序。这是一个将作为服务器的控制台应用程序,我们称之为外壳。 shell 不知道这些程序集,而只有 shell 的插件知道这些程序集。这些插件也不为 shell 所知,而是由 MEF 发现的。唯一将外壳和插件粘合在一起的是接口。

我真的被这个项目困住了,如果我能在这件事上得到任何帮助,我将不胜感激。这是一个 .Net 框架问题,而不是 MEF 问题,但我想我会简要介绍一下情况。

【问题讨论】:

看看BuildManager.AddReferencedAssembly方法和PreApplicationStartMethodAttribute。在它的帮助下,您可以在生命周期的早期将程序集添加到应用程序的一组引用程序集中。我不确定他们是否可以帮助您使用引用同一程序集的不同版本的不同插件。 感谢伊利亚的回复。该应用程序不是 Web 应用程序。这是一个将作为服务器的控制台应用程序,我们称之为外壳。 shell 不知道这些程序集,而只有 shell 的插件知道这些程序集。这些插件也不为 shell 所知,而是由 MEF 发现的。唯一将外壳和插件粘合在一起的是接口。 【参考方案1】:

使用探测路径的替代方法是使用AppDomain.AssemblyResolve event。每当 .NET 无法加载程序集时,它将引发此事件,这将允许您自己定位和加载程序集。它可能不是最干净的解决方案,但它确实为您提供了将程序集置于适合您的任何结构的灵活性。

【讨论】:

感谢您的回复!一旦测试,我将对此进行调查并更新答案。

以上是关于MEF - 插件及其引用的程序集的主要内容,如果未能解决你的问题,请参考以下文章

MEF 和 ShadowCopying DLL,以便我可以在运行时覆盖它们

MEF 的 DirectoryCatalog 是如何工作的?

如何找出哪个程序集拥有从给定的“编译”对象及其声明语法引用中获得的给定 ISymbol 对象?

加载程序集时发生冲突的依赖项

加载插件时,提示反射异常,调用的目标出现异常,该模块应包含一个程序集清单

解决程序集,模糊方式