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



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

每个插件都是一个包含多个dll的目录,这些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将为我的所有插件提供服务。

那么,在不创建新的应用程序域的情况下,我如何在隔离的情况下运行每个插件?

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

我在网上读到了一些解决方案:

  1. 为每个插件创建一个新的应用程序域-我不想去那里

  2. 使用<dependentAssembly>-当我第一次尝试它时,它不起作用,我不希望我的插件服务器在每次程序集依赖性版本更改时都得到更新。另外,我希望能够运行不同程序集版本的插件。

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

有人比我更好的主意吗?运行隔离插件的推荐方法是什么?

您需要对程序集进行签名,并确保每个程序集的程序集版本不同。请参阅以下答案:C#将不同版本的程序集加载到同一项目

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

最新更新