运行具有不同版本的依赖关系dll的插件的推荐方法是什么?
我有一个WCF插件服务,通过MEF加载插件并运行它们。
每个插件都是一个具有多个dll的目录,它实现了特定的接口。
我使用MEF( DirectoryCatalog
)在同一个AppDomain中加载所有插件,并以通用方式运行它们(使用reflection)。
现在假设我有两个带有dll依赖项的插件:
Plugin1 ----> Entities 1.0.0.1 Plugin2 ----> Entities 1.0.0.2
我在1.0.0.2中添加了一些新实体。
当我运行插件时,我得到一个偶然的错误,即新的实体在dll中不存在。
我猜错误发生,因为我在相同的AppDomain中运行代码,加载的第一个Entities.dll
是将为我的所有插件提供服务的那个。
那么,如何在不创建新的appdomain的情况下运行隔离的每个插件?
有什么方法可以告诉MEF以某种方式加载所有插件依赖项?
我在网上看到了几个解决方案:
-
为每个插件创建一个新的appdomain – 我不想去那里 。
-
使用
– 当我第一次尝试它时,这不起作用,我不希望我的插件服务器更新每个程序集依赖项版本更改。 另外,我希望能够运行具有不同组件版本的插件。
-
用snk签署程序集 – 我还没有尝试这个,我不确定这个解决方案是否有效。 框架将如何知道他需要加载不同的程序集? 这与具有不同版本的程序集有何不同? 我是否需要以某种方式配置我的服务才能使其工作?
有没有人对我有更好的想法? 什么是运行隔离插件的推荐方法?
您需要对程序集进行签名并确保每个程序集的程序集版本不同。 请参阅以下答案: C#将不同版本的程序集加载到同一项目中
CLR支持将多个版本的强命名程序集加载到同一AppDomain中。 仅当您的程序集具有强名称且每个程序集的版本与另一个版本不同时,这才有效。