为什么AppDomain与使用MEF实现的插件管理器相关

时间:2016-05-07 09:53:16

标签: c# mef appdomain

我用MEF和FileSystemWatcher编写了一个简单的插件管理器类来自动刷新插件,但我听到有人说为了能够动态添加和删除程序集(插件),我们还需要使用AppDomain。

任何人都可以指导我们何时需要同时使用AppDomain和MEF(特别是对于我的插件管理器场景)?

他们之间有什么关系?

1 个答案:

答案 0 :(得分:1)

简而言之,当您要覆盖应用程序正在使用的.dll时,需要AppDomain,并且AppDomain必须指定ShadowCopyFiles = "true"

卷影复制文件意味着AppDomain会将.dll复制到临时目录并从该临时目录加载它们,以便原始的.dll可以被覆盖。

不幸的是,除非卸载包含它们的AppDomain,否则无法卸载加载到任何AppDomain的程序集。

考虑到这一点,刷新插件很困难,因为您必须A)卸载整个AppDomain,它必须卸载该AppDomain中的所有其他.dll,或者B)允许加载相同.dll的新版本增加应用程序的内存占用量。第二个选项还要求您的插件.dll具有强名称和不同的版本号,以便MEF识别差异并加载新的.dll。