我用MEF和FileSystemWatcher编写了一个简单的插件管理器类来自动刷新插件,但我听到有人说为了能够动态添加和删除程序集(插件),我们还需要使用AppDomain。
任何人都可以指导我们何时需要同时使用AppDomain和MEF(特别是对于我的插件管理器场景)?
他们之间有什么关系?
答案 0 :(得分:1)
简而言之,当您要覆盖应用程序正在使用的.dll时,需要AppDomain,并且AppDomain必须指定ShadowCopyFiles = "true"
。
卷影复制文件意味着AppDomain会将.dll复制到临时目录并从该临时目录加载它们,以便原始的.dll可以被覆盖。
不幸的是,除非卸载包含它们的AppDomain,否则无法卸载加载到任何AppDomain的程序集。
考虑到这一点,刷新插件很困难,因为您必须A)卸载整个AppDomain,它必须卸载该AppDomain中的所有其他.dll,或者B)允许加载相同.dll的新版本增加应用程序的内存占用量。第二个选项还要求您的插件.dll具有强名称和不同的版本号,以便MEF识别差异并加载新的.dll。