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

Ami*_*ich 5 c# plugins mef appdomain isolation

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

每个插件都是一个具有多个dll的目录,它实现了一个特定的接口.

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

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

Plugin1
     ----> Entities 1.0.0.1

Plugin2
     ----> Entities 1.0.0.2
Run Code Online (Sandbox Code Playgroud)

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

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

我猜错误的发生是因为我在相同的AppDomain中运行代码,而第一个Entities.dll加载的是我的所有插件.

那么,如何在创建新的appdomain的情况下运行隔离的每个插件?

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

我在网上看过几个解决方案:

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

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

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

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

Mik*_*rry 3

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

CLR 确实支持将多个版本的强命名程序集加载到同一个 AppDomain 中。不过,只有当您的程序集具有强名称并且每个程序集的版本都不同时,这才有效。