推荐使用具有不同版本的依赖关系dll的插件的方法是什么?

时间:2016-05-25 08:06:57

标签: c# plugins mef appdomain isolation

我有一个 WCF 插件服务,它通过 MEF 加载插件并运行它们。

每个插件都是一个包含多个dll的目录,用于实现特定的接口。

我使用MEF(DirectoryCatalog)在同一AppDomain中加载所有插件,并以通用方式运行它们(使用反射)。

现在假设我有两个带有dll依赖项的插件:

Plugin1
     ----> Entities 1.0.0.1

Plugin2
     ----> Entities 1.0.0.2

我在1.0.0.2中添加了一些新实体。

当我运行插件时,我得到一个零星的错误,即新实体不存在于dll中。

我想错误的发生是因为我在同一个AppDomain中运行代码,并且加载的第一个Entities.dll是将为我的所有插件提供服务的代码。

那么,我怎样才能以隔离的方式运行每个插件,不用创建新的appdomain?

有什么方法可以告诉 MEF 以某种方式加载所有插件依赖项?

我已经在网上了解了几个解决方案:

  1. 为每个插件创建一个新的appdomain - 我不想去那里

  2. 使用<dependentAssembly> - 这在我第一次尝试时并没有用,我不希望我的插件服务器更新每个程序集依赖项版本更改。另外,我希望能够运行具有不同组件版本的插件。

  3. 用snk签署程序集 - 我还没有尝试过,我不确定这个解决方案是否有效。框架将如何知道他需要加载不同的程序集?这与具有不同版本的装配有何不同?我是否需要以某种方式配置我的服务才能使其正常工作?

  4. 有人对我有更好的想法吗? 推荐使用隔离插件的方法是什么?

1 个答案:

答案 0 :(得分:3)

您需要对程序集进行签名并确保每个程序集的程序集版本不同。请参阅以下答案:C# Load different versions of assembly to the same project

  

CLR支持将多个版本的强名称程序集加载到同一个AppDomain中。仅当您的程序集具有强名称且每个程序集的版本与另一个版本不同时,这才有效。